TL;DR
Involuntary churn (subscribers lost to card failures, not cancellations) accounts for 20-40% of SaaS churn per Baremetrics industry data. Here's how to auto-recover them with 3 files:
app/api/stripe/webhook/route.ts — catch invoice.payment_failed
lib/dunning.ts — update Supabase status + generate Billing Portal URL
lib/emails.ts — send recovery email via Resend






