Invoices
First-class invoices with their own numbering, branded PDFs, tax breakdowns, hosted payment pages, and buyer-driven ACH via Plaid.
A Pact invoice is a first-class object, not a line on a deal. It has its own number, a branded PDF, a tax breakdown, and its own refund state — with all money tracked in integer cents.
Where invoices live
Manage invoices at /sales/invoices. Each invoice also has a public hosted page at /p/invoice/{id} that you can share directly with a buyer.
Numbering
Every workspace gets its own monotonic invoice numbering, with a default prefix of INV-. Numbers never reuse or skip arbitrarily — they climb in order, which keeps your records clean for accounting and audit.
Lifecycle
An invoice moves through a defined status lifecycle, and every transition is recorded in an append-only event ledger.
| Status | Meaning |
|---|---|
| draft | Created, not yet sent |
| sent | Delivered to the buyer |
| viewed | Buyer opened the hosted page |
| paid | Payment settled |
| void | Cancelled, no longer payable |
Operators can send an invoice, void it, and download the branded PDF at any point.
Getting paid
Paying an invoice returns a hosted Stripe checkout URL. The buyer completes payment on Stripe's hosted page.
The public hosted invoice page also offers buyer-driven ACH through Plaid Link: the buyer connects their bank and presses pay. ACH then settles asynchronously, so a paid status may follow the payment by a short delay.
Pact never debits directly
Whether the buyer pays by card via Stripe or by bank via Plaid ACH, Pact never auto-debits. The buyer initiates every payment. Stripe and Plaid credentials are entered through the in-app credential UI — never as environment or deploy secrets.
Money in cents
Every amount on an invoice — subtotal, tax, total, refunds — is stored in integer cents, so rounding never drifts.