Dunning Playbook
Complete guide to recovering failed payments and reducing involuntary churn.
Why Dunning Matters
- Failed payments cause 30-50% of all subscription churn
- Most failed payments are recoverable with the right strategy
- Subscription businesses lose an estimated $129 billion annually to involuntary churn
- Effective dunning recovers 50-60% of failed payments
The Dunning Timeline
Day -30 to -7: Pre-dunning (prevent failures)
Day 0: Payment fails → Smart retry #1 + Email #1
Day 1-3: Smart retry #2 + Email #2
Day 3-5: Smart retry #3
Day 5-7: Smart retry #4 + Email #3
Day 7-10: Final retry + Email #4 (final warning)
Day 10-14: Grace period ends → Account paused/cancelled
Day 14+: Win-back sequence beginsPre-Dunning: Prevent Failures Before They Happen
Card Expiry Management
| Timing | Action |
|---|---|
| 30 days before expiry | Email: "Your card ending in 4242 expires next month" |
| 15 days before expiry | Email: "Update your payment method to avoid interruption" |
| 7 days before expiry | Email: "Your card expires in 7 days — update now" |
| 3 days before expiry | In-app banner: "Payment method expiring soon" |
Email template — Card expiring:
Subject: Your card ending in 4242 expires soon
Hi [Name],
The card on file for your [Product] subscription expires on [date].
Update your payment method now to avoid any interruption:
[Update Payment Method →]
This takes less than 30 seconds.
— [Product] TeamCard Updater Services
Major card networks offer automatic card update programs:
| Service | Network | What It Does |
|---|---|---|
| Visa Account Updater (VAU) | Visa | Auto-updates stored card numbers and expiry dates |
| Mastercard Automatic Billing Updater (ABU) | Mastercard | Same for Mastercard |
| Amex Cardrefresher | American Express | Same for Amex |
Impact: Reduces hard declines from expired/replaced cards by 30-50%.
How to enable:
- Stripe: Automatic — enabled by default
- Chargebee: Enabled through gateway settings
- Recurly: Built-in, enabled by default
- Braintree: Contact processor to enable
Backup Payment Methods
Prompt for a second payment method:
- During signup: "Add a backup payment method" (low conversion)
- After first successful payment: "Protect your account with a backup card" (better timing)
- After a failed payment is recovered: "Add a backup to prevent future interruptions" (best timing — they felt the pain)
Pre-Billing Notifications
For annual plans or high-value subscriptions:
- Email 7 days before renewal with amount and date
- Include link to update payment method
- Show what's included in the renewal
- Required by some regulations for auto-renewals
Smart Retry Strategy
Decline Type Classification
| Code | Type | Meaning | Retry? |
|---|---|---|---|
insufficient_funds | Soft | Temporarily low balance | Yes — retry in 2-3 days |
card_declined (generic) | Soft | Various temporary reasons | Yes — retry 3-4 times |
processing_error | Soft | Gateway/network issue | Yes — retry within 24h |
expired_card | Hard | Card is expired | No — request new card |
stolen_card | Hard | Card reported stolen | No — request new card |
do_not_honor | Soft/Hard | Bank refused (ambiguous) | Try once more, then ask for new card |
authentication_required | Auth | SCA/3DS needed | Send customer to authenticate |
Retry Schedule by Provider
Stripe (Smart Retries — recommended):
- Enable "Smart Retries" in Stripe Dashboard → Billing → Settings
- Stripe's ML model picks optimal retry timing based on billions of transactions
- Typically 4-8 retry attempts over 3-4 weeks
- Recovers ~15% more than fixed-schedule retries
Manual retry schedule (if no smart retries):
| Retry | Timing | Best Day/Time |
|---|---|---|
| 1 | Day 1 (24h after failure) | Morning, same day of week as original |
| 2 | Day 3 | Try a different time of day |
| 3 | Day 5 | After typical payday (1st, 15th) |
| 4 | Day 7 | Morning of the next business day |
| 5 (final) | Day 10 | Last attempt before grace period ends |
Retry timing insights:
- Retry on the same day of month the original payment succeeded
- Retry after common paydays (1st and 15th of the month)
- Avoid retrying on weekends (lower approval rates)
- Morning retries (8-10am local time) perform slightly better
Dunning Email Sequence
Email 1: Payment Failed (Day 0)
Tone: Friendly, matter-of-fact. No alarm.
Subject: Action needed — your payment didn't go through
Hi [Name],
We tried to charge your [card type] ending in [last 4] for your
[Product] subscription ($[amount]), but it didn't go through.
This happens sometimes — usually a quick card update fixes it.
[Update Payment Method →]
Your access isn't affected yet. We'll retry automatically, but
updating your card is the fastest fix.
Need help? Just reply to this email.
— [Product] TeamEmail 2: Reminder (Day 3)
Tone: Helpful, slightly more urgent.
Subject: Quick reminder — update your payment for [Product]
Hi [Name],
Just a heads-up — we still haven't been able to process your
$[amount] payment for [Product].
[Update Payment Method →]
Takes less than 30 seconds. Your [data/projects/team access]
is safe, but we'll need a valid payment method to keep your
account active.
Questions? Reply here and we'll help.
— [Product] TeamEmail 3: Urgency (Day 7)
Tone: Direct, clear consequences.
Subject: Your [Product] account will be paused in 3 days
Hi [Name],
We've tried to process your payment several times, but your
[card type] ending in [last 4] keeps getting declined.
If we don't receive payment by [date], your account will be
paused and you'll lose access to:
• [Key feature/data they use]
• [Their projects/workspace]
• [Team access for X members]
[Update Payment Method Now →]
Your data won't be deleted — you can reactivate anytime by
updating your payment method.
— [Product] TeamEmail 4: Final Warning (Day 10)
Tone: Final, clear, no guilt.
Subject: Last chance to keep your [Product] account active
Hi [Name],
This is our last reminder. Your payment of $[amount] is past
due, and your account will be paused tomorrow ([date]).
[Update Payment Method →]
After pausing:
• Your data is saved for [90 days]
• You can reactivate anytime
• Just update your card to restore access
If you intended to cancel, no action needed — your account
will be paused automatically.
— [Product] TeamGrace Period Management
What Happens During Grace Period
| Setting | Recommendation |
|---|---|
| Duration | 7-14 days after final retry |
| Access | Degraded (read-only) or full access |
| Visibility | In-app banner: "Payment past due — update to continue" |
| Retry | Continue background retries during grace |
| Communication | Dunning emails continue |
Access Degradation Options
Option A: Full access during grace (recommended for B2B)
- Lower friction, customer feels respected
- Higher recovery rate (they still see value)
- Risk: some customers exploit the grace period
Option B: Read-only access (recommended for B2C)
- Can view but not create/edit
- Creates urgency without data loss fear
- Clear message: "Update payment to resume full access"
Option C: Immediate lockout (not recommended)
- Aggressive, damages relationship
- Lower recovery rate
- Only appropriate for very low-cost plans
Post-Grace Period
| Timing | Action |
|---|---|
| Grace period ends | Pause account (not delete) |
| Day 1 post-pause | "Your account has been paused" email |
| Day 7 post-pause | "Your data is still here" reminder |
| Day 30 post-pause | Win-back attempt with new offer |
| Day 60 post-pause | Final win-back |
| Day 90 post-pause | Data deletion warning (if applicable) |
Provider-Specific Setup
Stripe
Enable Smart Retries:
- Dashboard → Settings → Billing → Subscriptions and emails
- Enable "Smart Retries" under retry rules
- Set failed payment emails in Dashboard → Settings → Emails
Custom retry rules (if not using Smart Retries):
Retry 1: 3 days after failure
Retry 2: 5 days after failure
Retry 3: 7 days after failure
Final: Mark subscription as unpaid after last retryWebhook events to handle:
invoice.payment_failed— trigger dunninginvoice.paid— cancel dunning, restore accesscustomer.subscription.updated— status changescustomer.subscription.deleted— final cancellation
Chargebee
Built-in dunning:
- Settings → Configure Chargebee → Retry Settings
- Configure retry attempts and intervals
- Settings → Configure Chargebee → Email Notifications → Dunning
Dunning options:
- Automatic retries with configurable schedule
- Built-in dunning emails (customizable templates)
- Grace period configuration per plan
Paddle
Managed dunning:
- Paddle handles retries and dunning automatically
- Limited customization (Paddle manages the relationship)
- Webhook:
subscription.payment_failed,subscription.cancelled - Best for hands-off approach
Recurly
Revenue Recovery:
- Configuration → Dunning Management
- Set retry schedule per plan
- Configure grace period and final action (pause vs cancel)
Advanced features:
- Machine-learning retry optimization
- Per-plan dunning schedules
- Built-in Account Updater
In-App Dunning
Don't rely on email alone. Show payment failures in the app:
Banner Pattern
┌──────────────────────────────────────────────────────┐
│ ⚠ Your payment of $29 failed. Update your card to │
│ avoid losing access. [Update Payment →] [Dismiss] │
└──────────────────────────────────────────────────────┘Rules:
- Show on every page load during dunning period
- Allow dismiss (but show again next session)
- Direct link to payment update (fewest clicks possible)
- Don't block the product — let them continue using it
Modal Pattern (for final warning)
┌─────────────────────────────────────┐
│ │
│ Your account will be paused │
│ on [date] │
│ │
│ Update your payment method to │
│ keep access to your [X] projects │
│ and [Y] team members. │
│ │
│ [Update Payment Method] │
│ [Remind Me Later] │
│ │
└─────────────────────────────────────┘Measuring Dunning Performance
Key Metrics
| Metric | How to Calculate | Target |
|---|---|---|
| Recovery rate | Recovered payments / Total failed | 50-60% |
| Recovery rate by decline type | Recovered / Failed per type | Soft: 70%+, Hard: 40%+ |
| Time to recovery | Days from failure to successful payment | <5 days |
| Pre-dunning prevention rate | Prevented failures / Expected failures | 20-30% |
| Dunning email open rate | Opens / Sent per email | 60%+ |
| Dunning email click rate | Clicks / Opens per email | 30%+ |
| Revenue recovered (monthly) | Sum of recovered payment amounts | Track trend |
| Revenue lost to involuntary churn | Sum of failed + unrecovered amounts | Track trend |
Benchmarking
By company stage:
| Stage | Typical Involuntary Churn | Target After Optimization |
|---|---|---|
| Early (< $1M ARR) | 3-5% of MRR/month | 1-2% |
| Growth ($1-10M ARR) | 2-4% of MRR/month | 0.5-1.5% |
| Scale ($10M+ ARR) | 1-3% of MRR/month | 0.3-0.8% |
ROI Calculation
Monthly failed payment MRR: $10,000
Current recovery rate: 30% ($3,000 recovered)
Target recovery rate: 60% ($6,000 recovered)
Monthly improvement: $3,000/month
Annual improvement: $36,000/year
Cost of dunning optimization: ~$200-500/month (tooling)
ROI: 6-15x