Retries aren't an edge case. They're the default.
Your client times out, the network drops an ACK, mobile connection hiccups. The request goes out again. Without idempotency keys, that retry charges the card twice.
Fix: client sends a unique key per operation. Server stores it, dedupes, returns the first result on repeats. Retry becomes a no-op.
One header. That's the whole thing.