Skill Tracer
Skills › Marketing Skills › churn-prevention › dunning-playbook.md

dunning-playbook.md

416 lines · skills/churn-prevention/references/dunning-playbook.md at 88c79f6

Open on GitHub
1# Dunning Playbook
2
3Complete guide to recovering failed payments and reducing involuntary churn.
4
5---
6

Dunning Playbook

Complete guide to recovering failed payments and reducing involuntary churn.


Raw lines 1 to 6
7## Why Dunning Matters
8
9- Failed payments cause 30-50% of all subscription churn
10- Most failed payments are recoverable with the right strategy
11- Subscription businesses lose an estimated $129 billion annually to involuntary churn
12- Effective dunning recovers 50-60% of failed payments
14---

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

Raw lines 7 to 15
16## The Dunning Timeline
18```
19Day -30 to -7: Pre-dunning (prevent failures)
20Day 0: Payment fails → Smart retry #1 + Email #1
21Day 1-3: Smart retry #2 + Email #2
22Day 3-5: Smart retry #3
23Day 5-7: Smart retry #4 + Email #3
24Day 7-10: Final retry + Email #4 (final warning)
25Day 10-14: Grace period ends → Account paused/cancelled
26Day 14+: Win-back sequence begins
27```
29---

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 begins

Raw lines 16 to 30
31## Pre-Dunning: Prevent Failures Before They Happen

Pre-Dunning: Prevent Failures Before They Happen

Raw lines 31 to 32
33### Card Expiry Management
35| Timing | Action |
36|--------|--------|
37| 30 days before expiry | Email: "Your card ending in 4242 expires next month" |
38| 15 days before expiry | Email: "Update your payment method to avoid interruption" |
39| 7 days before expiry | Email: "Your card expires in 7 days — update now" |
40| 3 days before expiry | In-app banner: "Payment method expiring soon" |
42**Email template — Card expiring:**
43```
44Subject: Your card ending in 4242 expires soon
46Hi [Name],
48The card on file for your [Product] subscription expires on [date].
50Update your payment method now to avoid any interruption:
52[Update Payment Method →]
54This takes less than 30 seconds.
56— [Product] Team
57```

Card Expiry Management

TimingAction
30 days before expiryEmail: "Your card ending in 4242 expires next month"
15 days before expiryEmail: "Update your payment method to avoid interruption"
7 days before expiryEmail: "Your card expires in 7 days — update now"
3 days before expiryIn-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] Team
Raw lines 33 to 58
59### Card Updater Services
61Major card networks offer automatic card update programs:
63| Service | Network | What It Does |
64|---------|---------|--------------|
65| Visa Account Updater (VAU) | Visa | Auto-updates stored card numbers and expiry dates |
66| Mastercard Automatic Billing Updater (ABU) | Mastercard | Same for Mastercard |
67| Amex Cardrefresher | American Express | Same for Amex |
69**Impact:** Reduces hard declines from expired/replaced cards by 30-50%.
71**How to enable:**
72- **Stripe**: Automatic — enabled by default
73- **Chargebee**: Enabled through gateway settings
74- **Recurly**: Built-in, enabled by default
75- **Braintree**: Contact processor to enable

Card Updater Services

Major card networks offer automatic card update programs:

ServiceNetworkWhat It Does
Visa Account Updater (VAU)VisaAuto-updates stored card numbers and expiry dates
Mastercard Automatic Billing Updater (ABU)MastercardSame for Mastercard
Amex CardrefresherAmerican ExpressSame 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
Raw lines 59 to 76
77### Backup Payment Methods
79Prompt for a second payment method:
80- During signup: "Add a backup payment method" (low conversion)
81- After first successful payment: "Protect your account with a backup card" (better timing)
82- After a failed payment is recovered: "Add a backup to prevent future interruptions" (best timing — they felt the pain)

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)
Raw lines 77 to 83
84### Pre-Billing Notifications
86For annual plans or high-value subscriptions:
87- Email 7 days before renewal with amount and date
88- Include link to update payment method
89- Show what's included in the renewal
90- Required by some regulations for auto-renewals
92---

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

Raw lines 84 to 93
94## Smart Retry Strategy

Smart Retry Strategy

