Invoices
Invoices are how you bill customers and track what they owe. Each invoice posts a double-entry accounts receivable journal entry when finalized and moves through a clear lifecycle from draft to paid. It's built for operators and bookkeepers who need partial payments, bank-transaction matching, aging visibility, and clean reconciliation — not just a PDF.
Key capabilities
- Create invoices from line items (product variants or custom items), with per-line revenue and inventory deduction
- AI extraction from pasted text, PDFs, images, Excel, or CSV via Upload & Extract (drafts for review)
- Bulk CSV import and Batch Create across multiple customers in one action
- Finalize to lock the invoice, assign a number, and post AR; void to post a reversing entry
- Email delivery with optional PDF attachment, custom message, CC-to-sender, and a 5-minute duplicate-send cooldown
- Partial payments and split payments (one bank deposit applied across multiple invoices) via Record Payment
- Payment-matching engine that auto-links high-confidence bank transactions and surfaces the rest as suggestions
- AI Deposits sidebar of likely customer deposits to apply against open invoices
- Outstanding and overdue metrics, plus an AR Aging report with Current / 1-30 / 31-60 / 61-90 / 91+ buckets
- Cash Receipts tab for weekly deposit reconciliation, with dismiss/restore of non-deposit transactions
- Credit memos applied to an invoice reduce its balance due alongside payments
- Optional Stripe-hosted PDF and online payment link for finalized invoices
How it works
An invoice starts as a draft, becomes open when finalized (posting AR), then closes as payments and credits are applied — partially first, then fully paid.
flowchart LR
draft["Draft"] --> open["Open (finalized)"]
open -->|"partial payment / credit"| partial["Partially paid"]
open -->|"full payment"| paid["Paid"]
partial -->|"remaining payment"| paid["Paid"]
open -->|"cancel"| void["Void"]How to use it
- Open Invoices (
/books/invoices) and click Create Invoice. - Select a customer — payment terms and contact info default from the customer record.
- Add line items (product variants or custom items with a description and amount) and set a due date.
- Save as a draft to keep editing, or Finalize to lock it, assign a number, and post the AR journal entry.
- Click Send to email the invoice (optionally attach the PDF, add a custom message, and CC yourself).
- Record money received with Record Payment on the invoice, linking a bank transaction and an allocated amount.
- Switch to the AR Aging tab to see who's overdue, and Cash Receipts to reconcile weekly deposits.
- To pull invoices from documents, use Upload & Extract (AI), Bulk Import (CSV), or Batch Create.
Pro tips
- Line items, due date, and customer can only change while the invoice is a
draft— finalize locks them, so void and re-create to fix a finalized invoice. - Run payment matching with auto-match on to instantly link transactions scoring ≥ 0.85; review the rest from the suggestions list (medium-confidence default threshold is 0.50).
- One deposit can pay several invoices: split it by recording a partial allocation against each invoice until the transaction is fully applied.
- Removing a payment recalculates status automatically — it reverts to
partially_paidif other payments remain, or back toopenif none do. - Applying a credit memo counts toward an invoice's balance just like a payment, and can flip it to fully paid on its own.
- Due dates are validated to be in the future and within 180 days; the AR Aging buckets key off the due date, so set it accurately.
- PDF and hosted payment links come from Stripe and only exist for finalized, Stripe-linked invoices — fetch a fresh URL when downloading since they expire.
In-depth guide
Invoice status
The balance due is the total minus payments and credit-memo applications, and is forced to 0 for terminal states.
| Status | Meaning |
|---|---|
| Draft | Not finalized; editable and deletable |
| Open | Finalized, numbered, AR posted, awaiting payment |
| Partially paid | Some payment/credit applied, balance remaining |
| Paid | Fully paid via recorded bank payment(s) or credits |
| Paid (Stripe) | Fully paid through Stripe |
| Void | Cancelled; reversing journal entry posted |
| Uncollectible | Written off as uncollectible |
Overdue is a virtual status: any unpaid, non-void invoice whose due date has passed.
Lifecycle & capabilities
- A draft can be finalized (→
open) or deleted; only drafts can be deleted. - An
openinvoice can be voided, paid, or marked delivered; voiding is only allowed fromopen. - Payments can be recorded against
open,partially_paid, ormanual_paidinvoices. - Voided invoices cannot be un-voided — create a new invoice instead.
Payments, partial & split
- Record — payments link a bank transaction to an invoice with an allocated amount and an effective payment date.
- Split — a single transaction can be split across multiple invoices (different rows, different amounts).
- Partial — a single invoice can receive multiple partial payments.
- On add — updates
total_paidand status; full payment of a Stripe-linked invoice also notifies Stripe.
Payment matching & suggestions
- Scan — the matching engine scans unallocated income transactions against open invoices and scores candidates.
- Auto-match on — matches at confidence ≥ 0.85 create payment records automatically.
- Medium confidence — matches (default floor 0.50) become suggestions you can accept or reject.
- Suggestion statuses —
pending,accepted,rejected, andexpired. - AI Deposits panel — lists posted income transactions with unallocated balances as likely customer deposits.
Accounting impact
- Finalizing — posts a double-entry journal: debit Accounts Receivable, credit Invoice Sales (revenue).
- With unit costs — also books COGS against Inventory.
- Voiding — posts a mirror entry with debit/credit swapped, preserving an audit trail.
- Timing — the finalization entry is created immediately, so it's available right away.
Reports & reconciliation
- Metrics: total outstanding (sum of open invoice totals) and total overdue.
- AR Aging: per-customer balance due grouped into Current, 1-30, 31-60, 61-90, and 91+ days past due, with per-invoice drill-down.
- Cash Receipts: weekly deposits vs. amounts applied to invoices and bills, highlighting unapplied remainders; dismiss transactions that aren't customer deposits (and restore them later).
AI & automation
- Extraction — AI can extract draft invoices from documents (per-file ≤ 20 MB; text/CSV truncated at 50,000 chars; Excel flattened to ~100,000 chars) and fuzzy-match customers by name at ≥ 80% similarity.
- AR collections — a separate workflow scans overdue invoices, picks a reminder tone (friendly, firm, or final) by days overdue, and drafts collection emails for approval, optionally auto-sending friendly reminders.
Limits & edge cases
- Invoice lists are paginated (default 20, max 100); filter by status, customer, product, variant, or search.
- Bulk-finalize runs in the background to avoid timeouts, so freshly imported invoices may appear as drafts momentarily.
- Sending the same invoice within 5 minutes is blocked to prevent duplicate emails.
Start free and send your first invoice today.