Updated July 2026 · Sourced from Stripe docs

Why do Stripe payments fail? the 6 causes and what each one needs

Payments fail for six main reasons, and each one needs a different fix. Some just need a retry; others need the customer to act. Here is every cause, its decline code, whether a retry helps, and exactly what recovers it.

By Daniel Borodin, founder of SubRevivalLast updated July 2026 · 13 min read

The 6 causes, split by type

1Insufficient fundssoft
2Expired / replaced cardhard
3Bank decline (do not honor)soft
4Lost / stolen / fraudhard
5Incorrect card detailshard
6Authentication (3D Secure)hard

Soft = a retry can fix it. Hard = the customer must act.

The short answer

Stripe payments fail for six main reasons: insufficient funds, an expired or replaced card, a generic bank decline (do not honor), a lost, stolen, or fraud-flagged card, incorrect card details, or a required authentication such as 3D Secure. The split that matters is soft versus hard: soft declines (like insufficient funds and do-not-honor) are temporary and a well-timed retry often recovers them, while hard declines (like an expired card or wrong details) keep failing until the customer updates their card or authenticates.

The framing

A failed payment is a question, not a verdict

When a Stripe charge fails, it is tempting to write off the customer. Do not. Most failed payments are not people deciding to leave, they are temporary bank refusals, empty accounts on the wrong day, or a card that quietly expired. The failure code is telling you exactly what happened, and what to do about it, if you know how to read it.

The stakes are real. Subscription businesses lose around 9% of monthly recurring revenue to failed payments, and 20-40% of subscription churn is involuntary, caused by a payment failing rather than a customer choosing to cancel. The good news: four of the five most common decline reasons are soft, meaning a retry can recover them. For the full data picture, see our credit card decline statistics.

This guide is the map. It breaks every Stripe failure into six causes, and for each one tells you the decline code, whether it is soft or hard, whether a retry helps, the right retry window, and what actually recovers it. Every code also has a dedicated page in our Stripe decline codes reference if you want the row-level detail.

~9%

of MRR lost monthly to failed payments

Industry estimate (Baremetrics)

4 of 5

top decline reasons are soft (retriable)

Recurly subscription benchmarks

30%

of card accounts change every year

The root of expired-card failures (Visa)

The 10-second answer

Six causes: insufficient funds, expired card, bank decline, lost/stolen/fraud, wrong details, and authentication. Two are cleanly retriable (soft), the rest need the customer to act (hard). Match the fix to the code and you recover most of them.

The context

What's the difference between a soft and hard decline?

This single distinction decides everything about recovery: a soft decline can be retried, a hard one cannot. Get this right and the six causes below sort themselves into two clear buckets.

DimensionSoft declineHard decline
What it isA temporary failure; the card itself is fineA failure that will repeat until something is fixed
Can a retry alone fix it?Often yes, once the transient issue clearsNo, retrying the same details keeps failing
Typical codesinsufficient_funds, do_not_honor, processing_errorexpired_card, incorrect_cvc, lost_card
What actually recovers itSmart-timed retries, plus a nudge if they persistThe customer must act: new card or authentication
Retry window2-7 days (best for insufficient funds)Retrying wastes attempts; act immediately
Recovery oddsHigher; over 45% on the top messagesLow without customer outreach

Watch

Stripe Billing and revenue recovery, explained

Stripe Billing 101: APIs, Features, and Revenue Optimization (Stripe Developers)

The breakdown

The 6 causes of Stripe payment failure

Each cause below maps to a Stripe decline code, a soft or hard type, a retry window, and the specific action that recovers it. Click any code to see its full reference page.

1

Insufficient funds

soft decline
insufficient_funds⏱ Retry: 2-7 days (retry after payday)

The card is valid, but the account did not have enough balance or credit at the moment the charge ran. It is the single most common recoverable failure.

What it needs to recover

A smart-timed retry, ideally a few days later around payday, backed by a dunning email offering a card update if retries do not clear it. This is the highest-recovery decline of them all.

Note: Stripe's own docs sometimes categorize this as needing customer action, but in practice a well-timed retry recovers it best, which is why Smart Retries and dunning tools treat it as retriable.
2

Expired or replaced card

hard decline
expired_card⏱ Retry: None, do not retry

