PPactDocs
Sales

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.

StatusMeaning
draftCreated, not yet sent
sentDelivered to the buyer
viewedBuyer opened the hosted page
paidPayment settled
voidCancelled, 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.

What's next