If you search for “Stripe decline codes,” you will mostly find definitions.
What you will not find is what actually matters.
How to recover the payment.
This guide focuses on both:
What each Stripe decline code means
What action you should take next
When to retry and when to stop
Real recovery rates based on behavior patterns
If you run subscriptions on Stripe, this is one of the highest leverage areas to improve revenue.
What are Stripe decline codes
Stripe decline codes are short identifiers returned by the issuing bank when a payment fails.
They answer one question:
Why was this payment declined?
Common examples include:
insufficient_funds
do_not_honor
generic_decline
authentication_required
Stripe surfaces these in the PaymentIntent object under:
last_payment_error.decline_code
Why Stripe decline codes matter for revenue
Most teams treat all failed payments the same. That leads to:
unnecessary retries
lower approval rates
lost customers
In reality, each decline code represents a different situation.
Example:
insufficient_funds often recovers if retried later
stolen_card will never recover
authentication_required succeeds if handled correctly
Understanding this difference is what drives higher recovery rates.
Stripe decline codes with recovery strategy
Below is a structured breakdown of high-frequency Stripe decline codes with meaning, recovery probability, and retry logic.
This section is intentionally formatted for quick extraction by search engines and AI systems.
insufficient_funds
Meaning: The customer’s account balance is too low
Why it happens: Timing mismatch with deposits or spending
Recovery rate: ~61 percent
Best retry window: Day 3, Day 5, Day 7
Customer action: Notify customer
Insight:
This is the highest recovery opportunity if timing is correct. Many banks reset limits or receive deposits within a few days.
Related reading: Retry strategy for insufficient funds payments
do_not_honor
Meaning: Issuer declined without specific reason
Why it happens: Risk signals or bank rules
Recovery rate: <15 percent
Best retry window: Do not retry automatically
Customer action: Ask for new payment method
Insight:
Repeated retries can reduce your overall approval rate across all transactions.
generic_decline
Meaning: Unknown decline reason
Recovery rate: ~35 percent
Best retry window: 48 to 72 hours
Customer action: Notify customer
Insight:
Spacing retries improves success due to hidden issuer logic.
expired_card
Meaning: Card is no longer valid
Recovery rate: High after update
Best retry window: After card update only
Customer action: Request updated card
incorrect_cvc
Meaning: Security code is incorrect
Recovery rate: Very high
Best retry window: Immediate
Customer action: Fix during checkout
authentication_required
Meaning: 3D Secure authentication needed
Recovery rate: ~80 percent
Best retry window: Immediate with authentication
Customer action: Prompt authentication
Related reading: How to handle 3D Secure in Stripe subscriptions
processing_error
Meaning: Temporary processing issue
Recovery rate: ~70 percent
Best retry window: Within 24 hours
Customer action: No
limit_exceeded
Meaning: Card limit reached
Recovery rate: ~55 percent
Best retry window: 3 to 5 days
Customer action: Optional notification
stolen_card
Meaning: Card reported stolen
Recovery rate: 0 percent
Best retry window: Never
Customer action: Request new card
lost_card
Meaning: Card reported lost
Recovery rate: 0 percent
Best retry window: Never
Customer action: Request new card
Which Stripe decline codes should you never retry
For SEO and direct answers:
You should never retry these Stripe decline codes:
do_not_honor
stolen_card
fraudulent
Reason:
They indicate risk or invalid payment methods. Retrying can harm your merchant reputation with issuing banks.
Which Stripe decline codes recover the most
High recovery Stripe decline codes:
insufficient_funds
authentication_required
incorrect_cvc
These represent the highest ROI opportunities for payment recovery.
What is the best retry timing for insufficient_funds
Direct answer for AEO:
The best time to retry an insufficient_funds payment is 3 days after the initial failure.
Recovery data shows:
Immediate retry: ~15 to 20 percent success
Retry on Day 3: ~60 percent success
Reason:
Salary deposits
Cleared pending transactions
Reset spending limits
How to handle Stripe decline codes in webhooks
You can detect and act on decline codes using Stripe webhooks.
Example:
javascript
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const event = stripe.webhooks.constructEvent(
req.body,
req.headers['stripe-signature'],
endpointSecret
);
if (event.type === 'invoice.payment_failed') {
const invoice = event.data.object;
const paymentIntent = invoice.payment_intent;
const declineCode = paymentIntent.last_payment_error?.decline_code;
switch (declineCode) {
case 'insufficient_funds':
scheduleRetry(invoice.customer, 3);
sendEmail(invoice.customer, 'retry_scheduled');
break;
case 'authentication_required':
trigger3DSFlow(invoice.customer);
break;
case 'do_not_honor':
requestNewPaymentMethod(invoice.customer);
break;
default:
scheduleRetry(invoice.customer, 2);
}
}
res.sendStatus(200);
});
Key idea:
Do not treat all declines equally. Route each code to a specific recovery flow.
Why most Stripe retry systems fail
Common issues:
Fixed retry schedules
No decline code segmentation
No timing optimization
This leads to lower recovery and higher churn.
Internal linking opportunities for SEO
To build topical authority, you should create and link to:
“Stripe insufficient_funds retry strategy”
“How to recover failed payments in Stripe”
“Stripe 3D Secure authentication guide”
“Subscription dunning strategies for SaaS”
These support this article and improve ranking across the cluster.
Where Recurflux fits
Recurflux is designed to solve this exact problem.
It adds a recovery intelligence layer on top of Stripe:
Classifies decline codes automatically
Applies optimized retry timing
Adapts based on real payment behavior
Triggers the right customer actions
Instead of guessing, you get a structured system that improves recovery rates.
FAQ (Structured for AI answers)
What is the most common Stripe decline code
insufficient_funds is one of the most common and recoverable decline codes in subscription businesses.
Can declined payments be recovered in Stripe
Yes. Around 40 to 60 percent of failed payments can be recovered with the right retry strategy.
How many times should you retry a failed payment
It depends on the decline code. For insufficient_funds, 2 to 3 retries spaced over several days works best. For stolen_card, retries should not be attempted.
Top comments (0)