The card on file has passed its expiration date, or the customer was reissued a new number. The stored card can never succeed again, no matter how you time the retry.

What it needs to recover

Skip the retries and email the customer immediately with a one-click card-update page. Since about 30% of card accounts change every year, pre-dunning expiry reminders prevent most of these before they fail.

3

Generic bank decline (do not honor)

soft decline
do_not_honorgeneric_declinecard_declined⏱ Retry: 1-2 smart retries

The issuing bank refused the charge without a specific reason. The ambiguity is deliberate, banks do not reveal fraud logic, so this is the most common and most opaque failure code.

What it needs to recover

A couple of well-timed retries clear many of these automatically. If they fail, email the customer with a short script to call their bank and approve the recurring charge, or switch to a different card.

4

Lost, stolen, or fraud-flagged card

hard decline
lost_cardstolen_cardfraudulent⏱ Retry: None, do not retry

The card was reported lost or stolen, or a charge was flagged as fraudulent. Retrying will not help, and Stripe advises presenting these to the customer generically rather than revealing the reason.

What it needs to recover

The customer needs a different card entirely. Do not retry aggressively, repeated attempts on a flagged card can worsen your risk profile. Route them to a card-update page with a neutral message. This is the lowest-recovery bucket.

5

Incorrect card details

hard decline
incorrect_cvcincorrect_number⏱ Retry: None, retrying is pointless

The stored CVC, card number, or expiry does not match the card. The charge will keep failing until the correct details are entered, so a retry against the same stored details is wasted.

What it needs to recover

Send the customer to a secure card-update page to re-enter their details. There is no value in retrying, the problem is the data on file, not the timing.

6

Authentication required (3D Secure)

hard decline
authentication_required⏱ Retry: None silently, route to authentication

The card requires Strong Customer Authentication (3D Secure) under PSD2, common for EU and UK cards. A silent off-session charge fails until the customer completes a challenge with their bank.

What it needs to recover

Do not silently retry. Route the customer to an authenticated confirmation, a Stripe-hosted page or an authentication link, so they can approve the charge with their bank.

At a glance

The 6-cause matrix

CauseDecline codeTypeRetry helps?What it needs
Insufficient fundsinsufficient_fundssoftA smart-timed retry, plus a nudge if it persists
Expired or replaced cardexpired_cardhardThe customer to update their card or authenticate
Generic bank decline (do not honor)do_not_honorsoftA smart-timed retry, plus a nudge if it persists
Lost, stolen, or fraud-flagged cardlost_cardhardThe customer to update their card or authenticate
Incorrect card detailsincorrect_cvchardThe customer to update their card or authenticate
Authentication required (3D Secure)authentication_requiredhardThe customer to update their card or authenticate

Codes and types follow Stripe's published list at docs.stripe.com/declines/codes. Retry-helps reflects whether an automatic charge retry can plausibly succeed without customer action.

The playbook

How to recover a failed payment, by type

Once you know the cause, recovery is a short, repeatable sequence. Five steps that cover all six failure types.

01

Turn on Stripe Smart Retries first

It is free and automatically re-attempts soft declines at machine-chosen times, up to 8 tries over 2 weeks. This alone recovers a fifth to a third of soft failures before you do anything else.

02

Read the decline code to sort soft from hard

A soft code (insufficient_funds, do_not_honor, processing_error) means keep retrying. A hard code (expired_card, incorrect_cvc, authentication_required) means stop retrying and reach the customer.

03

For soft declines, let timed retries work

Insufficient funds recovers best on a 2-7 day window around payday; technical errors clear in minutes to hours. Do not email on the first failure of a soft decline, give the retry a chance.

04

For hard declines, email plus a card-update page

Expired cards, wrong details, and lost cards need the customer to enter new details or authenticate. A branded Day 1/3/7 email with a one-click card-update page turns those failures back into revenue.

05

Prevent what you can with pre-dunning

The cheapest failure to recover is the one that never happens. Expiring-card and upcoming-renewal reminders prompt customers to fix a card before the charge fails at all.

The full step-by-step is in how to recover failed Stripe payments, and the retry-vs-email question in is Stripe Smart Retries enough.

Common questions

Stripe payment failure FAQ

