What is Stripe dunning?
Dunning is the process of communicating with customers after a payment failure to recover the failed charge. In the context of Stripe subscriptions, dunning typically involves:
- Notifying the customer that their payment failed
- Giving them a direct link to update their payment method
- Following up if the first message doesn't work
- Escalating urgency as time passes
- Stopping the sequence when payment is successfully recovered
Stripe has built-in dunning functionality, but it's limited. Understanding its limitations is the first step to building something better.
What Stripe's default dunning does (and doesn't do)
Stripe has two built-in systems for handling failed payments:
Smart Retries
Stripe automatically retries failed charges over the next 4–8 days using ML to pick the optimal retry times. This is enabled by default and works in the background without any setup. However, it only addresses the technical retry — it doesn't communicate with your customer at all.
Stripe's built-in dunning emails
You can enable these in Stripe Dashboard → Settings → Billing → Automatic collection. Stripe will send emails to customers when:
- A payment fails
- A retry succeeds
- A subscription is cancelled due to non-payment
The problem with Stripe's default emails
Stripe's dunning emails are generic, unbranded, and often land in spam. They don't include your product name prominently, they use Stripe's domain (not yours), and they offer no way to customise the tone or sequence timing. Most SaaS businesses see open rates below 15% on them.
Why you need custom dunning emails
A well-configured custom dunning sequence outperforms Stripe's defaults by 2–3x because:
- Sender domain: Email from
[email protected]gets far better deliverability and open rates than Stripe's generic sender - Brand recognition: Customers recognise your product name, not Stripe's
- Personalisation: You can reference their specific product tier, feature usage, or time with your product
- Timing control: You decide when D+1, D+3, and D+7 are sent — not Stripe
- Failure reason customisation: You can craft different messages for expired cards vs. insufficient funds vs. bank declines
Stripe dunning email templates (D+1, D+3, D+7)
Day 1 — Within 2 hours of failure
Send this as soon as possible. Speed is the biggest factor in recovery rates — getting this out within 2 hours vs. 24 hours can mean a 15–20% difference in recovery.
Day 3 — Gentle reminder
Day 7 — Final notice
This email has the highest conversion rate because the consequence is real and specific. Make the date concrete — don't say "soon."
The Stripe Billing Portal URL
For each email, you need to generate a stripe.billingPortal.sessions.create() session URL for that specific customer. This gives them a one-click link directly to their payment method management page — no login required. This single feature dramatically increases conversion vs. sending customers to a generic login page.
How to set up Stripe dunning yourself
Here's the complete technical setup if you want to build this yourself:
Step 1: Subscribe to webhook events
In Stripe Dashboard → Developers → Webhooks, create an endpoint that listens to:
invoice.payment_failed— triggers your dunning sequenceinvoice.payment_succeeded— stops your dunning sequencecustomer.subscription.deleted— handle subscription cancellation
Step 2: Store recovery state
When invoice.payment_failed fires, record in your database:
- Customer ID and email
- Invoice ID and amount
- Failure timestamp
- Recovery status (
pending,d1_sent,d3_sent,d7_sent,recovered,failed)
Step 3: Run a cron job
Set up an hourly cron job that checks your database for customers who are at the D+1, D+3, or D+7 mark. For each:
- Generate a Stripe Billing Portal session URL
- Send the appropriate email via your transactional email provider (Resend, Postmark, SendGrid)
- Update the recovery status in your database
Step 4: Handle the stop condition
When invoice.payment_succeeded fires for a customer who is in a recovery sequence, immediately update their status to recovered. Do not send any more dunning emails. This is critical — sending a "final warning" after payment succeeds destroys trust.
Expected build time: 1–2 days for an experienced developer. Ongoing maintenance includes monitoring email deliverability, handling edge cases, and updating copy.
Dunning email best practices
- Send from your own domain: Deliverability matters. Use a transactional email provider with proper DKIM/SPF setup on your domain.
- Keep it short: 3–5 sentences maximum. The only call to action is the card update link.
- Be specific about the amount: Always include the exact dollar amount. Vague payment failure emails feel like phishing.
- Include the billing portal link prominently: Don't bury it. Make it the most visible element in the email.
- Don't be accusatory: Payment failures are usually the bank's fault, not the customer's. Tone should be helpful, not punitive.
- Make the D+7 consequence specific: "Your account will be paused on March 16" is more effective than "your account will be paused soon."
- Test your subject lines: Open rate is the biggest leverage point. D+1 subject lines mentioning the product name outperform generic "payment failed" subjects.
What to expect: Stripe dunning recovery rates
- Stripe's default dunning: 5–15% recovery rate (generic emails, poor deliverability)
- Custom D+1/D+3/D+7 with billing portal links: 25–40% recovery rate
- Optimised sequences with failure-reason personalisation: 40–60% recovery rate
The biggest variable in your favour: speed. Getting the D+1 email out within 2 hours of the invoice.payment_failed event — not 24 hours later — is the single highest-ROI improvement you can make.
Stripe dunning vs. involuntary churn recovery: same thing?
Yes — dunning is the industry term for the process of recovering failed payments. When SaaS founders talk about reducing involuntary churn, they're usually talking about improving their dunning process. The terms are often used interchangeably:
- Dunning: the email sequence you send after a payment fails
- Involuntary churn recovery: the broader result — getting customers back who left due to payment failure, not product dissatisfaction
- Failed payment recovery: the technical process of re-charging and recovering the revenue