Raw lines 94 to 95
96### Decline Type Classification
98| Code | Type | Meaning | Retry? |
99|------|------|---------|--------|
100| `insufficient_funds` | Soft | Temporarily low balance | Yes — retry in 2-3 days |
101| `card_declined` (generic) | Soft | Various temporary reasons | Yes — retry 3-4 times |
102| `processing_error` | Soft | Gateway/network issue | Yes — retry within 24h |
103| `expired_card` | Hard | Card is expired | No — request new card |
104| `stolen_card` | Hard | Card reported stolen | No — request new card |
105| `do_not_honor` | Soft/Hard | Bank refused (ambiguous) | Try once more, then ask for new card |
106| `authentication_required` | Auth | SCA/3DS needed | Send customer to authenticate |

Decline Type Classification

CodeTypeMeaningRetry?
insufficient_fundsSoftTemporarily low balanceYes — retry in 2-3 days
card_declined (generic)SoftVarious temporary reasonsYes — retry 3-4 times
processing_errorSoftGateway/network issueYes — retry within 24h
expired_cardHardCard is expiredNo — request new card
stolen_cardHardCard reported stolenNo — request new card
do_not_honorSoft/HardBank refused (ambiguous)Try once more, then ask for new card
authentication_requiredAuthSCA/3DS neededSend customer to authenticate
Raw lines 96 to 107
108### Retry Schedule by Provider
110**Stripe (Smart Retries — recommended):**
111- Enable "Smart Retries" in Stripe Dashboard → Billing → Settings
112- Stripe's ML model picks optimal retry timing based on billions of transactions
113- Typically 4-8 retry attempts over 3-4 weeks
114- Recovers ~15% more than fixed-schedule retries
116**Manual retry schedule (if no smart retries):**
118| Retry | Timing | Best Day/Time |
119|-------|--------|--------------|
120| 1 | Day 1 (24h after failure) | Morning, same day of week as original |
121| 2 | Day 3 | Try a different time of day |
122| 3 | Day 5 | After typical payday (1st, 15th) |
123| 4 | Day 7 | Morning of the next business day |
124| 5 (final) | Day 10 | Last attempt before grace period ends |
126**Retry timing insights:**
127- Retry on the same day of month the original payment succeeded
128- Retry after common paydays (1st and 15th of the month)
129- Avoid retrying on weekends (lower approval rates)
130- Morning retries (8-10am local time) perform slightly better
132---

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):

RetryTimingBest Day/Time
1Day 1 (24h after failure)Morning, same day of week as original
2Day 3Try a different time of day
3Day 5After typical payday (1st, 15th)
4Day 7Morning of the next business day
5 (final)Day 10Last 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

Raw lines 108 to 133
134## Dunning Email Sequence

Dunning Email Sequence

Raw lines 134 to 135
136### Email 1: Payment Failed (Day 0)
138**Tone:** Friendly, matter-of-fact. No alarm.
140```
141Subject: Action needed — your payment didn't go through
143Hi [Name],
145We tried to charge your [card type] ending in [last 4] for your
146[Product] subscription ($[amount]), but it didn't go through.
148This happens sometimes — usually a quick card update fixes it.
150[Update Payment Method →]
152Your access isn't affected yet. We'll retry automatically, but
153updating your card is the fastest fix.
155Need help? Just reply to this email.
157— [Product] Team
158```

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] Team
Raw lines 136 to 159
160### Email 2: Reminder (Day 3)
162**Tone:** Helpful, slightly more urgent.
164```
165Subject: Quick reminder — update your payment for [Product]
167Hi [Name],
169Just a heads-up — we still haven't been able to process your
170$[amount] payment for [Product].
172[Update Payment Method →]
174Takes less than 30 seconds. Your [data/projects/team access]
175is safe, but we'll need a valid payment method to keep your
176account active.
178Questions? Reply here and we'll help.
180— [Product] Team
181```

