Every online seller using Stripe for their payment processing has experienced it: A payment fails and you see a decline code in our dashboard. But what do these codes mean? And how should you as a business owner respond?
Stripe is limited. While for Subscriptions and invoices the Smart Retries setup will attempt to recover the failed charge automatically, it can only rerun the transaction in Stripe itself. You can’t cascade to a different processor, you can’t route around the acquiring bank that declined you, and for one-time charges, there’s no retry at all.
We’ve mapped every Stripe decline code to the standard bank code it corresponds to, and explain whether it’s a soft or hard decline, and what merchants with dedicated payment processing do differently to recover that revenue.
What Do Stripe Decline Codes Mean?
Stripe uses its own naming system instead of standard bank decline codes. Here’s what each one actually means and whether you should retry:
| Stripe Code | Bank Code | Meaning | Type | What to Do |
| card_declined | 05 | Generic decline, bank gave no reason | Soft | Wait 24 hrs, retry once |
| insufficient_funds | 51 | Not enough money on the card | Soft | Retry in 3–5 days |
| lost_card | 41 | Card reported lost | Hard | Do NOT retry. Request new card. |
| stolen_card | 43 | Card reported stolen | Hard | Do NOT retry. Request new card. |
| expired_card | 54 | Card is expired | Hard | Ask customer to update card |
| incorrect_number | 14 | Card number entered wrong | Hard | Ask customer to re-enter |
| processing_error | 96 | System error at processor | Soft | Retry immediately |
| do_not_honor | 05 | Bank refused, no specific reason | Soft | Wait 24 hrs, retry once |
| fraudulent | N/A | Stripe flagged as potential fraud | Hard | Review order, contact customer |
| card_not_supported | N/A | Card type not supported | Hard | Request different card |
| currency_not_supported | N/A | Card doesn’t support this currency | Hard | Offer alternative currency |
| try_again_later | 96 | Temporary issue | Soft | Retry in a few hours |
| issuer_not_available | 91 | Bank system is down | Soft | Retry or cascade to backup |
| do_not_try_again | N/A | Bank says stop permanently | Hard | Do NOT retry. Request new card. |
Don’t show raw decline codes to your customers. “card_declined” or “do_not_honor” means nothing to someone trying to buy your product, and will only create a poor checkout experience. Display a friendly message like “Payment could not be processed. Please try another card or contact your bank” and log the actual decline code internally for your team.
For detailed breakdowns of specific codes, see our guides on Do Not Honor (code 05), Insufficient Funds (code 51), Transaction Not Permitted (code 57), and our complete decline code reference.
Why Can’t Stripe Fix My Declines?
Because Stripe is a payment aggregator, not a full processing stack.
Stripe’s Smart Retries work through Stripe Billing and Invoicing — but they only retry through Stripe’s own processing network. When a customer’s bank declines a transaction, retrying through the same network often gets the same result. With a dedicated gateway, you can cascade to a different acquiring bank, which presents the transaction differently to the issuing bank — and what gets declined on one route can get approved on another.
When you have a well setup payment stack for your business, you are able to:
• Cascade to a backup processor. With a dedicated merchant account and gateway, a decline on Processor A automatically retries on Processor B. Stripe doesn’t support this. The sale is just lost.
• Configure retry logic by decline type. A dedicated gateway lets you set rules: retry code 51 in 3 days, never retry code 41, cascade code 91 to a different processor immediately. Stripe’s Smart Retries adjust timing but always retry through the same processor — if that bank said no, asking again through the same bank has limited upside.
• Route by card type or BIN. Dedicated gateways route transactions to the processor most likely to approve them based on card type, issuing bank, or geography. Stripe routes everything through Stripe.
• Access detailed decline data. Stripe shows you the decline code. A dedicated processor gives you the raw bank response, which often contains more information about why the transaction failed and how to fix it.
For merchants processing under $10K/month with few declines, this doesn’t matter much. Above that, every unrecovered decline is lost revenue that compounds monthly.
How Do Merchants Recover Declined Transactions?
Merchants with dedicated merchant accounts and payment gateways recover 3–8% of declined transactions beyond what Stripe’s Smart Retries can recover on their own:
Multi-MID cascading. Transaction declines on MID 1, automatically retries on MID 2 through a different acquiring bank. Different banks have different approval thresholds — what one declines, another approves.
Smart retry scheduling. Automated retries based on decline type. Code 51 (insufficient funds) retries in 3–5 days targeting payday. Code 96 (system error) retries immediately. Code 41 (lost card) never retries.
Account Updater (VAU/MAU). Automatically refreshes expired or replaced card details before the charge attempt. Recovers 15–25% of recurring billing failures from expired cards.
Decline analytics. Track which codes are most frequent, which times of month have highest decline rates, and which card types fail most often. Then adjust your processing configuration to address the patterns.
For more on reducing declines, see our guide on how to reduce credit card decline rates.
Frequently Asked Questions
card_declined (generic decline) and insufficient_funds together account for the majority of Stripe declines. Both are soft declines that can be retried — but Stripe doesn’t offer automated retry tools.
Only if it’s a soft decline. Wait 24 hours for card_declined and do_not_honor. Wait 3–5 days for insufficient_funds. Retry immediately for processing_error. Never retry lost_card, stolen_card, or do_not_try_again. However, you cannot automatically retry a one-time charge decline in Stripe. You’ll have to ,anually create a new transaction.
Two reasons: the customer’s bank declined it (the code tells you why), or Stripe’s own fraud system (Radar) flagged it. If you see “fraudulent” as the decline reason, that’s Stripe’s system, not the bank. You can adjust Radar sensitivity in your Stripe dashboard, but the controls are limited compared to dedicated fraud screening tools.
Yes. Merchants who switch from Stripe to a dedicated merchant account with cascading and smart retry typically see a 3–8% improvement in approval rates. That’s because declines that Stripe treats as final can be recovered through a backup processor or timed retry.
Stripe translates standard bank decline codes (like 05, 51, 41) into its own naming system (card_declined, insufficient_funds, lost_card). The underlying reason is the same — Stripe just uses different labels. See the table above for the full mapping.
Stripe returns two fields: decline_code is the machine-readable code (like insufficient_funds or lost_card) and decline_message is the human-readable explanation (“Your card has insufficient funds”). The decline_code is what you use to determine your response. The decline_message is what you can optionally show customers — though most merchants customize these to avoid confusing or alarming language.
Usually it’s the customer’s bank that declined, not Stripe. Stripe passes the bank’s decision back to you as a decline code. The exception is when you see “fraudulent” as the code — that means Stripe’s own fraud system (Radar) blocked the transaction, not the bank. You can adjust Radar’s sensitivity in your Stripe dashboard, but for more granular fraud controls you’d need a dedicated gateway with configurable fraud screening rules.
Stop Watching Sales Disappear
Stripe shows you the decline. A dedicated payment setup lets you actually do something about it. If your decline rate is above 5% and you’re losing revenue to codes that could be retried, cascaded, or prevented — it’s time to move beyond Stripe’s limitations.
DirectPayNet sets up dedicated merchant accounts with cascading, smart retry, and the decline analytics to show you exactly where revenue is leaking.