Error codes

Soft decline

Stripe

duplicate_transaction

A transaction with identical amount and credit card information was submitted very recently.

What does duplicate_transaction mean?

The duplicate_transaction decline code is returned when the card network detects that a transaction with identical amount, merchant, and card details has been submitted very recently. This is a protective measure designed to prevent merchants from accidentally charging customers twice.

Is it a soft or hard decline?

Classified as a soft decline. The customer's card is valid and the charge is simply being blocked as a safety measure — not refused outright.

Common root causes

  • Integration bug causing the same charge to be submitted twice

  • Retry logic firing before the original authorization result returned

  • Customer clicking "submit" multiple times during checkout

  • Webhook handling creating duplicate charge attempts

  • Race conditions in subscription billing systems

Recommended recovery steps

  1. Check if a charge already succeeded. The duplicate detection likely indicates the first charge actually went through — verify in your Stripe dashboard before attempting recovery.

  2. If the first charge failed, wait 10+ minutes before retrying to exit the duplicate detection window.

  3. Audit your retry logic for race conditions or double-firing events.

  4. Use idempotency keys on Stripe API calls to prevent accidental duplicates.

How FlyCode handles duplicate_transaction

FlyCode's retry engine is designed to prevent duplicate charges by default. Each recovery attempt uses proper idempotency keys and spaced timing that respects network deduplication windows. When duplicate_transaction does occur, FlyCode first verifies whether the original charge succeeded before taking any further recovery action — ensuring customers are never accidentally double-charged.

What does duplicate_transaction mean?

The duplicate_transaction decline code is returned when the card network detects that a transaction with identical amount, merchant, and card details has been submitted very recently. This is a protective measure designed to prevent merchants from accidentally charging customers twice.

Is it a soft or hard decline?

Classified as a soft decline. The customer's card is valid and the charge is simply being blocked as a safety measure — not refused outright.

Common root causes

  • Integration bug causing the same charge to be submitted twice

  • Retry logic firing before the original authorization result returned

  • Customer clicking "submit" multiple times during checkout

  • Webhook handling creating duplicate charge attempts

  • Race conditions in subscription billing systems

Recommended recovery steps

  1. Check if a charge already succeeded. The duplicate detection likely indicates the first charge actually went through — verify in your Stripe dashboard before attempting recovery.

  2. If the first charge failed, wait 10+ minutes before retrying to exit the duplicate detection window.

  3. Audit your retry logic for race conditions or double-firing events.

  4. Use idempotency keys on Stripe API calls to prevent accidental duplicates.

How FlyCode handles duplicate_transaction

FlyCode's retry engine is designed to prevent duplicate charges by default. Each recovery attempt uses proper idempotency keys and spaced timing that respects network deduplication windows. When duplicate_transaction does occur, FlyCode first verifies whether the original charge succeeded before taking any further recovery action — ensuring customers are never accidentally double-charged.

What does duplicate_transaction mean?

The duplicate_transaction decline code is returned when the card network detects that a transaction with identical amount, merchant, and card details has been submitted very recently. This is a protective measure designed to prevent merchants from accidentally charging customers twice.

Is it a soft or hard decline?

Classified as a soft decline. The customer's card is valid and the charge is simply being blocked as a safety measure — not refused outright.

Common root causes

  • Integration bug causing the same charge to be submitted twice

  • Retry logic firing before the original authorization result returned

  • Customer clicking "submit" multiple times during checkout

  • Webhook handling creating duplicate charge attempts

  • Race conditions in subscription billing systems

Recommended recovery steps

  1. Check if a charge already succeeded. The duplicate detection likely indicates the first charge actually went through — verify in your Stripe dashboard before attempting recovery.

  2. If the first charge failed, wait 10+ minutes before retrying to exit the duplicate detection window.

  3. Audit your retry logic for race conditions or double-firing events.

  4. Use idempotency keys on Stripe API calls to prevent accidental duplicates.

How FlyCode handles duplicate_transaction

FlyCode's retry engine is designed to prevent duplicate charges by default. Each recovery attempt uses proper idempotency keys and spaced timing that respects network deduplication windows. When duplicate_transaction does occur, FlyCode first verifies whether the original charge succeeded before taking any further recovery action — ensuring customers are never accidentally double-charged.

Understanding This Decline Code

Extended content body

Frequently Asked Questions

What does duplicate_transaction mean?

Should I retry a duplicate_transaction decline?

Not immediately. First verify whether the earlier charge actually succeeded. If it did not, wait at least 10 minutes before retrying to exit the network's duplicate detection window.

How does FlyCode prevent duplicate_transaction errors?

FlyCode's retry engine includes deduplication logic that prevents accidental re-submission of identical charges. This avoids duplicate_transaction errors entirely while still recovering genuinely separate failed payments.

FlyCode partnered with Stripe, to turn failed payment intro revenue.

With our newest Stripe app, you can stop chasing your customers about their failed payments and recover more payments with zero development work.

With our newest Stripe app, you can stop chasing your customers about their failed payments and recover more payments with zero development work.

Giving Back

Partnering with organizations that promote women in technology and families in need is something we are proud to do.

Text graphic displaying "SPE CODES; NEXT LEVEL" in a bold, stylized font on a solid background.
Logo featuring a stylized text "Catching" with an orange accent, set against a simple background.

2026 FlyCode © All Right Reserved.

Giving Back

Partnering with organizations that promote women in technology and families in need is something we are proud to do.

Text graphic displaying "SPE CODES; NEXT LEVEL" in a bold, stylized font on a solid background.
Logo featuring a stylized text "Catching" with an orange accent, set against a simple background.

2026 FlyCode © All Right Reserved.