Quotes & orders
Turn an accepted quote into an order with decoupled financial and fulfillment states, payment terms, and a full event ledger.
A quote captures what you've offered; an order tracks what happens next. Accepting a quote moves the deal forward without losing the audit trail behind it.
From quote to order
Work with quotes at /sales/quotes and orders at /sales/orders. Accepting a quote creates an order, and best-effort creates an invoice alongside it.
If a quote has lapsed, Pact refuses it at the stale price rather than honoring expired terms. The buyer sees the current pricing instead of a number you no longer stand behind.
Accepting closes the loop
Accepting a quote produces an order immediately and attempts to generate the matching invoice in the same step, so finance has something to act on right away.
Two independent state machines
An order carries two separate statuses that are deliberately decoupled, so a billing event never silently changes operational state, and vice versa.
| State machine | Values | Driven by |
|---|---|---|
| Financial status | pending → paid, or cancelled | Stripe |
| Fulfillment status | unfulfilled → provisioning → fulfilling → fulfilled → closed, or cancelled | Operator action |
Fulfillment advances only when an operator explicitly moves it forward. An invalid transition — skipping a step or moving backward — is rejected, so the timeline always reflects reality.
The order event ledger
Every financial and fulfillment change is written to an append-only, per-order event ledger. Nothing is overwritten. When you need to know who changed what and when, the ledger is the record of truth.
Payment terms
Each order carries payment terms of 0, 15, 30, 60, or 90 days, defaulting to 30. That single choice seeds two things at once:
- The invoice due date.
- The revenue-recognition start.
Setting terms once keeps billing and accounting aligned without re-entering the same date twice.
Getting paid
Marking an order paid — manually, or automatically through the Stripe webhook — closes the linked deal as won. The win and the payment stay in sync.
Pact never auto-debits
Payment runs through a hosted Stripe checkout. Pact never pulls funds from a card on its own — the buyer completes payment on Stripe's hosted page. Stripe credentials are entered through the in-app credential UI, never as environment or deploy secrets.