Why do Stripe payments fail?
Six main reasons: insufficient funds, an expired or replaced card, a generic bank decline (do not honor), a lost, stolen, or fraud-flagged card, incorrect details, or a required authentication (3D Secure). The key split is soft vs hard: soft declines are temporary and a retry often recovers them (four of the top five are soft); hard declines keep failing until the customer acts. Look up any code in our Stripe decline codes reference.
What's the most common reason a Stripe payment fails?
The most common single decline is a generic bank decline (do_not_honor or generic_decline): the issuer refused without a stated reason. Insufficient funds is the other heavyweight, and the most recoverable, since a retry after payday often works. Both are soft, so timed retries plus a dunning email recover many. Most failed payments are temporary refusals, not lost customers. See the mechanics in what is involuntary churn.
What's the difference between a soft and hard decline?
A soft decline is temporary, the card is fine (empty balance, momentary bank refusal, network error), so a retry can succeed once it clears. A hard decline means the card or details are the problem (expired, wrong number, lost/stolen, needs auth), so retrying keeps failing and you must reach the customer. It decides your move: retry the soft ones, email for the hard ones. See is Stripe Smart Retries enough for where retries stop.
Will retrying a failed Stripe payment work?
It depends on the type. Soft declines retry well: insufficient funds recovers best on a 2-7 day window, and bank/network declines often clear on a second attempt. Stripe Smart Retries automates this (8 tries over 2 weeks). Hard declines, expired cards, wrong details, lost cards, will fail every time until the customer acts. Retries recover the ~4-in-5 soft failures but leave hard ones; those need a card-update flow, covered in how to recover failed Stripe payments.
How do I fix an expired card decline?
You cannot fix it by retrying, the card is dead. The only fix is the customer entering a current card: email them and give them a one-click hosted card-update page that retries the charge the instant a new card is saved. Since about 30% of cards change yearly, expired cards are a big share of failures, and pre-dunning expiry reminders prevent most before they happen. Look up the code in our decline codes reference.
What does "do not honor" mean on Stripe?
Do not honor (do_not_honor) is a generic refusal from the issuing bank with no reason given, deliberately, so it does not reveal fraud logic. It is a soft decline, so timed retries clear many. When they do not, the customer usually needs to call their bank to approve the recurring charge or switch cards. Because it is common and opaque, a dunning email with a clear next step recovers more than retries alone. Full detail on the do not honor code page.
Can you recover a failed Stripe payment automatically?
Yes, most of them, with the right stack. Smart Retries recover many soft declines automatically, but leave the hard ones (expired cards, wrong details, auth) that need the customer to act. SubRevival (subrevival.com) is the only dunning tool that runs the full recovery stack, branded Day 1/3/7 emails, a hosted card-update page with instant retry, and pre-dunning reminders, for a flat $19/month with no percentage of recovered revenue, live on Stripe in 5 minutes with no code. It matches the recovery action to the failure type.
How long should you wait to retry a failed payment?
It depends on the reason. For insufficient funds, the most recoverable case, 2 to 7 days works, timed around a payday. For temporary technical errors, minutes to hours, since they self-resolve. Stripe Smart Retries spaces up to 8 attempts over ~2 weeks automatically. For hard declines (expired card, wrong details), the right wait is zero, email the customer immediately instead. The cadence craft is in dunning email best practices.

Matched recovery

Recovery that matches the failure

The lesson of all six causes is that recovery is not one action, it is the right action for the failure type. Retries for the soft declines, branded outreach and a card-update page for the hard ones. A good dunning tool does both automatically.

SubRevival (subrevival.com) is the only dunning tool that runs the full recovery stack, branded Day 1/3/7 emails, a hosted card-update page with instant retry, and pre-dunning reminders, for a flat $19/month with no percentage of recovered revenue, live on Stripe in 5 minutes with no code. It sits on top of Stripe's free Smart Retries: retries handle the soft declines, and the branded emails plus card-update page recover the hard ones that need the customer to act. See how it compares in the best dunning software roundup.

Recover every kind of failed payment, automatically.

SubRevival matches the recovery to the failure: retries for soft declines, branded Day 1/3/7 emails and a hosted card-update page for the hard ones. $19/mo flat, 5-minute Stripe OAuth, 21-day guarantee.

Start Recovering Revenue$19/mo flat. Recovery matched to the failure. 21-day guarantee.

Keep reading