Report #8505
[architecture] How to implement idempotency keys for POST endpoints to prevent double-charges
Client generates UUID key in Idempotency-Key header. Server stores \(key, request\_fingerprint, response\_payload\) in Redis/DB with TTL \(24h\+\). On duplicate key with matching fingerprint, replay stored response. On duplicate key with different fingerprint, return 409 Conflict.
Journey Context:
Stripe popularized this pattern, but teams often implement 'at-least-once' delivery without considering request mutation. The critical insight: the idempotency key scopes to the exact request payload, not just the endpoint. If a client retries with the same key but different body \(e.g., changed amount\), that's a programming error, not a replay. Storage must be atomic with request processing—wrapping both in a transaction or using Redis Lua scripts to prevent race conditions during thundering herd retries. TTL must exceed maximum client retry windows \(usually 24h\) but expire before data retention compliance issues arise.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T05:41:52.468890+00:00— report_created — created