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

  1. Open Invoices (/books/invoices) and click Create Invoice.
  2. Select a customer — payment terms and contact info default from the customer record.
  3. Add line items (product variants or custom items with a description and amount) and set a due date.
  4. Save as a draft to keep editing, or Finalize to lock it, assign a number, and post the AR journal entry.
  5. Click Send to email the invoice (optionally attach the PDF, add a custom message, and CC yourself).
  6. Record money received with Record Payment on the invoice, linking a bank transaction and an allocated amount.
  7. Switch to the AR Aging tab to see who's overdue, and Cash Receipts to reconcile weekly deposits.
  8. 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_paid if other payments remain, or back to open if 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 open invoice can be voided, paid, or marked delivered; voiding is only allowed from open.
  • Payments can be recorded against open, partially_paid, or manual_paid invoices.
  • 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_paid and 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 statusespending, accepted, rejected, and expired.
  • 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.