Stripe Decline Codes: What They Mean and What You Can Actually Do About Them

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 CodeBank CodeMeaningTypeWhat to Do
card_declined05Generic decline, bank gave no reasonSoftWait 24 hrs, retry once
insufficient_funds51Not enough money on the cardSoftRetry in 3–5 days
lost_card41Card reported lostHardDo NOT retry. Request new card.
stolen_card43Card reported stolenHardDo NOT retry. Request new card.
expired_card54Card is expiredHardAsk customer to update card
incorrect_number14Card number entered wrongHardAsk customer to re-enter
processing_error96System error at processorSoftRetry immediately
do_not_honor05Bank refused, no specific reasonSoftWait 24 hrs, retry once
fraudulentN/AStripe flagged as potential fraudHardReview order, contact customer
card_not_supportedN/ACard type not supportedHardRequest different card
currency_not_supportedN/ACard doesn’t support this currencyHardOffer alternative currency
try_again_later96Temporary issueSoftRetry in a few hours
issuer_not_available91Bank system is downSoftRetry or cascade to backup
do_not_try_againN/ABank says stop permanentlyHardDo 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

What is the most common Stripe decline code?


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.

Should I retry a declined Stripe transaction?

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.

Why does Stripe decline legitimate transactions?

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.

Can I move from Stripe to reduce my decline rate?

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.

What is the difference between Stripe decline codes and bank decline codes?

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.

What’s the difference between Stripe’s decline_message and decline_code?

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.

Why did Stripe decline my customer’s card?


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.

Ready to Take Control of Your Payments?

Consult our experts today