← Guides

Reference · 2026

Stripe Sends You a Clue
Every Time a Payment Fails.
Most Founders Ignore It.

Every Stripe decline carries a code that tells you exactly why it failed, whether retrying will help, when to retry, and what to say to the customer. This is the complete 2026 encyclopedia: 30+ codes categorized, recovery rates benchmarked, and retry cadences specified for each one.

18 min read·Updated April 2026·Recurflux team

Quick answer

A Stripe decline code is a machine-readable string returned when a payment is refused — by the issuing bank, Stripe's risk engine, or the card network. Codes classify the failure: insufficient_funds is soft and retriable; do_not_honor is a hard decline and retry-unsafe. Retrying hard declines increases issuer blacklist risk. There are 34 distinct Stripe decline codes. Understanding each code's retry profile is the foundation of intelligent dunning logic.

The Signal

Stripe's decline code system is the most information-rich signal your billing infrastructure generates. Each code tells you exactly why a payment failed, how severe the failure is, whether retrying will help, when to retry, and what to say to the customer.

Treating every decline the same way — retrying at fixed intervals, sending the same dunning email, giving up at the same threshold — is the single most expensive mistake in subscription billing.

Recovery with generic handling

30–40%

Recovery with code-specific logic

55–85%

Codes covered by Stripe native

~10

Codes covered by Recurflux

30+

The Most Important Concept

Soft declines are temporary. Hard declines are permanent. Retrying a hard decline on the same card is actively harmful — it can trigger issuer-side blocks affecting your entire Stripe account.

DimensionSoft DeclineHard Decline
Card statusValid and activeUnusable without customer action
Root causeTemporary (funds, network, limits)Permanent (expired, fraud, closed)
Retry appropriate?Yes — recommendedNo — harmful
Recovery strategyCode-specific retry cadenceDunning email → customer action
Recovery rate55–70% with optimized timing35–45% (customer must act)

Part 1 — Soft Declines

The 55–70% Recovery Opportunity

Soft declines are temporary failures. The card is valid, the account is active, and something transient prevented authorization. The key word is code-specific — an insufficient_funds decline and a processing_error decline are both soft, but require completely different retry strategies.

insufficient_funds

20–40% of failures

55–70%

Most customers get paid on the 1st or 15th. An insufficient_funds decline on the 28th isn't a lost payment — it's a payment 3 days early.

Optimal cadence

24h → 72h → 7d/payday → 14d

do_not_honor

40–65% of failures

45–60%

The issuer declined without saying why. Behind this code lies a spectrum of transient causes — fraud resets, daily limits, system errors. Use a broad-spectrum escalating cadence.

Optimal cadence

24h → 72h → 7d → 14d

processing_error

1–3% of failures

70–85%

Not a customer issue at all — a transient network glitch. The charge would almost certainly succeed if retried immediately. Waiting 24 hours abandons 70%+ of recoverable revenue.

Optimal cadence

Immediate → 1h → 4h

Complete Soft Decline Reference

Decline Code% of DeclinesDescriptionOptimal Retry CadenceRecovery Rate
insufficient_funds20–40%Insufficient balance24h → 72h → 7d/payday → 14d55–70%
do_not_honor40–65%Generic issuer rejection24h → 72h → 7d → 14d45–60%
card_declined5–15%Generic card decline24h → 72h → 7d40–55%
try_again_later2–5%Temporary issuer issue24h50–65%
processing_error1–3%Network/processor errorImmediate → 1h → 4h70–85%
issuer_not_available1–2%Issuer system unreachableImmediate → 2h65–80%
approve_with_id1–2%Requires phone approvalImmediate30–50%
transaction_not_allowed1–2%Transaction type restricted24h → 72h25–40%
card_velocity_exceeded2–5%Frequency/amount limit hit24–48h35–50%
reenter_transaction0.5–1%Issuer suggests retryImmediate50–65%
authentication_required2–5%3DS/SCA auth neededAfter 3DS flow completes60–80%
duplicate_transaction0.5–1%Recent identical chargeAfter dedup windowN/A
new_account_information_available0.5–1%Card updated by networkVia Card Account Updater80–90%
withdrawal_count_limit_exceeded1–2%ATM/withdrawal limit hit24–48h30–45%

Part 2 — Hard Declines

The Customer Action Recovery Path

Hard declines are permanent failures. The moment a decline is classified as hard, stop all retry attempts and immediately activate the dunning sequence.

Cardinal Rule

