The states
- Active
- Terminal
- Needs attention
These progress on their own. Wait for a webhook.
Two distinctions worth internalising
payment_received is not settling. The user’s obligation ends and our work begins at different moments. Release the user from your checkout at payment_received; do not hold them until settled.
settled means the ledger credit exists. Not that a transaction hash appeared. If you are deciding whether to grant a user something, settled is the only state that answers the question.
Underpayment
Crypto payers underpay routinely, most often because a sending exchange deducts its fee from the amount. You configure what happens:Overpayment needs no policy. The intent settles for the required amount and the excess is refunded automatically.
Refunds
Refunds are a first-class operation, not a support process. Automatic on expiry with funds received, on execution failure, on overpayment, and on compliance rejection. You can also initiate one withPOST /funding_intents/{id}/refunds from payment_received, partially_settled, undeliverable, or failed.
Refunds are always compensating ledger entries. Nothing is ever reversed in place, so the audit trail stays intact.
