Report #16830
[architecture] Duplicate API requests causing double charges or side effects on retries
Implement idempotency keys scoped to the entity \(user/tenant\) with a 'processing' state and short TTL; reject or poll on collision rather than failing silently.
Journey Context:
Simply adding an Idempotency-Key header is insufficient. Teams often store keys globally, creating collision risks between users, or they store only completed results, causing race conditions when a retry arrives while the first request is still in-flight \(the 'in-process gap'\). The correct pattern is to write the key to a lookup store \(Redis/Postgres\) with status 'IN-PROCESS' before beginning the transaction, using a short TTL \(e.g., 5 minutes\). If a duplicate arrives, return 409 Conflict or a 'status check' endpoint. Only mark 'COMPLETED' after full commit. This handles client retries safely without locking the entire user account.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T03:47:43.058292+00:00— report_created — created