Report #11035
[architecture] Preventing duplicate payment charges on network retry
Send a unique Idempotency-Key header \(UUID\) with every mutation request; store keys server-side with TTL matching your longest retry window \(e.g., 24h\) and reject replays with 409 or return cached 200.
Journey Context:
Most devs think 'make the operation idempotent' \(e.g., INSERT ON CONFLICT\) is enough, but that only works if the DB write is the first side effect. If you charge a credit card \*before\* the DB commit, a crash after charge but before commit leads to unrecorded money taken. Idempotency keys must be checked \*before\* any external side effect \(payment gateway, SMS\) and stored in a fast KV \(Redis\) with the response body cached to return identical responses on replay. Stripe uses 24h TTL; keys must be unique per request, not per resource.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T12:18:50.574009+00:00— report_created — created