How to Recover Failed Payments in Stripe: Beyond Smart Retries
A step-by-step guide to recovering failed payments in Stripe. Go beyond Smart Retries with webhooks, customer communication, and dunning automation.
Rechurn Team
Payment Recovery Experts
Stripe's Payment Recovery Stack
Stripe gives you several tools to handle failed payments. Understanding what's available — and what's missing — is the first step to maximizing recovery.
What Stripe Provides Out of the Box
- Smart Retries — ML-powered retry timing (included with Stripe Billing)
- Automatic card updates — updates stored card numbers when banks reissue cards
- Configurable retry schedule — customize how many times and when to retry
- Basic dunning emails — simple notification emails when payments fail
- Webhooks — real-time events for
invoice.payment_failed,customer.subscription.updated, etc.
What Stripe Doesn't Provide
- Multi-step email sequences — you get one email, not a 4-6 email dunning campaign
- Save offers — no built-in way to offer discounts, pauses, or downgrades
- Pre-dunning alerts — no card expiration warnings
- Recovery analytics — limited visibility into recovery rates and trends
- Decline code-specific routing — Smart Retries doesn't differentiate strategies by decline type
Step 1: Configure Stripe's Built-in Tools
Before building anything custom, optimize Stripe's defaults.
Enable Smart Retries
In your Stripe Dashboard, go to Settings → Billing → Subscription and emails → Manage failed payments.
- Enable Smart Retries (Stripe's ML determines optimal retry times)
- Set your retry window to 21 days (this gives maximum time for recovery)
- Configure the number of retries to the maximum allowed
Enable Automatic Card Updates
Go to Settings → Billing → Automatic card updates.
This feature uses the card networks' Account Updater service to automatically update stored card numbers when banks reissue cards. It reduces payment failures by 25-35% and costs $0.25 per successful update — well worth it.
Configure Dunning Emails
Go to Settings → Billing → Subscription and emails → Email customers when payment fails.
Enable the default email and customize the content. It's basic, but better than nothing. Include:
- Your brand name and logo
- Clear explanation of the issue
- A link to update their payment method (Stripe provides this automatically)
Stop losing revenue to failed payments
Rechurn recovers failed charges automatically with AI-powered dunning sequences. No revenue share — just a flat fee.
Start Free TrialStep 2: Set Up Webhook Listeners
To go beyond Stripe's defaults, you need to listen to payment events and take action. Here are the key webhooks:
Critical Webhooks
| Event | When It Fires | Your Action |
|-------|--------------|-------------|
| invoice.payment_failed | Payment attempt fails | Log failure, trigger dunning email |
| invoice.paid | Payment succeeds (including retries) | Stop dunning sequence |
| customer.subscription.updated | Subscription status changes | Track past_due → canceled |
| customer.source.expiring | Card expiring soon | Send pre-dunning alert |
| customer.subscription.deleted | Subscription canceled | Trigger win-back sequence |
Webhook Implementation
Set up a webhook endpoint in your application:
POST /api/webhooks/stripe
For each invoice.payment_failed event, extract:
- Customer ID — who needs to be contacted
- Invoice ID — which payment failed
- Attempt count — is this the first failure or a retry failure?
- Last payment error code — why did it fail? (
insufficient_funds,expired_card, etc.) - Amount — how much was the charge?
Use the decline code to determine your response:
- Soft declines (
insufficient_funds,processing_error): Schedule retry + send informational email - Hard declines (
expired_card,invalid_number): Don't retry, send urgent email asking customer to update card
Step 3: Build a Customer Update Portal
Stripe provides a hosted payment method update page via the Customer Portal. To set this up:
- Go to Settings → Billing → Customer portal
- Enable the portal
- Configure which actions customers can take (update payment method, manage subscriptions)
- Generate portal links to include in your dunning emails
The portal URL can be generated via the API:
POST /v1/billing_portal/sessions
Include this link as your primary CTA in every dunning email. The fewer clicks it takes to update a payment method, the higher your recovery rate.
Step 4: Build a Dunning Email Sequence
Stripe's single email isn't enough. Build a multi-step sequence triggered by webhooks:
| Email | Trigger | Timing |
|-------|---------|--------|
| 1. Friendly notice | invoice.payment_failed (attempt 1) | Immediately |
| 2. Reminder | invoice.payment_failed (attempt 2) | Day 3-4 |
| 3. Value reminder | Scheduled | Day 7 |
| 4. Save offer | Scheduled | Day 12 |
| 5. Final notice | Scheduled | Day 14 (48h before cancellation) |
Use a transactional email service (Resend, Postmark, SendGrid) — not your marketing email tool. Transactional emails have higher deliverability and don't conflict with marketing sends.
Key implementation details:
- Stop the sequence immediately when
invoice.paidfires - Personalize with customer name, plan, amount, and card last 4 digits
- Track opens and clicks to identify customers who see the email but don't act
- Include both HTML and plain text versions
See our dunning email templates and payment failure templates for copy-paste examples.
Step 5: Implement Save Offers
When a customer hasn't responded to emails and cancellation is approaching, offer alternatives:
Option 1: Discount
Create a Stripe Coupon and apply it to the subscription:
POST /v1/coupons
percent_off=20
duration=repeating
duration_in_months=3
Option 2: Pause
Update the subscription with pause_collection:
POST /v1/subscriptions/{sub_id}
pause_collection[behavior]=void
pause_collection[resumes_at]={timestamp}
Option 3: Downgrade
Change the subscription to a cheaper price:
POST /v1/subscriptions/{sub_id}
items[0][id]={item_id}
items[0][price]={cheaper_price_id}
Present these options in your Day 12 email with clear CTAs for each.
Stop losing revenue to failed payments
Rechurn recovers failed charges automatically with AI-powered dunning sequences. No revenue share — just a flat fee.
Start Free TrialStep 6: Automate Win-Back
After a subscription is canceled (customer.subscription.deleted webhook), start a win-back sequence:
- Day 3: "Your data is safe, reactivate anytime"
- Day 7: Reactivation discount offer
- Day 14: Reminder with feature highlights
- Day 30: Final email before data cleanup
Win-back campaigns typically recover 5-15% of involuntarily churned customers.
Step 7: Monitor Recovery Metrics
Track these metrics weekly:
- Recovery rate — failed payments recovered / total failed payments
- Recovery by decline code — which codes have the best/worst recovery
- Recovery by retry attempt — which attempt number succeeds most
- Email engagement — open and click rates by email position
- Save offer acceptance — which offers resonate most
- Time to recovery — average days from failure to recovery
Target Benchmarks
| Metric | Good | Great | |--------|------|-------| | Overall recovery rate | 65% | 80%+ | | Soft decline recovery | 75% | 90%+ | | Hard decline recovery | 40% | 60%+ | | Dunning email open rate | 45% | 60%+ | | Save offer acceptance | 10% | 25%+ |
The Build vs. Buy Decision
Building everything above takes significant engineering time:
- Webhook handling + event processing: 2-3 days
- Email sequence logic + templates: 3-5 days
- Save offer implementation: 2-3 days
- Analytics dashboard: 3-5 days
- Testing + edge cases: 2-3 days
- Total: 2-4 weeks of engineering time
Plus ongoing maintenance: handling Stripe API changes, email deliverability issues, retry logic bugs, and optimization.
Dedicated dunning software handles all of this for $30-100/month. For most SaaS teams, buying saves weeks of engineering time and delivers better results out of the box.
Key Takeaways
- Start with Stripe's built-in tools — enable Smart Retries, auto card updates, and basic dunning emails
- Add webhook listeners —
invoice.payment_failedandinvoice.paidare essential - Build a 5-email dunning sequence — one email isn't enough
- Route by decline code — soft declines get retried, hard declines get emails
- Offer save alternatives — discounts, pauses, and downgrades retain customers
- Track recovery metrics — target 70-85% overall recovery rate
- Consider buying vs. building — dunning software saves 2-4 weeks of engineering and typically delivers higher recovery rates
Ready to recover your lost revenue?
Join hundreds of SaaS companies using Rechurn to automatically recover failed payments. Set up in 5 minutes, no code changes required.
Start Free TrialNo credit card required. Cancel anytime.
Related articles
Stripe Smart Retries vs Dunning Software: Which Recovers More Revenue?
Compare Stripe's built-in Smart Retries with dedicated dunning software. Learn why SaaS companies recover 3-4x more revenue with proper dunning.
The Best Retry Schedule for Failed Payments in 2026
The optimal retry schedule for failed SaaS payments based on decline codes, card types, and industry data. Maximize recovery without annoying customers.
The Complete Guide to Dunning Management for SaaS
Everything you need to know about dunning management: what it is, why it matters, and how to build a dunning system that recovers 70-85% of failed payments.