Go-live checklist
Keys and workspaces
- Production uses its own workspace. Staging uses a different one, with its own key and webhook endpoints.
- The production API key, webhook secret and checkout secret live only in your server's secret store: not in a browser bundle, a mobile app or a repository.
- Someone other than the developer knows how to revoke and replace the key (Console → Developers → API keys).
Money checks in your code
- Every fulfilment path checks
network === "mainnet"(orlivemode === true). - You grant only after an authenticated read (
GET /v1/payments/:idorGET /v1/checkout/sessions/:id), never from the browser, a public endpoint ormetadataalone. - You check
status:confirmedoroverpaidfor a payment (plusunderpaidif you credit partial payments),completedfor a session. - For variable amounts, you credit
receivedAmountwith decimal arithmetic, as a high-water mark (credit-topups). - For direct payments you validate amounts yourself (minimum, maximum, positive). For a custom-amount product,
minAmountandmaxAmountare set on the product, and your create path shows the user theminAmountfrom the400body instead of a generic error. - Every payment or session create sends an
idempotencyKeytied to your own order, and a key is never reused for a different amount.
Chains
- Every chain and token you offer is marked live in
supported-chains, and your allow-list is on the server. - You offer stablecoins for dollar prices, not native coins.
- Your payment screen shows the exact amount, the token and the chain, and warns that the address takes one transfer only.
Webhooks
- The endpoint is HTTPS and verifies
x-thru-signatureover the raw body. - It records event ids and tolerates duplicates and out-of-order delivery.
- It answers
2xxonly after committing, and5xxon failure. - Its filter matches the events you handle:
checkout.*for fixed-price sessions,payment.*for custom-amount sessions and direct payments. If you subscribe to both families, a sale cannot be granted twice. - It ignores deliveries with
data.test === true. - Someone watches for
failedandundeliverableevents in Developers → Events.
Checkout sessions (if you use them)
- Your production return origins are registered (Developers → Checkout), using https.
- Your return page
awaitsverifyThruReturnand then retrieves the session before granting. - You do not create sessions for invoices; the hosted page cannot show them yet.
- For a custom-amount product, your crediting code reads
checkoutSessionon the payment, creditsreceivedAmountas a high-water mark per session, and alerts on a payment that carries nocheckoutSession(credit-topups).
Settlement and reconciliation
- A settlement address is set for every chain and network you accept (Treasury → Settlement). If you accept native SUI, someone withdraws it from Treasury, because it is not forwarded automatically.
- You receive
settlement.*events, or check Treasury, so an address change you did not make is noticed during its cool-down. - A reconciliation job re-reads recent unfinished orders every few minutes.
- Support knows what to do when a customer pays late, pays twice, or pays on the wrong chain (
credit-topups, "What happens when…").
A final test
- One small real payment on each chain you offer, end to end: create, pay, webhook, grant, and funds arriving at your settlement address.