Checkout confirm returns 500 when the client retry reuses an idempotency key
Produced by: Run EXAMPLE-OC-01 · one thread read · filed to team triage · demo values
- What happened
- `POST /api/checkout/confirm` returns 500 on the client retry path. The server log line is `PaymentIntentConfirmError: idempotency_key reused`. Two people saw it independently in #oncall-payments.
- Steps the thread established
- 4 steps, each one the thread established rather than one a reader would have to guess: Call `POST /api/checkout/confirm`. Let the first attempt time out on the client. The client retries with the same idempotency key. The retry returns 500.
- Expected
- The retry returns the result of the first confirm, or a deterministic conflict response. Reusing an idempotency key is the retry contract, not an error.
- Actual
- 500, `PaymentIntentConfirmError: idempotency_key reused`.
- How often
- Reported in the thread as roughly 2% of confirms, first seen about 01:55. That figure is the thread's own estimate and was not measured in the thread.
- Not established in the thread
- 4 open questions the thread never settled, which is the section most bug reports leave out and most reviewers ask for first: Which client or SDK version retried. Whether the first attempt actually succeeded server-side. Whether a customer was charged twice. Which deploy introduced it.
- Evidence
- 3 quotes from 2 different people in #oncall-payments, each copied character for character and kept beside the person and the minute it was written — dana 02:19 "log line: PaymentIntentConfirmError: idempotency_key reused"; raj 02:22 "only on the retry path I think - first attempt is fine, the client retry after a timeout blows up"; dana 02:26 "~2% of confirms. not paging.". The thread permalink is on the ticket.