Skip to content
Back to skills

Build Cancellation Flow

ASecurity

Build a cancellation / churn-interception flow with an exit survey, reason-matched save offers, and graceful exit — preserving rating and recovering 10–35% of cancellations. Use when the user says 'cancellation flow', 'cancel survey', 'save offer', 'prevent churn', 'subscription cancel', 'downgrade flow', or 'retention offer'.

  • 3 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 4, 2026
developmentgoreactrails

Works with

  • cli

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned October 4, 2026

npx -y skills add khadinakbarlabs/expo-mobile-app-builder --skill build-cancellation-flow --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Build Cancellation Flow?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Build Cancellation Flow
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/khadinakbarlabs-build-cancellation-flow/badge)](https://www.skillsdirectory.com/skills/khadinakbarlabs-build-cancellation-flow)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: "build-cancellation-flow"
description: "Build a cancellation / churn-interception flow with an exit survey, reason-matched save offers, and graceful exit — preserving rating and recovering 10–35% of cancellations. Use when the user says 'cancellation flow', 'cancel survey', 'save offer', 'prevent churn', 'subscription cancel', 'downgrade flow', or 'retention offer'."
---

# Build a cancellation flow

The screen a user sees when they hit "cancel subscription" is one of the highest-leverage revenue surfaces in a subscription app. A well-designed flow saves **10–35%** of cancellations (offer acceptance 15–25%, pause reactivation 60–80%); even a simple survey + one offer saves 10–15% over an instant cancel. This skill designs it.

## The canonical structure

```text
Trigger (user taps Cancel)
  → Survey (why are you leaving?)
    → Reason-matched save offer
      → Accept (saved) | Defer (pause) | Confirm cancel (graceful exit)
        → Post-cancel: win-back eligibility + email capture
```

## The exit survey

5–8 reason options + free text. Framing matters: **"Help us improve"** beats "Why are you leaving?" — it reduces defensiveness and raises completion.

Typical reasons (match these to the product):
- Too expensive
- Not using enough
- Missing a feature
- Found an alternative
- Technical issues / bugs
- Just needed it temporarily
- Hard to use
- Other (free text)

Capture the reason in your analytics (`instrument-growth-funnel`) tied to the user. The reason is also the input to the save offer and to product roadmap prioritization.

## Reason-matched save offers

Don't show every canceler the same offer. Match the offer to the reason:

| Cancel reason | Primary offer | Fallback |
|---|---|---|
| **Too expensive** | 20–30% off for 2–3 months | Downgrade to a cheaper tier |
| **Not using enough** | Pause 1–3 months (keeps access, stops billing) | Free onboarding / usage nudge |
| **Missing feature** | Roadmap + timeline for the requested feature | A workaround or alternative path |
| **Technical issues** | Escalate to support immediately; credit + priority fix | Free month while they wait |
| **Found alternative** | Differentiated value recap + offer | Graceful exit (don't badger) |
| **Temporary use** | Pause or annual at a discount for next cycle | Graceful exit |

## Discount guardrails (avoid training cancel-for-deals)

- **Sweet spot: 20–30% off for 2–3 months.** Enough to matter, short enough to not devalue.
- **Avoid routine >50% off.** Trains users to cancel expecting a deal; they'll repeat the cycle.
- **Show the dollar amount, not just the percentage.** "$4 off for 3 months" lands better than "25% off."
- **Time-limit the offer.** "Claim by [date]" — but only a real deadline, not a fake countdown (Apple rejects fake urgency).
- **One offer per cancel session.** Don't cascade discounts if they reject the first.

## Pause as an alternative to cancel

A "pause for 1–3 months" option (billing stops, access preserved or reduced) reactivates at **60–80%** vs much lower reactivation after a full cancel. Where the billing systems support it, offer pause prominently. StoreKit 2 doesn't have a native "pause," but you can implement it via a free-trial/promotional-offer bridge or by letting the subscription lapse and re-engaging. Google Play supports pausing natively in some configurations.

## Graceful exit (non-negotiable for your rating)

Keep "Continue cancelling" visible and one tap away at every step. **No dark patterns.** The FTC's Click-to-Cancel rule requires cancellation to be at least as easy as sign-up. A user who feels trapped by a cancellation flow leaves a 1-star review. See `build-review-routing` — the same unhappy-user principle applies.

After confirming cancel:
- Capture an email (if not already on file) for win-back. See `build-win-back-flow`.
- Keep premium access until the period ends (they paid for it).
- Subscribe to server notifications (`SUBSCRIPTION_CANCELED`) to distinguish cancel-but-active from genuinely lapsed.

## Implementation (RevenueCat)

RevenueCat exposes customer info and entitlement state. Build the survey + offer UI yourself; present the offer as a StoreKit promotional offer or a RevenueCat-managed discount:

```tsx
import Purchases from 'react-native-purchases';

// On cancel-reason selected, present the matched offer
async function presentSaveOffer(reason: CancelReason) {
  const offer = matchOfferToReason(reason); // your mapping
  // present the offer as a promotional offer / discounted package
  const offerings = await Purchases.getOfferings();
  const pkg = offerings.all?.[`save_${reason}`];
  // show pkg in a save-offer sheet; if accepted:
  // const { customerInfo } = await Purchases.purchasePackage(pkg);
}
```

Track the funnel: `cancel_started`, `cancel_survey_completed {reason}`, `save_offer_presented {type}`, `save_offer_accepted`, `cancel_confirmed`, `cancel_paused`.

## What not to do

- **No multi-step mazes** that make cancel hard. FTC Click-to-Cancel + App Review both penalize this.
- **No fake countdowns** on the save offer.
- **No guilt-trip copy** ("Are you sure you want to give up on your goals?"). Confirmshaming is a dark pattern and a rating killer.
- **No repeated discount escalation** if they reject the first offer.
- **No blocking the cancel** behind a support chat (chat is fine as one option, not a gate).

## Pair with

- `integrate-revenuecat-rn` — entitlement state and promotional offers.
- `app-store-server-notifications` / `app-store-server-notifications-android` — cancel vs lapsed signals.
- `build-win-back-flow` — the post-cancel recovery arm.
- `pricing-strategy` — discount guardrails.
- `instrument-growth-funnel` — measuring save rate by reason.

Files in this skill

  • SKILL.md5.7 KB
  • agents/openai.yaml200 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…