Never retry a hard decline on the same card. Excessive retries signal velocity abuse to Stripe's risk systems and can trigger issuer-side blocks affecting all merchants in your Stripe account.

Complete Hard Decline Reference

Decline Code% of FailuresDescriptionRecovery ActionRecovery Rate
expired_card5–10%Card expiration passedCard Health Monitoring → Hosted Portal link35–55% (+ 80–90% prevention)
incorrect_cvc1–2%CVC/security code mismatchImmediate update request email + portal40–55%
incorrect_number0.5–1%Invalid card numberImmediate update request email + portal35–50%
incorrect_zip0.5–1%Postal code mismatchBilling address update prompt35–50%
incorrect_address0.5–1%AVS verification failedBilling address update prompt35–50%
card_not_supported0.5–1%Card type not acceptedAlternate payment method suggestion25–40%
fraud1–3%Fraud detection triggeredNo retry; generic decline + portal5–15%
stolen_card0.5–1%Card reported stolenNo retry; generic decline + portal5–10%
lost_card0.5–1%Card reported lostNo retry; generic decline + portal5–10%
invalid_account0.5–1%Account closed/invalidNew payment method request15–25%
not_permitted0.5–1%Transaction not permittedCustomer contact required15–25%
restricted_card0.5–1%Card usage restrictedNew payment method via portal20–30%
currency_not_supported0.5–1%Currency not acceptedCurrency/payment method change25–40%
pickup_card0.5–1%Card flagged for pickupNo retry; customer contact required0–5%
pin_try_exceeded0.1–0.5%PIN attempts exceededDifferent payment method required15–25%

Part 3 — Network Codes

The Layer Behind Stripe's Labels

Stripe translates raw two-digit issuer response codes into human-readable decline codes. The original numeric code is available via the network_decline_code field — and it provides granularity that matters.

When Stripe returns card_declined with no further context, checking network_decline_code reveals whether the issuer code was 01 (soft, retry appropriate) or 85 (also soft, but with different recovery dynamics).

Issuer CodeMeaningStripe MappingType
01Refer to issuercard_declinedSoft
05Do not honordo_not_honorSoft
06General errorprocessing_errorSoft
12Invalid transactiontransaction_not_allowedSoft
13Invalid amountinvalid_amountHard
14Invalid card numberincorrect_numberHard
30Format errorincorrect_numberHard
34Suspected fraudfraudHard
41Lost cardlost_cardHard
43Stolen cardstolen_cardHard
51Insufficient fundsinsufficient_fundsSoft
54Expired cardexpired_cardHard
55Incorrect PINincorrect_pinHard
57Transaction not permittedtransaction_not_allowedSoft
61Exceeds withdrawal limitwithdrawal_count_limit_exceededSoft
65Exceeds frequency limitcard_velocity_exceededSoft
85No reason to declinecard_declinedSoft
91Issuer inoperativeissuer_not_availableSoft
N7CVV2 mismatchincorrect_cvcHard
R1Stop recurring paymentrevocation_of_authorizationHard

Part 4 — ACH Return Codes

ACH / Bank Debit Return Codes

ACH direct debit payments face a separate taxonomy with a critical operational difference: ACH returns can be initiated up to 60 days after the original transaction. This makes dispute risk management significantly more complex than card payments.

ACH Warning

R05 (unauthorized debit) and R10 (customer advised not authorized) carry chargeback implications that can impact your dispute ratio — even though they appear as ACH returns, not card disputes.

ACH CodeDescriptionTypeRecovery Action
R01Insufficient fundsSoftRetry after 3–5 business days
R02Account closedHardDunning → new bank account request
R03Account not foundHardVerify account details with customer
R04Invalid account numberHardImmediate update request
R05Unauthorized debitHardVerify authorization; re-authorization required
R06Returned per ODFI requestVariesInvestigate with Stripe support
R07Authorization revokedHardCustomer must re-authorize
R08Stop payment orderHardCustomer must re-authorize
R09Uncollected fundsSoftRetry after funds clear (3–5 days)
R10Customer advised not authorizedHardCustomer dispute process
R16Account frozenSoftCustomer must contact bank; retry after 5–7 days
R20Non-transaction accountHardCustomer must use checking account
R29Corporate customer not authorizedHardVerify corporate authorization documentation

Part 5 — Test Cards

Stripe Test Cards for Decline Simulation

Building a payment recovery system without testing every decline scenario is the engineering equivalent of skipping QA. Use these Stripe test card numbers to validate your retry logic, dunning triggers, and portal flows before going live.

