A dunning sequence is the series of messages and actions you trigger when a payment fails. Get it right, and you recover 60-70% of failed payments. Get it wrong, and customers churn without ever knowing there was a problem.
This guide walks through setting up a dunning sequence from scratch.
Before you build: Key decisions
1. How long is your grace period?
The grace period is the time between payment failure and subscription cancellation.
Recommendations:
- B2C SaaS: 7-10 days
- B2B SaaS: 10-14 days
- Enterprise: 14-21 days
Longer isn't always better — you're providing free service during this time.
2. How many touchpoints?
Most effective sequences have 4-6 touchpoints across the grace period. Too few and customers miss the message. Too many and you're spamming.
3. What channels?
Email is the baseline. SMS significantly improves recovery (15-25% lift). Use both if possible.
4. What triggers suspension vs cancellation?
Some businesses suspend (access removed, account preserved) before full cancellation (data deleted). Decide your policy.
The sequence framework
Here's a proven framework for a 10-day grace period:
Day 0: Payment fails
Actions:
- Detect failure via webhook
- Classify as soft decline or hard decline
- Schedule first retry (if soft decline)
- Send first notification email
Email #1: Informational
Purpose: Let them know there's a problem.
Tone: Friendly, not alarming.
Content:
- What happened: "Your payment didn't go through"
- Why it matters: Brief mention of service continuity
- What to do: One clear CTA to update payment
- What happens next: "We'll retry in a few days"
Day 2-3: First reminder
Actions:
- Second retry attempt
- Send reminder email
Email #2: Gentle reminder
Purpose: Remind those who missed or ignored email #1.
Tone: Slightly more direct.
Content:
- Reiterate the problem
- Mention the grace period: "You have until [date]"
- CTA to update payment
- Offer help if there's an issue
Day 4-5: Add urgency
Actions:
- Third retry attempt
- Send SMS (if enabled)
- Send urgent email
SMS #1:
[Name], your [Product] payment failed. Update your card to keep access: [link]
Email #3: Urgency
Purpose: Create urgency without being threatening.
Tone: Direct, concerned.
Content:
- Clear deadline: "Your account will be suspended in 3 days"
- Explain what they'll lose
- CTA prominently placed
- Offer to help
Day 7: Final warning
Actions:
- Final retry attempt
- Send final warning email and SMS
Email #4: Final warning
Purpose: Last chance before action.
Tone: Urgent but not aggressive.
Content:
- "This is your final reminder"
- Suspension happens tomorrow
- What to do right now
- What happens to their data
SMS #2:
Final reminder: Your [Product] access will be suspended tomorrow. Fix it now: [link]
Day 8-10: Suspension
Actions:
- Suspend subscription (remove access)
- Send suspension notification
- Begin win-back sequence
Email #5: Suspension notice
Purpose: Confirm what happened and offer path back.
Tone: Matter-of-fact, door open for return.
Content:
- "Your account has been suspended"
- Data is safe for X days
- How to reactivate: one click
- No hard feelings
Day 14+: Win-back
Actions:
- Send win-back email
- Optional: SMS
- Eventually: full cancellation
Email #6: Win-back
Purpose: Recover customers who might want to return.
Tone: Friendly, low-pressure.
Content:
- "We miss you"
- Easy return with one click
- Maybe mention what they're missing
- Respect if they don't return
Setting up the automation
If using Stripe Billing
Stripe has built-in dunning via Smart Retries and email notifications:
- Go to Settings → Billing → Subscriptions
- Configure retry schedule
- Enable email notifications
- Customize email templates (limited customization)
Stripe's built-in dunning is basic. For better results, use a dedicated tool.
If using a dunning tool
Tools like Rekko, Churnkey, or Stunning handle this:
- Connect your Stripe account
- Configure grace period
- Set up email sequence (use their templates or customize)
- Enable SMS if available
- Configure retry logic
- Set suspension/cancellation triggers
These tools provide better templates, multi-channel, and analytics.
If building custom
You'll need:
- Webhook listener — Catch
invoice.payment_failedfrom Stripe - State management — Track each customer's dunning stage
- Job scheduler — Queue emails and retries at specific times
- Email service — Transactional email (SendGrid, SES, etc.)
- SMS service — Twilio, MessageBird, etc.
- Payment link generator — Create update links for customers
It's doable but significant engineering effort.
Message templates
Email 1: Initial notification
Subject: Your [Product] payment didn't go through
Hey [Name],
We tried to charge your card for your [Product] subscription ($[amount]), but it didn't go through.
This usually happens when:
- Your card expired
- There weren't enough funds
- Your bank blocked the charge
No worries — just update your payment info and you're all set:
[Update Payment Button]
We'll automatically retry in a few days, but updating now ensures no interruption.
Questions? Just reply to this email.
[Your team]
Email 4: Final warning
Subject: Final notice: Your [Product] account will be suspended
[Name],
This is your last reminder before we suspend your [Product] account.
We've tried multiple times to process your $[amount] payment without success. If we don't receive payment by [date], your access will be suspended.
Here's what that means:
- You won't be able to log in
- [Specific feature loss]
- Your data will be safe for 30 days
Fix this now — it takes 30 seconds:
[Update Payment Button]
If something's wrong and you need help, reply to this email.
[Your team]
SMS: Day 5 reminder
Hi [Name], your [Product] payment failed. Your account will be suspended in 3 days unless you update your card: [link]
Testing your sequence
Before going live:
- Test with your own account — Trigger a failure, watch the sequence
- Check all links — Every CTA should work
- Review on mobile — 60%+ of emails are opened on phones
- Test SMS delivery — Verify messages arrive correctly
- Confirm suspension logic — Does access actually get removed?
- Test reactivation — Can suspended users easily return?
Measuring success
Track these metrics:
- Recovery rate — % of failed payments recovered
- Recovery by day — Which touchpoint drives most recoveries?
- Open rate by email — Which subjects work?
- Click rate — Is the CTA effective?
- SMS recovery rate — Is SMS worth the cost?
Use data to optimize. If Email #2 has low opens, try a different subject. If day 7 recoveries spike, your urgency messaging works.
Common mistakes
Starting too late. First email should go out within hours of failure, not days.
Being too gentle. By email #4, be direct. "Your subscription will be canceled" is clearer than "there may be an interruption."
Too many emails, too few channels. 6 emails but no SMS is less effective than 4 emails + 2 SMS.
Hard-to-find CTA. The update payment link should be impossible to miss.
No mobile optimization. Test on actual phones.
Forgetting hard declines. Hard declines need different messaging — retries won't help.
One-size-fits-all. High-value customers might deserve a phone call, not just emails.
A well-built dunning sequence pays for itself many times over. Take time to set it up right.