# Cancellation

URL: /systems/customer-service/cancellation · Id: `page:systems/customer-service/cancellation`

> A Customer cancels in one step with nothing in between, then keeps access through the save window, where the Startup makes one offer.

A [Customer](/business/nouns/customer) who cancels is done in one step, with nothing between the request and the result. The [Startup](/business/nouns/startup) asks one question and makes its one offer afterward, while access lasts.

## A cancel never waits
[`Subscription.unsubscribe`](/business/nouns/subscription/unsubscribe) is a Customer exit: a [Verb](/business/nouns/verb) whose subject is the Customer and that ends or lowers the Customer's own terms. An exit runs at once. No [Limit](/business/nouns/limit), [Approval](/business/nouns/approval) or [delay window](/systems/trust-and-governance/controls/one-way-windows) stands between the Customer and the result.

The same rule covers a move to a cheaper [Offer](/business/nouns/offer) through [`Subscription.switch`](/business/nouns/subscription/switch), and taking a cancel back through [`Subscription.keep`](/business/nouns/subscription/keep). Delay windows hold the Startup's own one-way [Actions](/business/nouns/action), never the Customer's.

Cancelling online takes no more steps than buying did. The [Customer guarantees](/systems/trust-and-governance/customer-guarantees) and the [renewals](/systems/legal-and-corporate/floor/renewals) row of the legal floor both require it.

## One question, eight answers
The cancel asks one question: why. The answer is one reason code, plus an optional comment kept verbatim in the Customer's own words.

| Code | The Founding Hypothesis slot it tests |
| --- | --- |
| `tooExpensive` | The slot the Offer's [Price](/business/nouns/price) compiles from |
| `missingCapability` | `approach` |
| `service` | `approach` |
| `switched` | `differentiation` |
| `unused` | `switch` |
| `notNeeded` | `problem` |
| `wrongFit` | `customer` |
| `other` | None: the comment is kept, and no slot is graded |

Each code maps one to one onto Stripe's own `cancellation_details.feedback` values, so the Startup's records and Stripe's agree. The cancel itself is Behavior-grade [Evidence](/business/nouns/evidence) that refutes the slot its code tests.

The stated reason alone is Opinion grade. It binds as Behavior only when the Startup's own [Events](/business/nouns/event) back it.
Two examples: `unused` with no activation Event in the [Period](/business/nouns/period), or `tooExpensive` right after the Price rose.

## The save window
Between the cancel and the close of the period, the [Subscription](/business/nouns/subscription) is `ending`. The Customer keeps full access, and nothing renews.

| Status | Access | Renews |
| --- | --- | --- |
| `trialing` | Full | Converts to paid when the trial ends |
| `active` | Full | On its date |
| `ending` | Full, until the period closes | No, unless the Customer keeps it |
| `paused` | None | Billing resumes on the pause's end date |
| `pastDue` | Full while [Dunning](/workflows/processes/billing/dunning) retries | After a successful charge |
| `canceled` | None | No; a return starts a new Subscription |

[Save and win back](/workflows/processes/retention/save-and-win-back) sends one [Message](/business/nouns/message) with the one offer that matches the reason, and a link that keeps the Subscription. A `tooExpensive` reason gets the cheaper Offer; a `missingCapability` reason gets the date it ships, or nothing.

The link runs `Subscription.keep`, and the Subscription renews on its original date. Silence ends the offer: once the period closes, keep refuses and the Subscription is `canceled`.

## After the period closes
A full export of the Customer's data goes out with the cancel, in open formats. A Customer is a Customer forever, so a canceled Subscription ends billing, never the Customer record.

Once the reason is fixed, the [Success Manager](/agents/customer/success-manager) writes once, with the fix as the reason to return. One win-back, never a drip of reminders.

## Refunds are separate
A cancel stops the next charge and returns no money. A refund is the Startup's own one-way money Action: [`Invoice.refund`](/business/nouns/invoice/refund), run by [Issue a refund](/workflows/processes/billing/issue-refund).

It returns the amount the terms allow to the original payment through Stripe: full, partial, or pro rata for the unused part of the Period. Above the [Billing Specialist](/agents/finance/billing-specialist)'s Limit it waits for an Approval, and every refund waits out its delay window.

It refuses while a [Dispute](/business/nouns/dispute) on the [Invoice](/business/nouns/invoice) is open. It never credits a balance, because a balance the Startup holds is stored value.

## Save rate
[Save rate](/agents/customer#save-rate) is the share of outside Subscriptions marked `ending` in the window that the Customer kept before the period closed. It counts saves after a finished cancel, so making the cancel harder cannot raise it.

A music teacher cancels in one click and picks `missingCapability`, writing "no group lessons". The offer names the week group booking ships; she ignores it, and the Subscription closes `canceled`. Three weeks after the feature ships, one Message invites her back, and she subscribes again.

## Next
- [The renewal notice](/systems/customer-service/renewals): what every term Customer hears before a charge.
- [Customer health](/systems/customer-service/health): seeing a cancel coming.
- [Retention](/workflows/processes/retention): where Save and win back runs.