Decline code
Duplicate Transaction
Stripe declined this payment because it looks like a duplicate: a transaction with the identical amount and card details was submitted very recently. This is most often a sign of something happening on the merchant's side of the integration, not a problem with the customer's card. Stripe's official definition is: "a transaction with identical amount and credit card information was submitted very recently." Card networks and issuing banks include duplicate detection specifically to prevent accidental double-charging, and this code is that protection kicking in. It compares the amount and card details of an incoming charge against very recent activity and blocks anything that looks like an accidental repeat.
Why it happens
For recurring billing, `duplicate_transaction` usually points to something in the billing integration rather than anything about the customer. Common causes include a webhook firing more than once for the same invoice and triggering two charge attempts, an automated retry system overlapping with a manual retry a support agent triggered separately, or a race condition where two processes both try to collect on the same invoice around the same time. The customer's card is very likely fine. The charge attempt itself was simply submitted twice.
How to fix it
Not in the sense of retrying the identical charge again immediately, since that will likely trigger the same duplicate check a second time. The more useful question isn't whether to retry the charge, it's why two nearly identical charge attempts happened in the first place. Check your own integration before assuming anything is wrong with the customer's payment method. Look at whether a webhook fired multiple times for the same invoice, whether an automated dunning retry overlapped with a manual one, or whether two separate systems both attempted to collect on the same invoice around the same time. Once the duplicate submission is understood, a single, cleanly spaced retry after the network's own duplicate-detection window has passed will usually succeed without issue, since the card and the amount were never actually the problem.
How Foxhound recovers it
This code has no dedicated bucket in the recovery engine's classification sets, so it fails closed rather than defaulting to a silent retry: no repeat charge runs against a code Foxhound cannot classify. Recovery goes straight to the same email sequence expired cards get, carrying the hosted card-update link, until this code earns its own bucket.
Questions
See what this looks like on your account
The free audit shows what Stripe already recovered and what is still dying, no signup required.
Run your free audit