Refunds & chargebacks
Full or partial refunds with approval gating, Stripe execution, and ASC 606 revenue reversal — plus chargeback handling.
Refunds reverse money and revenue together, with a human in the loop for anything material. Pact ties the Stripe action, the invoice state, and the accounting reversal into one controlled flow.
Who can refund
Refunds run against an invoice and can be full or partial. They are admin/owner only — no other role can move money back to a buyer.
Approval gating
Refunds are human-in-the-loop and gated. When the approval workflow is enabled and a refund exceeds the configured threshold, the request returns pending-approval and no money moves.
The refund stays paused until a manager approves it and the refund is retried. Only then does Pact execute.
No money moves until approved
A gated refund over the threshold does nothing financially until a manager approves and the refund is retried. This is deliberate — large reversals never execute on a single person's action.
What a refund does
When a refund executes, it ties together three actions:
- Optionally executes a Stripe refund for the amount.
- Flips the invoice's refund state to reflect what was returned.
- Reverses revenue under ASC 606 — reversing recognized revenue as contra-revenue and cancelling any remaining deferred revenue.
This keeps your books correct: you don't carry revenue you've given back, and you don't leave deferred revenue hanging for value that's no longer owed.
Chargebacks and disputes
Chargebacks and disputes are handled two ways:
| Path | How it works |
|---|---|
| Manual | An operator records the dispute and resolution directly. |
| Automatic | The Stripe dispute webhook drives the chargeback into Pact. |
Either way, the dispute is reflected against the invoice so the financial picture stays accurate.
Credentials live in-app
Any Stripe action a refund or dispute triggers uses credentials entered through the in-app credential UI — never environment or deploy secrets.