Limited offer · Save $800 on the snapshot · Closing in 00d 00h 00m 00s Claim now →
$$$ Auto-invoice · Auto-remind · Auto-collect

Billing Recovery & Dunning: Recover Involuntary Churn Before It Sticks
that collects while you sleep

5-touch, 14-day dunning sequence triggered by Stripe payment failure webhooks — recovering 40–65% of failed-payment subscribers with frictionless billing update flows, zero manual intervention.

Invoice
#INV-2026-0418
Due
May 22, 2026
To: Acme Inc · billing@acmeinc.io
Pro plan — 10 seats (annual)$2,400
API add-on (50K calls/mo)$600
Onboarding & setup (4 hr)$800
Priority support (Q1)$450
Total Due $4,250.00
PAID ✓
Receipt sent · Stripe
3day
Overdue reminder cascade
Auto-fires at 9 AM
78%
On-time payment
↑ from 42% baseline
$28K
Monthly auto-collected
Avg across 4 SaaS teams
0
Staff hours / invoice
↓ from 18 min each

The most recoverable churn in SaaS

Involuntary churn — subscribers who lose access because a payment failed, not because they decided to leave — accounts for 20–40% of total churn for most SaaS businesses. Unlike voluntary churn (where the customer has made a decision), involuntary churn is almost entirely recoverable with the right dunning sequence.

Without a dunning system, the typical outcome is: Stripe declines the card, access pauses (or continues on a grace period), no communication is sent, the customer assumes their subscription is active, and they’re surprised when they get locked out. By the time they notice, frustration has replaced any intention to update their card. The subscription lapses.

With structured dunning: 40–65% of failed-payment subscribers recover, typically within the first 3 days of the sequence. The customers who don’t recover were leaving anyway.

How it works in GHL

Trigger: Stripe fires a payment_intent.payment_failed or invoice.payment_failed webhook → webhook hits GHL via Zapier/Make relay → GHL creates a payment_failed tag on the contact → 14-day dunning workflow begins.

The 14-day dunning sequence:

DayChannelMessage framing
0EmailHelpful service notice. Warm tone: “We weren’t able to process your payment — here’s a quick fix.” Direct billing update link.
0+5minSMSShort, direct: “Hi [Name], your [product] payment didn’t go through. Update here: [link]“
3EmailFriendly reminder. “Just checking in — account access continues through day 7. Takes 30 seconds to update.”
7Email + SMSFinal warning before access pause. “Your account access pauses in 3 days. Here’s a direct link to update your billing info.”
10EmailAccount paused notification. Tone shifts to re-activation framing: “Your account is paused — restore it in 2 clicks.”
14EmailFinal recovery attempt. “Your account closes in 48 hours — here’s a one-click restore.” Optional save offer for high-value accounts.

Critical detail: Every email includes a direct, deep-linked billing update URL — not “log in and navigate to Settings > Billing.” A direct Stripe Customer Portal link (/billing/portal) or Chargebee self-serve payment update page. Friction in the recovery path is the primary reason dunning sequences fail. Each additional click between the email and the payment update form loses ~20% of recovery intent.

Resolution handling

When payment is recovered — Stripe fires invoice.paid or the customer updates their payment method — GHL immediately:

  • Tags the contact payment_recovered.
  • Removes payment_failed tag.
  • Cancels all pending dunning emails (no “your account pauses in X days” after recovery).
  • Sends a confirmation email: “All good — your payment went through and your account is fully restored.”
  • Logs the recovery in a Dunning Recovery pipeline for MRR tracking.

Resolution fires on the Stripe event, not on the email click. If the customer updates their card directly through Stripe’s portal without clicking your email link, the invoice.paid webhook still cancels the dunning sequence.

Stripe event → GHL action map

Stripe eventGHL action
invoice.payment_failedTag payment_failed, start 14-day dunning workflow
customer.updated (payment method changed)Cancel dunning, send recovery confirmation
invoice.paid after prior failureCancel dunning, send recovery confirmation, log recovery in pipeline
customer.subscription.deleted (confirmed churn)Remove dunning tag, add churned_involuntary tag, start win-back sequence
Day 10 in sequence, no recoveryMove to “account paused” pipeline stage
Day 14, no recoveryClose dunning, tag involuntary_churn, start 30-day win-back sequence

ROI math: what dunning is actually worth

Acme Inc — $120k MRR, 2.5% monthly involuntary churn rate (no dunning), $240 ARPA.

Monthly involuntary churn: $120k × 2.5% = $3,000 MRR lost monthly to failed payments.

Without dunning: zero recovery. Annual involuntary churn cost: $36,000 in lost MRR.