Email 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] Team
Raw lines 160 to 182
183### Email 3: Urgency (Day 7)
185**Tone:** Direct, clear consequences.
187```
188Subject: Your [Product] account will be paused in 3 days
190Hi [Name],
192We've tried to process your payment several times, but your
193[card type] ending in [last 4] keeps getting declined.
195If we don't receive payment by [date], your account will be
196paused and you'll lose access to:
198• [Key feature/data they use]
199• [Their projects/workspace]
200• [Team access for X members]
202[Update Payment Method Now →]
204Your data won't be deleted — you can reactivate anytime by
205updating your payment method.
207— [Product] Team
208```

Email 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] Team
Raw lines 183 to 209
210### Email 4: Final Warning (Day 10)
212**Tone:** Final, clear, no guilt.
214```
215Subject: Last chance to keep your [Product] account active
217Hi [Name],
219This is our last reminder. Your payment of $[amount] is past
220due, and your account will be paused tomorrow ([date]).
222[Update Payment Method →]
224After pausing:
225• Your data is saved for [90 days]
226• You can reactivate anytime
227• Just update your card to restore access
229If you intended to cancel, no action needed — your account
230will be paused automatically.
232— [Product] Team
233```
235---

Email 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] Team

Raw lines 210 to 236
237## Grace Period Management

Grace Period Management

Raw lines 237 to 238
239### What Happens During Grace Period
241| Setting | Recommendation |
242|---------|---------------|
243| Duration | 7-14 days after final retry |
244| Access | Degraded (read-only) or full access |
245| Visibility | In-app banner: "Payment past due — update to continue" |
246| Retry | Continue background retries during grace |
247| Communication | Dunning emails continue |

What Happens During Grace Period

SettingRecommendation
Duration7-14 days after final retry
AccessDegraded (read-only) or full access
VisibilityIn-app banner: "Payment past due — update to continue"
RetryContinue background retries during grace
CommunicationDunning emails continue
Raw lines 239 to 248
249### Access Degradation Options
251**Option A: Full access during grace (recommended for B2B)**
252- Lower friction, customer feels respected
253- Higher recovery rate (they still see value)
254- Risk: some customers exploit the grace period
256**Option B: Read-only access (recommended for B2C)**
257- Can view but not create/edit
258- Creates urgency without data loss fear
259- Clear message: "Update payment to resume full access"
261**Option C: Immediate lockout (not recommended)**
262- Aggressive, damages relationship
263- Lower recovery rate
264- Only appropriate for very low-cost plans

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
Raw lines 249 to 265
266### Post-Grace Period
268| Timing | Action |
269|--------|--------|
270| Grace period ends | Pause account (not delete) |
271| Day 1 post-pause | "Your account has been paused" email |
272| Day 7 post-pause | "Your data is still here" reminder |
273| Day 30 post-pause | Win-back attempt with new offer |
274| Day 60 post-pause | Final win-back |
275| Day 90 post-pause | Data deletion warning (if applicable) |
277---

Post-Grace Period

TimingAction
Grace period endsPause 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-pauseWin-back attempt with new offer
Day 60 post-pauseFinal win-back
Day 90 post-pauseData deletion warning (if applicable)

Raw lines 266 to 278
279## Provider-Specific Setup

Provider-Specific Setup

Raw lines 279 to 280
281### Stripe
283**Enable Smart Retries:**
2841. Dashboard → Settings → Billing → Subscriptions and emails
2852. Enable "Smart Retries" under retry rules
2863. Set failed payment emails in Dashboard → Settings → Emails
288**Custom retry rules (if not using Smart Retries):**
289```
290Retry 1: 3 days after failure
291Retry 2: 5 days after failure
292Retry 3: 7 days after failure
293Final: Mark subscription as unpaid after last retry
294```
296**Webhook events to handle:**
297- `invoice.payment_failed` — trigger dunning
298- `invoice.paid` — cancel dunning, restore access
299- `customer.subscription.updated` — status changes
300- `customer.subscription.deleted` — final cancellation

Stripe

Enable Smart Retries:

  1. Dashboard → Settings → Billing → Subscriptions and emails
  2. Enable "Smart Retries" under retry rules
  3. 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 retry

Webhook events to handle:

  • invoice.payment_failed — trigger dunning
  • invoice.paid — cancel dunning, restore access
  • customer.subscription.updated — status changes
  • customer.subscription.deleted — final cancellation
