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