StealThis .dev
Pages Medium

Retention — Cancellation / downgrade flow

A three-step cancellation and retention flow for a fictional Northwind SaaS subscription. Step one collects a cancel reason from a radio list, step two surfaces a tailored save offer that adapts to that reason — a 40 percent discount, a downgrade to Starter, a pause with selectable duration, or a specialist handoff — and step three confirms the cancellation with a feedback field and a clear warning. Accepting an offer routes to a saved screen, while confirming routes to a goodbye screen with a reference code.

Open in Lab
html css vanilla-js
Targets: JS HTML

Code

Cancellation / downgrade flow

A self-contained retention flow for the fictional Northwind product. A segmented progress indicator tracks three steps — Reason, Offer, Confirm — with aria-current on the active step, filled checkmarks on completed ones, and a gradient progress bar that advances as you move forward. Step one is a radiogroup of five realistic cancel reasons (too expensive, not using it, missing a feature, switching tools, just need a break); Continue stays disabled until one is chosen.

Step two is the heart of the pattern: the offer adapts to the reason. Price complaints get a 40 percent discount card, low usage and break requests get a pause-subscription card with a 1-to-3-month duration picker that recomputes the resume date, and missing-feature or switching answers get a specialist-handoff card with a free month. Accepting any offer diverts to a saved state and shows a toast; declining drops you into step three. The confirm step summarises the plan, captures optional feedback with a live character counter, and warns about collaborators and automations that will pause.

Choosing “Confirm cancellation” reveals a goodbye screen with a generated reference code and a reactivate button, while accepting an offer reveals a green saved screen — both can be dismissed with Esc to return to billing. Headings receive focus on every transition for screen-reader continuity, the layout collapses to a single stacked column under 520px, and motion is disabled under prefers-reduced-motion.

Illustrative UI only — fictional brand, plans, and pricing.