With 14-day dunning deployed:

  • Recovery rate: 50% of failed-payment subscribers (industry average with structured dunning).
  • Monthly recovery: $3,000 × 50% = $1,500 MRR recovered monthly.
  • Annual recovered MRR: $18,000.

At a one-time cost of $1,200 for the SaaS Snapshot, payback period: less than 3 weeks.

For Northwind SaaS ($50k MRR, 3% involuntary churn, $199 ARPA):

  • Monthly failed-payment MRR: $1,500. 50% recovery = $750/month, $9,000/year recovered.

Works with Chargebee, Recurly, and Paddle

The snapshot is built with Stripe as the primary integration. The same dunning pattern works with Chargebee (native retry logic + webhook events), Recurly (invoice.past_due and invoice.paid events), and Paddle (subscription.payment_failed). The GHL-side automation is billing-provider-agnostic — configure the webhook source to match your provider.

★ Skip the manual build

Stop losing subscribers to failed payments — dunning live in 24 hours

Should I pause account access immediately on payment failure or wait?

Best practice is a 7-day grace period before pausing access. Immediate suspension on day 0 triggers a panic response and increases voluntary cancellations — customers who would have updated their card instead decide it's not worth the hassle. The snapshot's default grace period is 7 days: access continues, the sequence runs, and access pauses only if payment hasn't been recovered by day 7.

What if the customer updates their payment method through the Stripe portal directly?

Resolution handling is event-driven, not click-driven. If the customer logs into Stripe's Customer Portal directly (without clicking your email link) and updates their card, Stripe fires the `invoice.paid` event. GHL receives it via webhook and cancels all pending dunning emails immediately. You never send a 'your account closes in 48 hours' email to someone who already fixed their billing.

Can I offer a save discount inside the dunning sequence for high-value accounts?

Yes — the snapshot's day-14 email includes a conditional branch: if the contact's MRR value exceeds a threshold (e.g., $500/month), the email includes a 1-month payment pause offer or a temporary discount code. For accounts below threshold, the standard recovery CTA fires. Configure the threshold in the workflow branch condition — no code required.

How do I track dunning recovery as a metric separate from overall churn?

The snapshot includes a 'Dunning Recovery' pipeline in GHL with stages: Payment Failed → Recovering → Recovered → Confirmed Churn. Every failed-payment contact enters this pipeline. Recovered contacts close the pipeline stage as 'won.' This gives you a clean monthly report: failed-payment MRR entered vs recovered MRR, which is your dunning recovery rate — a metric you can track over time and optimize.

Invoice lifecycle

From generated to paid — touch-free

Five stages. Each one fully automated. You only see the money hit your Stripe dashboard.

1
Generate
Subscription billing + usage fees + add-ons roll into a draft invoice. Branded with your logo, payment terms, and SaaS plan details. One click to send.
2
Send
Email + SMS delivery with a "Pay Now" button. Stripe, Braintree, or PayPal — customer picks. Payment link expires after 30 days; auto-regenerates on reminder.
3
Remind
Day-3 nudge, day-7 second reminder, day-14 firm follow-up, day-21 CS rep CC. Each escalates tone. Stops the moment payment clears.
4
Paid
Stripe webhook fires. Invoice marked paid in CRM. Subscription renews. Revenue recorded for MRR tracking. Slack pings the billing channel.
5
Receipt
PDF receipt emailed within 60 seconds. Auto-filed to customer folder. Thank-you SMS with optional NPS request after 48 hours.
Reminder cascade

The 4-message rhythm that gets you paid

Same tone you'd use yourself — calibrated by day, firm-branded, signed by a CS rep name.

Day 0 · Invoice
$
Hi — your invoice #INV-2026-0418 for $4,250 is ready. Pay securely: [link]. Due May 22.
Day 3 · Friendly
$
Heads-up — invoice #INV-2026-0418 is due in 4 days. Pay quickly: [link]. Reply if you have questions.
Day 7 · Second
$
Invoice #INV-2026-0418 is now 2 days past due. Need a payment plan? Just reply. Otherwise: [link]
Day 14 · Firm
$
Invoice #INV-2026-0418 is 9 days overdue. To keep your subscription active, please pay by Friday: [link]. — Michael, CS Manager
Pre-wired processors

Plug into the rails you already trust

Subscription compliance built in. MRR splits handled. No reconciliation gymnastics.

💳 Stripe 🔁 Stripe Billing 🅿️ PayPal 🏦 Braintree 📊 QuickBooks sync 🧾 Chargebee import 🏧 ACH bank transfer 📈 MRR export
Stop chasing payment

Auto-Invoice Your Customers — Live in 24 Hours

Included in the $1,200 SaaS Snapshot. Stripe / Braintree / PayPal pre-wired. Dunning logic built in. 10 dedicated config hours.

Book Demo Get Snapshot