Ledgerly: cancel flow and failed-payment recovery plan
Baseline math (per 1,000 subscribers)
| Share | Subs lost/mo | MRR lost at $29 | |
|---|---|---|---|
| Total churn | 6.0% | 60 | $1,740 |
| Involuntary (failed payments) | ~2.0% | ~20 | $580 |
| Voluntary | ~4.0% | ~40 | $1,160 |
I assumed the one-third figure is net of whatever Stripe's defaults already recover today. If you have gross failure counts, I can re-baseline.
Targets at 90 days: involuntary 2.0% → ~1.2%, voluntary 4.0% → ~3.2%, total 6.0% → ~4.4%. That is roughly a 27% cut in churn. Treat these as hypotheses to test, not promises.
Part 1: Voluntary cancel flow
Flow: Settings → Cancel → one-question survey → one matched offer → confirm → post-cancel.
Survey
Title: "Help us improve: what's the main reason you're cancelling?" It is single-select with optional free text. Options, ordered by expected frequency (re-sort quarterly):
- Too expensive
- Not using it enough
- Missing a feature I need
- Switched to another tool
- Bugs or technical issues
- Don't need it right now
- Business closed or changed
- Other (free text)
Every screen has a visible "Continue cancelling" button, and the survey is skippable.
Offer matrix ($29 plan)
| Reason | Primary offer | Fallback |
|---|---|---|
| Too expensive | 25% off for 3 months (saves $7.25/mo, $21.75 total) | Lower tier or annual plan |
| Not using it | Pause 1–3 months, data kept, auto-resume with a reminder email 7 days before | Free 20-minute setup session |
| Missing feature | Roadmap note plus workaround guide, and a "notify me when it ships" option | Pause |
| Competitor | Short "what did they offer?" free-text, then a comparison page | 25% off for 3 months |
| Bugs | Open a support ticket with priority routing, shown before any discount | One month credit |
| Temporary need | Pause (up to 3 months) | Downgrade |
| Business closed | No offer. Offer a data export and a graceful exit. | None |
Guardrails
- One primary offer and one fallback per reason. Never show a wall of options.
- Discount cap is 30%. Allow one discount per account per 12 months, so people can't cancel repeatedly for deals.
- Pause is capped at 3 months.
- No guilt copy, no countdown tricks, and no confirm-shaming on the decline button.
- Mobile-first layout, since many cancellations happen on a phone.
Confirmation and post-cancel
- Confirmation screen: "Your access continues until [date]. You won't be charged again." Include a one-click "Undo cancellation" link, and offer a data export.
- Cancel at period end via Stripe
cancel_at_period_end. - Send an immediate confirmation email with a reactivation link.
- Win-back sequence at day 7, 30, and 90 (see the emails skill). Day 30 is tied to the stated cancel reason, such as a feature-shipped notice.
Proactive layer (before they reach Cancel)
- Usage down 50% or more for 2 weeks → "Need help?" email.
- No login for 14 days → re-engagement email.
- Billing page or data export visits → flag the account as high risk.
- Renewal reminders are mostly unneeded for monthly billing. Use a value-recap email at month 3 and month 11 instead.
Measurement
- Cancel-flow save rate target: 20–25% of cancel sessions, with offer acceptance of 15–25%.
- Track 90-day retention of saved users separately. A save that cancels 30 days later doesn't count.
- Pause reactivation target: 60%+.
- First test: discount depth (20% vs 30%) and pause length (1 vs 3 months). Run one variable at a time, with feature flags such as PostHog if you use it.
Part 2: Failed-payment recovery (about 1/3 of churn)
Pre-dunning (prevent failures)
- Turn on the Stripe card account updater (automatic) and Smart Retries.
- Send card-expiry emails at 30, 15, and 7 days before expiry.
- Ask for a backup payment method after the first successful renewal, not at signup.
- EU: offer SEPA Direct Debit at checkout. It has far fewer expiry-related failures than cards.
- EU: use
setup_future_usage=off_sessionwith SCA/3DS at signup so renewals are exempt where possible.
Retry logic by decline type
| Type | Action |
|---|---|
| Soft decline (insufficient funds, timeout) | Smart Retries, about 4 attempts over 7–10 days, favoring paydays and the original billing time |
| Hard decline (closed, stolen, invalid) | No retries. Go straight to "update your card". |
| Authentication required (EU SCA) | Don't retry blindly. Send an on-session link to complete 3DS. |
Keep total retries well under card-network limits.
Dunning email sequence (plain text, transactional)
| # | Timing | Message |
|---|---|---|
| 1 | Day 0 | "Your payment didn't go through. Update your card here." Direct link to the Stripe-hosted billing portal. |
| 2 | Day 3 | Friendly reminder. Mention what's at stake: data, history, and reports stay safe. |
| 3 | Day 7 | "Your account will pause in 3 days." |
| 4 | Day 10 | Final notice, with a support contact and a reply-to for help. |
- Also show an in-app banner and a lock-on-login prompt from day 0.
- Optional SMS or push at day 5 for users who opted in (only where consent exists).
- Language: "your payment didn't go through", never "you failed to pay".
- Use localized currency and language for EU customers.
- When a customer fixes their card, retry immediately instead of waiting for the next scheduled retry.
Grace period and end state
- Keep access (read-only after day 7) through day 10–14.
- After that, cancel the subscription but keep data for 90 days with a one-click reactivate link.
- Feed those users into the win-back sequence, tagged "payment failure", not "chose to leave".
Measurement
- Payment recovery rate target: 60%+ overall (soft 70%+, hard 40%+).
- Pre-dunning prevention target: 20% of would-be failures.
- Track involuntary churn as a separate line item from voluntary churn.
- Report weekly during the first month: failures, recoveries by decline code, and email-to-update conversion.
Compliance (US and EU)
I'm not a lawyer. Have counsel review before launch.
- US: keep online cancellation as easy as sign-up. The federal FTC click-to-cancel rule was struck down in 2025, but state automatic-renewal laws (California, New York, and others) still require easy online cancel and clear renewal disclosures. This flow's single survey, one offer, and visible exit is built to satisfy that.
- EU: a clear "cancel contract" function is required in Germany and is increasingly expected elsewhere. The EU consumer-rights withdrawal-button requirement is phasing in during 2026. Keep the cancel path to a few clicks, with no forced survey.
- GDPR: dunning and cancellation emails are transactional. Win-back marketing needs a lawful basis or consent in the EU, so gate it accordingly.
- PSD2/SCA: failed 3DS payments need customer action, which is why the authentication-required row above doesn't retry.
Rollout order
- Week 1: enable Smart Retries, the card updater, and Stripe's built-in dunning emails. Add SEPA for EU customers. Tag decline codes.
- Week 2: replace the default emails with the custom 4-email sequence and add the in-app banner.
- Weeks 2–4: build the cancel flow with the survey and the "too expensive" and "not using" offers first (the likely top two reasons), plus pause.
- Month 2: add the remaining reason paths, win-back emails, and the proactive risk emails.
- Month 3: start A/B tests and review save-offer LTV.
You can build the cancel flow in-house with the Stripe Billing Portal and a small custom screen, or buy Churnkey or ProsperStack. At $29/month, buying is probably faster if you have under a few thousand subscribers.
Next, I can draft the dunning email copy, the cancel-screen copy per reason, or the Stripe configuration and webhook handling. Tell me which you'd like first.
Real run in an isolated folder with only this skill installed. Only the Skill and Read tools were enabled, so nothing was fetched from the web and no file was written. The example is fictional. The app and its numbers are invented.
하는 일
자발적 이탈과 결제 실패로 인한 비자발적 이탈을 모두 다룹니다. 자발적 이탈에 대해서는 해지 흐름(계기, 해지 설문, 사유별 동적 만류 제안, 확인)을 설계하고 만류 제안 유형(할인, 일시 중지, 요금제 변경, 전담 지원)과 화면 패턴을 나열합니다. 예측에서는 위험 신호, 헬스 스코어 모델, 선제적 개입을 설명합니다. 비자발적 이탈에 대해서는 독촉 체계를 한 벌로 제시합니다. 결제 실패를 막는 사전 조치, 똑똑한 재시도 로직, 독촉 이메일 시퀀스, 회수율 벤치마크입니다. 주요 이탈 지표, 코호트 분석, 해지 흐름 A/B 테스트, 흔한 실수도 다룹니다. 참고 문서는 해지 흐름 패턴과 독촉 플레이북입니다.
동작 방식
- 현재 이탈 상황, 결제 플랫폼, 제품과 사용 데이터, 제약 조건을 묻습니다.
- 흐름, 재시도와 이메일 계획, 볼 지표를 설계하고 구독자 1,000명당 기준선을 계산합니다.
이런 때 좋습니다
해지나 카드 결제 실패로 이탈이 발생하는 구독형 서비스와 SaaS 팀.
낮은 위험:스크립트가 없는 지침 패키지로, 네트워크 접속이나 파일 쓰기가 없습니다. 고객과 매출에 영향을 주는 비즈니스 조언이므로 각 시장의 소비자 보호 규정에 비추어 확인하세요. 스킬은 해지 버튼을 숨기는 등의 다크 패턴을 경고하고 미국 FTC의 '원클릭 해지' 요건을 언급하지만, EU, 영국, 미국 각 주의 법은 다르므로 출발점으로만 삼고 법률 자문으로 여기지 마세요. 할인과 만류 제안은 이익을 깎으니 먼저 수치를 계산해 보세요. 일부 링크는 이 패키지에 없는 도구 가이드를 가리킵니다. 가상의 구독 앱으로 한 번 시험 실행했습니다.