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.

Back to decline codes
duplicate_transactionNo automatic retry
Draft content: this page's explanatory copy is Pass 3 template writing pending a dedicated content pass. The classification badge above and the recovery behavior described below are live, not draft: both come directly from the recovery engine.

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

  • No. It almost always reflects two nearly identical charge attempts submitted close together from the merchant side, not an issue with the customer's card.

  • Not right away. An immediate retry with the same amount and card can trigger the same duplicate check again. Space the retry out, and figure out why two attempts happened in the first place.

  • Look for webhooks firing more than once for the same invoice, overlapping automated and manual retries, or two processes both trying to collect on the same invoice at once.

  • Not specially. It falls to the same unknown bucket every other unrecognized code does, which fails closed rather than retrying automatically. For `duplicate_transaction` specifically that email-based fallback is an imperfect fit, since the card was never actually the problem, so this is a good code to review manually if it recurs rather than relying on the automated path alone.

  • It's a strong signal to audit your billing integration for overlapping retries or duplicate webhook firing, rather than a sign that something is wrong with your customers' cards.

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