Stripe Dunning Management: The Complete Guide for SaaS Founders
Dunning is more than retries. Here's the full recovery stack that separates a 30% recovery rate from a 70% one.
If you run a SaaS on Stripe, you've probably heard the term “dunning” thrown around. Maybe you've enabled Smart Retries and figured the problem is solved. It's not.
Dunning management is the entire process of recovering failed recurring payments — from the moment a charge is declined to the moment the customer either pays or churns. It includes retries, yes, but also emails, card update flows, grace periods, escalation logic, and the analytics to know what's working.
Most SaaS companies are leaving 5-7% of their MRR on the table because they're only doing the first piece. This guide covers all of it.
What Dunning Management Actually Is (And Isn't)
Let's clear up a common confusion: dunning management is not the same as retry logic.
Retry logic is one component — the automated re-attempt of a failed charge. Dunning management is the full orchestration layer around failed payments:
- Retry scheduling — When and how often to re-attempt the charge, based on the decline reason
- Customer communication — Emails that notify the customer, explain what happened, and give them a clear action
- Card update flows — A hosted page where the customer can enter new payment details without logging in
- Escalation logic — Progressively urgent messaging and eventual access gating or cancellation
- Analytics — Visibility into recovery rates, failure reasons, and which interventions are actually working
Think of it this way: retry logic tries to fix the problem silently. Dunning management assumes some problems can't be fixed silently — because the customer needs to take action — and builds the system to make that action as frictionless as possible.
Stripe's Built-In Dunning Tools
Stripe ships three native recovery mechanisms. They're a reasonable starting point, but each has real limitations.
Smart Retries
Stripe's ML-powered retry engine uses data from billions of transactions to find the optimal retry time for each failed charge. In 2024, Smart Retries recovered $6 billion across the platform.
What it does well: Timing. Stripe knows that retrying an insufficient-funds decline at 9 AM on a Friday has a different success rate than retrying at 2 PM on a Tuesday. The ML model handles this automatically.
What it doesn't do:Smart Retries only retries charges. It doesn't notify the customer, provide a way to update their card, segment by decline reason, or give you any visibility into what's happening. For expired cards — roughly 25% of all failures — retrying the same dead card accomplishes nothing.
Automated Emails
Stripe offers built-in email notifications for failed payments. You can enable them in Settings → Billing → Subscriptions and emails.
These emails are functional but limited:
- Generic templates — the same message regardless of whether the card expired or had insufficient funds
- Stripe-branded — they come from Stripe, not your company, which confuses customers
- Fixed schedule — you can't control the timing or frequency
- No card update link — the email tells the customer to “update their payment method” but doesn't provide a direct link to do so
- No segmentation — an enterprise customer and a $9/mo trial get the exact same email
Revenue Recovery
Stripe's Revenue Recovery dashboard (available on paid plans) shows aggregate data about failed payments and recovery rates. It tells you how much was recovered and how much was lost.
The limitation:It's reporting, not intervention. It shows you the problem but doesn't give you tools to fix it. You can see that 40% of failures are expired cards but can't create a targeted email campaign for those specific customers.
The Gap: Why Native Tools Leave Money on the Table
Stripe's tools address the most basic case: retry the charge and maybe send an email. For a significant percentage of failures, that's not enough.
| Capability | Stripe Native | Full Dunning Stack |
|---|---|---|
| Smart retry timing | Yes | Yes |
| Retry by decline code | Limited | Yes — skip retries for expired cards, prioritize soft declines |
| Branded emails from your domain | No | Yes |
| Emails segmented by failure type | No | Yes — different copy for expired vs. insufficient funds |
| One-click card update page | No (link to Stripe portal) | Yes — no login required, pre-authenticated |
| Escalation sequences | Basic (up to 3 retries) | Yes — timed emails with increasing urgency |
| Recovery analytics dashboard | Basic aggregate | Yes — per-email, per-decline-code, per-cohort |
| Grace period management | Manual | Automated with configurable windows |
| Pre-expiry warnings | No | Yes — email before the card expires |
The fundamental gap is this: Stripe optimizes the charge. A proper dunning stack optimizes the customer journeyfrom failure to recovery. That journey often requires the customer to do something — update a card, check their bank, try a different payment method — and Stripe's native tools don't make that easy.
The Full Dunning Stack
A complete dunning system has four layers. Each one adds incremental recovery percentage. Here's how they stack up:
Layer 1: Smart Retries (~27-33% recovery)
The foundation. Automatically re-attempt failed charges with intelligent timing. This recovers the “easy” failures — temporary insufficient funds, soft bank declines, and network glitches that resolve on their own.
Best practices:
- Use Stripe's Smart Retries as the base — their ML model is hard to beat on timing alone
- Layer on decline-code awareness: don't retry expired cards (waste of attempts), retry insufficient funds after 2-3 days (payday timing), retry soft declines within 24 hours
- Cap retries at 4-6 attempts over 14 days — more than that damages your decline rate with the card network
Layer 2: Dunning Emails (~45-55% recovery)
This is where the biggest jump happens. A well-crafted email sequence adds 15-22 percentage points of recovery on top of retries alone. The key is that emails activate the customer to solve problems that retries can't — like entering a new card number.
What makes dunning emails effective:
- Speed — First email within 2 hours of failure. Day-0 emails have a 41% open rate; by day 3, that drops to 35%.
- Segmentation— “Your card ending in 4242 has expired” is far more actionable than “We couldn't process your payment.”
- Branded — Emails should come from your company, not Stripe. Customers trust emails from services they recognize.
- Clear CTA— Every email needs one button: update your card. Not “log in to your account and navigate to billing settings.”
- Escalation — Email 1 is friendly. Email 3 mentions that access will be paused. Email 4 is the final notice. 4 emails max — more is spam.
Layer 3: Card Update Pages (~60-65% recovery)
This is the most underused layer in dunning. A card update page is a hosted form where the customer can enter new payment details with a single click from the email — no login required.
Why it matters: the biggest friction point in payment recovery is asking the customer to log in, navigate to billing, and update their card. Most won't. A pre-authenticated link that goes straight to a branded payment form with their subscription details pre-filled removes that friction entirely.
Implementation details:
- Use Stripe's Customer Portal or build a custom page with Stripe Elements
- Generate a unique, time-limited token for each customer so the link works without authentication
- Show the customer what they're paying for — plan name, amount, next billing date
- Include a success confirmation and immediately retry the failed charge after the card is updated
Layer 4: Analytics (~65-70% recovery)
Analytics doesn't directly recover payments, but it tells you where to improve. Without it, you're optimizing blind.
What to track:
- Recovery rate by decline code — Are you recovering expired cards at the same rate as insufficient funds? If not, your expired-card email needs work.
- Recovery rate by email — Which email in the sequence drives the most recoveries? If email 3 never converts, cut it and add the value to email 2.
- Time to recovery — How many days does it take on average? If most recoveries happen in the first 3 days, your 14-day grace period might be too generous.
- Card update page conversion — What percentage of customers who click the link actually complete the update?
- Revenue recovered vs. lost — The bottom line. Track this monthly and set a target.
Recovery Rate Benchmarks
Based on aggregate data from SaaS companies processing $1M-$50M in annual recurring revenue:
| Approach | Recovery Rate | What You're Using |
|---|---|---|
| Stripe defaults (no configuration) | ~23% | Smart Retries only, default settings |
| Retries only (optimized) | ~27-33% | Smart Retries + decline-code-aware scheduling |
| Retries + dunning emails | ~45-55% | Optimized retries + 3-4 segmented, branded emails |
| Retries + emails + card update | ~60-65% | Above + no-login card update page in every email |
| Full stack (retries + emails + card update + analytics) | ~65-70% | Above + data-driven optimization of each layer |
The jump from “retries only” to “retries + emails” is the single biggest improvement you can make. The card update page is the second biggest. Analytics compounds everything over time.
How to Set Up Proper Dunning on Stripe
Here's a step-by-step setup, from zero to full dunning stack. This assumes you're on Stripe Billing with recurring subscriptions.
Step 1: Configure Smart Retries
Go to Settings → Billing → Subscriptions and emails → Manage failed payments. Enable Smart Retries if it isn't already. Set your retry schedule to the maximum allowed (typically 4 retries over 3-4 weeks).
Configure the subscription status after all retries fail: set it to “Cancel subscription” or “Mark as unpaid” depending on your preference. Most SaaS companies prefer “unpaid” so the customer can reactivate without re-subscribing.
Step 2: Set Up Webhook Listeners
To build anything beyond Stripe's defaults, you need to listen for payment events. Set up webhooks for:
invoice.payment_failed— Triggers your dunning sequenceinvoice.payment_succeeded— Ends the dunning sequence (customer recovered)customer.subscription.updated— Detects status changes (active → past_due → unpaid)customer.source.expiring— Triggers pre-expiry notifications
Step 3: Build Your Email Sequence
Use your existing email provider (Resend, SendGrid, Postmark, etc.) to send branded dunning emails. The sequence:
- Email 1 (Day 0, within 2 hours)— Friendly notification. “Quick heads-up: we couldn't process your payment for [Plan Name].” Include decline-specific copy and a card update button.
- Email 2 (Day 3)— Gentle follow-up. “Just a reminder — your [Plan Name] subscription needs attention.” Reiterate the card update link.
- Email 3 (Day 7)— Urgency. “Action required: your access to [Product] will be paused in 7 days.” Clear deadline.
- Email 4 (Day 12-14)— Final notice. “Last chance to keep your [Plan Name] subscription active.” Mention what they'll lose.
Step 4: Create a Card Update Page
Build a page (or use Stripe's Customer Portal) where customers can update their payment method. The page should:
- Accept a secure, time-limited token in the URL (no login needed)
- Show the customer's plan details and amount due
- Use Stripe Elements for the card form
- Immediately retry the failed invoice after the card is updated (use the Stripe API:
invoice.pay()) - Show a confirmation with the next billing date
Step 5: Add Pre-Expiry Notifications
Listen for customer.source.expiring webhooks and email customers 30 days before their card expires. This prevents failures before they happen — the cheapest recovery is the one you never need.
Step 6: Build Your Recovery Dashboard
Track your key metrics: total failed, total recovered, recovery rate by decline code, recovery rate by email, and revenue impact. Review monthly and optimize.
Or skip the build: This is 2-4 weeks of engineering work if you build it yourself — webhooks, email integration, hosted pages, token management, retry logic, and analytics. Tools like RetryHero handle all six steps out of the box with a single Stripe connection, so your team can ship features instead of building billing infrastructure.
7 Common Dunning Mistakes
These are the patterns we see most often in SaaS companies that are “doing dunning” but getting poor results:
1. Waiting Too Long to Contact the Customer
The data is clear: emails sent within 2 hours of failure recover 3× more than emails sent on day 3. Every hour you wait, the customer is less likely to act. If your dunning sequence starts with “wait 3 days, then send an email” — you're starting from behind.
2. Sending Aggressive or Threatening Emails
Remember: involuntary churn means the customer wantedto keep paying. They didn't cancel. Their card failed. Treating them like a delinquent debtor (“Your account is past due. Immediate action required.”) damages the relationship.
The first email should feel like a helpful heads-up from a friend, not a collections notice. Save the urgency for email 3 or 4.
3. No Card Update Flow
This is the single most common gap. You email the customer saying their payment failed, but the only action you offer is “log in to update your payment method.” The customer has to remember their password, navigate your settings, find the billing section, and update their card. Most won't.
A one-click, pre-authenticated card update link recovers 10-15% more payments than a “log in to fix this” email.
4. Treating All Failures the Same
An expired card and an insufficient-funds decline are completely different problems with completely different solutions. Expired cards need a card update email immediately — retrying is pointless. Insufficient funds need a retry in 2-3 days — an urgent email is premature. If your dunning system sends the same message regardless of the decline code, you're leaving recovery on the table.
5. Ignoring Analytics
You can't improve what you don't measure. If you don't know your recovery rate by decline code, which email drives the most updates, or how long the average recovery takes, you're optimizing blind. Even basic tracking — a spreadsheet of monthly failed vs. recovered — is better than nothing.
6. Too Many Retries
Retrying a declined card 8 or 10 times doesn't increase your recovery rate — it increases your decline rate with card networks. High decline rates can lead to higher processing fees or even account flags. Cap retries at 4-6 over 14-21 days. After that, the customer needs to update their card.
7. No Grace Period
Immediately cancelling a subscription on first failure is the nuclear option. The customer's card might work tomorrow. Give them 7-14 days of continued access while you attempt recovery. During the grace period, show an in-app banner reminding them to update their payment method. After the grace period, pause access but keep the subscription — let them reactivate by updating their card.
The ROI of Proper Dunning
Let's put real numbers on the gap between Stripe defaults and a full dunning stack:
| Your MRR | Annual Failed (~9%) | At 23% (Defaults) | At 65% (Full Stack) | Extra Revenue |
|---|---|---|---|---|
| $10,000 | $10,800 | $2,484 | $7,020 | +$4,536/yr |
| $25,000 | $27,000 | $6,210 | $17,550 | +$11,340/yr |
| $50,000 | $54,000 | $12,420 | $35,100 | +$22,680/yr |
| $100,000 | $108,000 | $24,840 | $70,200 | +$45,360/yr |
At $25K MRR, the difference is $945/month— nearly $1,000 of revenue you're currently losing. At $100K MRR, it's $3,780/month. This isn't growth hacking or speculative upside. It's revenue your customers already committed to paying.
Quick-Start Checklist
If you take one thing from this guide, take this checklist. In order of impact:
- Enable Smart Retries— If you haven't already: Settings → Billing → Subscriptions and emails
- Send a day-0 email — Within 2 hours of failure, branded from your company, with a card update link
- Build a card update page — Pre-authenticated, no-login-required. This single addition adds 10-15% recovery.
- Add 2-3 follow-up emails — Escalating urgency at days 3, 7, and 14
- Segment by decline code — Different messaging for expired cards vs. insufficient funds vs. generic declines
- Set a grace period — 7-14 days of continued access while you attempt recovery
- Track your recovery rate — Monthly, by decline code. Set a target of 60%+.
- Add pre-expiry notifications — Email 30 days before a card expires to prevent failures entirely
Dunning management isn't glamorous work. It doesn't make for exciting product announcements or impressive demo videos. But for subscription businesses, it's one of the highest-ROI investments you can make — because you're not acquiring new customers, you're keeping the ones who already chose to pay you.
The difference between a 23% and 65% recovery rate is the difference between accepting involuntary churn as a cost of doing business and treating it as a solvable problem. It is solvable. The stack exists. The benchmarks are proven. The only question is whether you build it yourself or use a tool that does it for you.
Full dunning stack, zero engineering time
RetryHero connects to Stripe in 2 minutes and handles smart retries, branded emails, card update pages, and recovery analytics — all for $29/mo flat.
Join the waitlist →