Raw lines 281 to 301
302### Chargebee
304**Built-in dunning:**
3051. Settings → Configure Chargebee → Retry Settings
3062. Configure retry attempts and intervals
3073. Settings → Configure Chargebee → Email Notifications → Dunning
309**Dunning options:**
310- Automatic retries with configurable schedule
311- Built-in dunning emails (customizable templates)
312- Grace period configuration per plan

Chargebee

Built-in dunning:

  1. Settings → Configure Chargebee → Retry Settings
  2. Configure retry attempts and intervals
  3. Settings → Configure Chargebee → Email Notifications → Dunning

Dunning options:

  • Automatic retries with configurable schedule
  • Built-in dunning emails (customizable templates)
  • Grace period configuration per plan
Raw lines 302 to 313
314### Paddle
316**Managed dunning:**
317- Paddle handles retries and dunning automatically
318- Limited customization (Paddle manages the relationship)
319- **Paddle Billing webhooks** (dot-separated `event_type` names):
320 - `transaction.payment_failed` reports a failed payment attempt. Use its `subscription_id` to associate a subscription renewal; a failed one-off transaction is not subscription churn.
321 - `subscription.past_due` reports that the subscription is past due.
322 - `subscription.canceled` reports an effective cancellation. A cancellation scheduled for the next billing period emits `subscription.updated` first; retain access according to the current subscription state until that change takes effect.
323- Configure notification subscriptions for these exact names. `subscription.payment_failed` and `subscription.cancelled` are not Paddle Billing event types; do not mix Billing webhooks with the separate Paddle Classic alert names.
324- Verify the [payment-failure](https://developer.paddle.com/webhooks/transactions/transaction-payment-failed/) and [cancellation](https://developer.paddle.com/webhooks/subscriptions/subscription-canceled/) contracts before wiring account state changes.
325- Best for hands-off approach

Paddle

Managed dunning:

  • Paddle handles retries and dunning automatically
  • Limited customization (Paddle manages the relationship)
  • Paddle Billing webhooks (dot-separated event_type names):
  • transaction.payment_failed reports a failed payment attempt. Use its subscription_id to associate a subscription renewal; a failed one-off transaction is not subscription churn.
  • subscription.past_due reports that the subscription is past due.
  • subscription.canceled reports an effective cancellation. A cancellation scheduled for the next billing period emits subscription.updated first; retain access according to the current subscription state until that change takes effect.
  • Configure notification subscriptions for these exact names. subscription.payment_failed and subscription.cancelled are not Paddle Billing event types; do not mix Billing webhooks with the separate Paddle Classic alert names.
  • Verify the payment-failure and cancellation contracts before wiring account state changes.
  • Best for hands-off approach
Raw lines 314 to 326
327### Recurly
329**Revenue Recovery:**
3301. Configuration → Dunning Management
3312. Set retry schedule per plan
3323. Configure grace period and final action (pause vs cancel)
334**Advanced features:**
335- Machine-learning retry optimization
336- Per-plan dunning schedules
337- Built-in Account Updater
339---

Recurly

Revenue Recovery:

  1. Configuration → Dunning Management
  2. Set retry schedule per plan
  3. Configure grace period and final action (pause vs cancel)

Advanced features:

  • Machine-learning retry optimization
  • Per-plan dunning schedules
  • Built-in Account Updater

Raw lines 327 to 340
341## In-App Dunning
343Don't rely on email alone. Show payment failures in the app:

In-App Dunning

Don't rely on email alone. Show payment failures in the app:

Raw lines 341 to 344
345### Banner Pattern
346```
347┌──────────────────────────────────────────────────────┐
348│ ⚠ Your payment of $29 failed. Update your card to │
349│ avoid losing access. [Update Payment →] [Dismiss] │
350└──────────────────────────────────────────────────────┘
351```
353**Rules:**
354- Show on every page load during dunning period
355- Allow dismiss (but show again next session)
356- Direct link to payment update (fewest clicks possible)
357- Don't block the product — let them continue using it

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
Raw lines 345 to 358
359### Modal Pattern (for final warning)
360```
361┌─────────────────────────────────────┐
362│ │
363│ Your account will be paused │
364│ on [date] │
365│ │
366│ Update your payment method to │
367│ keep access to your [X] projects │
368│ and [Y] team members. │
369│ │
370│ [Update Payment Method] │
371│ [Remind Me Later] │
372│ │
373└─────────────────────────────────────┘
374```
376---

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]                  │
│                                     │
└─────────────────────────────────────┘

