PPactDocs
Sales

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 machineValuesDriven by
Financial statuspending → paid, or cancelledStripe
Fulfillment statusunfulfilled → provisioning → fulfilling → fulfilled → closed, or cancelledOperator 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.

What's next