Card NumberDecline TypeStripe CodeWhat to Test
4000 0000 0000 0002Generic declinecard_declinedStandard retry cadence
4000 0000 0000 9995Insufficient fundsinsufficient_fundsPayday-aligned retry logic
4000 0000 0000 9987Lost cardlost_cardNo-retry + dunning activation
4000 0000 0000 9960Stolen cardstolen_cardNo-retry + generic decline messaging
4000 0000 0000 0069Expired cardexpired_cardCard Health Monitoring + portal link
4000 0000 0000 0127Incorrect CVCincorrect_cvcImmediate update email
4000 0000 0000 0119Processing errorprocessing_errorImmediate → 1h → 4h sequence
4242 4242 4242 4241Wrong card numberincorrect_numberUpdate portal flow
4100 0000 0000 0019Velocity exceededcard_velocity_exceededFrequency cap + delayed retry
4000 0000 0000 0341Charge fails after attachcard_declinedWebhook-triggered retry

Part 6 — Classification

The 4-Bucket Classification System

Recurflux's Smart Retry engine classifies every incoming decline into one of four recovery buckets in real time — the moment the Stripe webhook fires. This classification drives everything: retry timing, dunning channel, escalation logic, and final disposition.

Immediate Retry

70–85%

Retry within minutes

processing_errorissuer_not_availablereenter_transaction

Scheduled Retry

45–65%

Code-specific cadence

insufficient_fundsdo_not_honorcard_declinedtry_again_latercard_velocity_exceeded

Customer Action

35–55%

Dunning email + Hosted Portal

expired_cardincorrect_cvcincorrect_numberincorrect_zipincorrect_address

No Recovery

0–5%

Generic decline notice only

fraudstolen_cardlost_cardpickup_card

Coverage Comparison

ToolDecline Codes CoveredGeneric FallbackRecovery Ceiling
Stripe Smart Retries~10 core codesYes (most codes)30–40%
Stunning / Churn Buster10–15 codesYes45–55%
Churnkey15–20 codesYes50–60%
Recurflux $20 (Founder)30+ codesNo50–65%
Recurflux $59 (Rise)30+ codesNo55–70%
Recurflux $159 (Surge)30+ codes + fraud det.No60–75%

FAQ

What are Stripe decline codes?

Stripe decline codes are standardized string identifiers returned when a payment fails, identifying the specific reason — such as insufficient_funds, expired_card, or do_not_honor. Each code appears in the decline_code field of a Stripe Charge or PaymentIntent object and determines the optimal recovery strategy.

What is the difference between a soft decline and a hard decline in Stripe?

A soft decline is a temporary failure where the card is valid but the authorization failed for a transient reason (insufficient funds, network error). Retrying is recommended and recovers 55–70% of cases. A hard decline is permanent — the card is expired, lost, stolen, or blocked — and retrying is actively harmful. Recovery requires customer action via dunning emails.

What does do_not_honor mean on Stripe?

do_not_honor is the issuer's generic catch-all rejection — the bank declined the transaction without providing a specific reason. It accounts for 40–65% of all Stripe declines and is best handled with an escalating retry schedule at 24h, 72h, 7d, and 14d intervals, covering the most likely transient causes including fraud detection resets and daily spending limit cycles.

Why should I never retry a hard decline?

Retrying a hard decline — a card that's expired, stolen, or permanently blocked — signals velocity abuse to Stripe's risk systems and the issuing bank. Excessive retries on a permanently declined card can trigger issuer-side blocks that affect all merchants processing through the same Stripe account.

What is a network_decline_code and how does it differ from decline_code?

The decline_code is Stripe's human-readable translation of the raw issuer response. The network_decline_code is the original two-digit numeric code from the card network — it provides granularity that Stripe's mapping obscures. For example, card_declined could be issuer code 01 (soft, retry appropriate) or 85 (no reason given, also soft but with different recovery dynamics).

How does Recurflux handle 30+ decline codes differently from Stripe Smart Retries?

Stripe Smart Retries uses a single ML model applied broadly across codes. Recurflux classifies every incoming decline into one of four buckets in real time and applies individually optimized retry cadences for 30+ codes — including edge cases like card_velocity_exceeded, authentication_required, and approve_with_id that generic cadences handle poorly.

Put It Into Practice

Stop applying the same
cadence to every decline.

Recurflux's Smart Retry engine handles all 30+ decline codes with individually optimized strategies — payday-aligned retries for insufficient_funds, immediate retries for processing_error, and zero retries for fraud codes. From $20/month (Founder, up to $10K MRR).