Raw lines 359 to 377
378## Measuring Dunning Performance

Measuring Dunning Performance

Raw lines 378 to 379
380### Key Metrics
382| Metric | How to Calculate | Target |
383|--------|-----------------|--------|
384| Recovery rate | Recovered payments / Total failed | 50-60% |
385| Recovery rate by decline type | Recovered / Failed per type | Soft: 70%+, Hard: 40%+ |
386| Time to recovery | Days from failure to successful payment | <5 days |
387| Pre-dunning prevention rate | Prevented failures / Expected failures | 20-30% |
388| Dunning email open rate | Opens / Sent per email | 60%+ |
389| Dunning email click rate | Clicks / Opens per email | 30%+ |
390| Revenue recovered (monthly) | Sum of recovered payment amounts | Track trend |
391| Revenue lost to involuntary churn | Sum of failed + unrecovered amounts | Track trend |

Key Metrics

MetricHow to CalculateTarget
Recovery rateRecovered payments / Total failed50-60%
Recovery rate by decline typeRecovered / Failed per typeSoft: 70%+, Hard: 40%+
Time to recoveryDays from failure to successful payment<5 days
Pre-dunning prevention ratePrevented failures / Expected failures20-30%
Dunning email open rateOpens / Sent per email60%+
Dunning email click rateClicks / Opens per email30%+
Revenue recovered (monthly)Sum of recovered payment amountsTrack trend
Revenue lost to involuntary churnSum of failed + unrecovered amountsTrack trend
Raw lines 380 to 392
393### Benchmarking
395**By company stage:**
397| Stage | Typical Involuntary Churn | Target After Optimization |
398|-------|--------------------------|--------------------------|
399| Early (< $1M ARR) | 3-5% of MRR/month | 1-2% |
400| Growth ($1-10M ARR) | 2-4% of MRR/month | 0.5-1.5% |
401| Scale ($10M+ ARR) | 1-3% of MRR/month | 0.3-0.8% |

Benchmarking

By company stage:

StageTypical Involuntary ChurnTarget After Optimization
Early (< $1M ARR)3-5% of MRR/month1-2%
Growth ($1-10M ARR)2-4% of MRR/month0.5-1.5%
Scale ($10M+ ARR)1-3% of MRR/month0.3-0.8%
Raw lines 393 to 402
403### ROI Calculation
405```
406Assumed failed invoice amount: $10,000/month
407Baseline collected amount: 30% ($3,000/month)
408Scenario collected amount: 60% ($6,000/month)
409Additional recovered cash: $3,000/month
410If repeated for 12 months: $36,000/year
411Assumed incremental tooling cost: $200-500/month
412Recovered-revenue / tooling ratio: 6-15x
413After tooling alone / tooling cost: 5-14x (500-1,400%)
414```
416The 6–15x is recovered cash ÷ tooling cost. Net of tooling it is 5–14x (`(3,000 - 500) / 500 = 5`; `(3,000 - 200) / 200 = 14`), before labor and payment fees. Validate the 60% recovery target against your own baseline. See [gross versus net profit](https://stripe.com/resources/more/gross-vs-net-profit-what-businesses-need-to-know).

ROI Calculation

Assumed failed invoice amount:       $10,000/month
Baseline collected amount:           30% ($3,000/month)
Scenario collected amount:           60% ($6,000/month)
Additional recovered cash:           $3,000/month
If repeated for 12 months:           $36,000/year
Assumed incremental tooling cost:    $200-500/month
Recovered-revenue / tooling ratio:   6-15x
After tooling alone / tooling cost:  5-14x (500-1,400%)

The 6–15x is recovered cash ÷ tooling cost. Net of tooling it is 5–14x ((3,000 - 500) / 500 = 5; (3,000 - 200) / 200 = 14), before labor and payment fees. Validate the 60% recovery target against your own baseline. See gross versus net profit.

Raw lines 403 to 416