How to add a cancel flow to Zuora
How cancellation works in Zuora (cancel policies, suspend and resume, discounts, cancel events) and how to build a cancel flow with offers on top of it.
Zuora is built to manage subscriptions, not to talk customers out of cancelling. It gives you precise cancellation dates, suspend and resume, discount charges and events, but no customer-facing screen that asks why someone is leaving or offers an alternative. A cancel flow is the layer you put in front of those tools.
This guide explains the Zuora building blocks a cancel flow relies on, then shows how to put them together. It sticks to Zuora’s own documentation: Cancel a subscription (API), Order, subscription and amendment dates, Cancel a subscription using the Zuora UI, Suspend a subscription (API), Specify the discount scope and Zuora custom events for Orders (all accessed November 2026).
What a cancel flow needs to do
A cancel flow sits between the “Cancel subscription” button and the actual cancellation:
- Ask why, with a short list of reasons and an optional free-text answer.
- Offer an alternative that matches the reason: a discount for price, a pause for “not using it right now”, a cheaper or different plan for “missing feature” or “too much”.
- Cancel immediately if the customer still wants to. The cancel button stays visible at every step. Many jurisdictions now require cancellation to be as easy as sign-up; see our guide to click-to-cancel rules.
- Record the outcome so you can see which reasons and offers actually work.
Each of those steps maps to a Zuora operation.
Cancelling: the three cancellation policies
Zuora’s cancel operation and the Orders cancel action accept a cancellation policy:
| Policy | What happens | Notes from Zuora’s docs |
|---|---|---|
| End of current term | Billing runs until the term ends | The cancellation date is filled in with the term end date; not available in the UI for evergreen subscriptions |
| End of last invoice period | Billing stops after the last invoiced service period | Date filled in automatically |
| Specific date | Billing stops on the date you give | The date cannot be before the contract effective date, after the term end, or inside an already-invoiced period |
Zuora also separates two dates that a cancel flow should keep apart, per its dates documentation:
- the contract effective date, when the customer gave notice;
- the cancellation date, when service actually ends.
So a customer can cancel today (contract effective date) with service running to the end of the paid period (cancellation date). For a self-serve cancel flow, “end of last invoice period” usually matches what customers expect: they keep what they paid for, and nothing more is billed. If you choose a specific date, Zuora advises checking the service period on the last posted invoice first, because a wrong date can create unexpected credits or charges.
Two more points from Zuora’s docs:
- Cancellation applies to a subscription, not to the billing account. A customer with several subscriptions needs each one cancelled.
- Cancellation can be combined with refunds or write-offs of unpaid invoices; Zuora documents these as separate scenarios (cancel with refund, cancel and write off). Decide your policy before you build the flow.
The pause offer: suspend and resume
Zuora supports suspending a subscription and resuming it later, which is the natural backing for a pause offer. From the suspend API reference and the Orders suspend guide:
- Suspend only works on subscriptions in Active status, and requires a suspend policy (for example today, end of the last invoice period, a number of periods from today, or a specific date).
- You can resume on a specific date or a fixed period after the suspend date, and optionally extend the term by the suspended period.
- Without a resume date, the subscription stays suspended until someone resumes it.
- The resume date cannot be before the suspend date or after the subscription term end date.
- While suspended, the only action available on the subscription is to resume it.
For a cancel flow, always set a resume date when you suspend. An open-ended pause is just a cancellation that nobody followed up on. Offer one or two fixed lengths (one month, three months) and send a reminder a few days before the resume date. For when a pause beats a discount, see pause vs discount retention offers.
The discount offer: discount charges
Discounts in Zuora are discount charges in a product rate plan, added to the subscription through an order (Add Product). Zuora’s discount scope documentation describes three levels:
| Scope | Applies to |
|---|---|
| Rate plan | Charges in the same rate plan only |
| Subscription | All charges in the subscription, for a set period |
| Account | Regular charges across all the account’s subscriptions (must be enabled in settings; not supported in Orders) |
For retention offers, a subscription-level discount with a fixed duration is usually the right fit: “30% off for the next 3 months”. Set up a dedicated retention discount product in your catalog, so the offer is easy to report on and does not get mixed up with sales discounts.
Zuora notes that a fixed-amount discount cannot be changed in place: to correct one, you remove it and add a new one. Percentage discounts can be updated with an amendment (change a discount charge).
The plan change offer
A downgrade or plan switch is an order that removes one rate plan and adds another. Use the same Orders API as for discounts. Preview the order first, so the cancel flow can show the customer the new price before they accept.
Knowing when a cancellation happened
Your app and your analytics need to know when a subscription is cancelled, whether through your flow, by support in the Zuora UI, or by an integration. Zuora provides a Cancel Subscription event among its custom events for Orders, related to Order Action Processed. Suspend and Resume have equivalent events. Zuora’s docs say that enabling the Orders feature and these events goes through a request to Zuora Global Support.
Attach a notification with callout delivery to the event so Zuora calls your endpoint. Use it to revoke access on the cancellation date and to log cancellations that did not pass through your flow.
Building the flow, step by step
-
Put your own cancel page in front of Zuora. The button in your app opens the flow, never a direct API call.
-
Ask the reason. Five to seven options, plus “Other”. Store the answer in your system against the Zuora subscription number. For reason ideas, see cancellation reason surveys.
-
Map reasons to one offer each:
Reason Offer Zuora operation Too expensive Time-limited discount Add a subscription-level discount charge Not using it right now Pause for 1 to 3 months Suspend with a resume date Missing a feature, or need less Plan change Order removing and adding rate plans Switching to a competitor, closing business No offer Cancel -
Keep “Cancel now” on every screen, with the same weight as the offer.
-
On accept, run the Zuora operation, confirm by email, and record that an offer was accepted.
-
On cancel, run the cancel with your chosen policy (usually end of last invoice period), show the date service ends, and send a confirmation.
-
Listen to Zuora’s cancel event for cancellations made elsewhere.
-
Review monthly: reasons, offer acceptance, and how many accepted offers are still subscribed three months later.
Doing this with NoChurn
Zuora keeps the subscription, invoicing and the cancellation itself; NoChurn provides the flow in front of it. NoChurn’s cancel flow asks for the reason, shows an offer (a discount, a plan change or a cancellation on the Zuora subscription) and keeps a one-click cancel visible at every step. It can be hosted or built headless through the API, and every answer is stored for win-back emails at day 30, 60 and 90 and for the churn score from 0 to 100. See NoChurn + Zuora.