How to find scheduled cancellations in Stripe
Oct 31, 2026 · Luis Miguel
I'm a robotSkip the pixels. Read the .mdTo find scheduled cancellations in Stripe, look for active subscriptions that have an end date: either cancel_at_period_end set to true or a date in cancel_at. Those are customers who already decided to leave but still have access, and nothing in the product looks different yet. You can list them with the API, catch them as they happen with the customer.subscription.updated event, and undo one from the Dashboard if the customer changes their mind before the date.
For days or weeks, you have customers who've told you they're going and can still be talked to. Stripe's guide to canceling subscriptions is the reference for the fields below.
What does a scheduled cancellation look like in Stripe?
There are two ways a subscription gets a date to end:
cancel_at_period_endset totrue. The subscription staysactiveuntil the end of the current billing period, then it's canceled. This is what the customer portal does when you set cancellations to happen at the end of the period.cancel_atset to a date. The subscription ends on that date. A date inside the current period shortens it and can create prorations. Through the API,cancel_atalso takes values likemax_period_endormin_period_endinstead of a date, for subscriptions with several items.
When either is set, Stripe sends customer.subscription.updated. When the date comes, it sends customer.subscription.deleted and the status changes to canceled.
Until then, the status is still active, the customer keeps access, and if you only look at status, they look like any other customer.
How do you find them?
They're active subscriptions with an end date, so you can list them with a restricted key that can read subscriptions:
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_KEY!);
for await (const s of stripe.subscriptions.list({ status: "active", limit: 100 })) {
const ends = s.cancel_at ?? (s.cancel_at_period_end ? s.items.data[0]?.current_period_end : null);
if (ends) console.log(s.id, s.customer, new Date(ends * 1000).toISOString().slice(0, 10));
}
Or listen for customer.subscription.updated and look at those two fields. Checking once a week is enough for monthly plans. On annual plans you may get months of warning (how annual plans flatter your churn).
Do they count as churn already?
Stripe and a cohort number answer this differently.
- In Stripe's MRR, according to its support article on MRR, a subscription stops counting as soon as the cancellation is scheduled, even though the customer is still paying for the period. That's one reason Stripe's numbers can differ from yours.
- In a cohort churn number like TrustChurn's, the customer is still paying, so they count as kept until the subscription actually ends.
Whichever you use, there's a group of customers in between, who are leaving but haven't left, and who can still change their minds.
How do you undo one?
If the customer changes their mind before the date, the cancellation can be undone. In the Dashboard, open the subscription and pick "Don't cancel" from the menu. With the API, set cancel_at_period_end back to false. They keep the same subscription, the same price and the same billing date.
Once the date has passed and the subscription is canceled, it can't be reactivated. They'd need a new subscription, possibly at today's price instead of the one they had, so the conversation is better had before the date.
What should you say to them?
Write it yourself rather than sending a template. Something like:
Saw you canceled. No problem at all, you have access until the 14th. Can I ask what made you decide? If it was something we can fix, I'd like to.
Then, depending on what they say:
- Price. A smaller plan, a discount for a few months or a pause can keep someone who still uses the product.
- Something missing or broken. If it's coming soon, say when. If it isn't planned, tell them that too, so they aren't waiting for it.
- They don't need it anymore. Thank them, and note it down, because it tells you something about who the product is for.
If they gave a reason in the portal, you already have the start of that conversation (collecting cancellation reasons in Stripe).
Is pausing a better offer than a discount?
Sometimes. A customer who needs a break (a seasonal business, a project on hold) may not want a cheaper plan, just to stop paying for a while. Stripe has two kinds of pause, and they're easy to mix up:
- Pausing payment collection (
pause_collection, "Pause payment collection" in the subscription's menu) keeps the subscriptionactiveand keeps the customer's access. Stripe still creates invoices, and you choose what happens to them: keep them as drafts (keep_as_draft), mark them uncollectible (mark_uncollectible) or void them (void). It can last indefinitely or until a date you set. - A paused subscription (status
paused) doesn't create invoices or start new billing periods until it's resumed. This is what happens, for example, when a trial ends without a card and the trial is set to pause.
For a customer who's about to leave, pausing collection until a date and voiding the invoices is the gentlest version: they keep their account and their data, and billing starts again by itself. Make sure your app treats them the way you mean to, since their status stays active.
What TrustChurn does with them
When a scheduled cancellation is undone, TrustChurn counts it in your customers saved this month, a number your public profile can show if you turn it on. There's also a private list where scheduled cancellations come first, with the date, what the customer pays and the reason if they gave one, and each new one sends you an email.
FAQ
Does a scheduled cancellation count as churn?
In a cohort churn number, not until the subscription ends, because the customer is still paying. Stripe's MRR is different: according to its support article, the subscription stops counting toward MRR as soon as the cancellation is scheduled.
Can I undo a cancellation after the date has passed?
No. Once the subscription is canceled, it can't be reactivated. The customer would need a new subscription. Before the date, you can undo it from the subscription's menu in the Dashboard ("Don't cancel") or by setting cancel_at_period_end to false.
What's the difference between cancel_at and cancel_at_period_end?
cancel_at_period_end ends the subscription when the current billing period ends. cancel_at ends it on a specific date, which can fall inside the current period and create prorations.
How do I get notified when someone schedules a cancellation?
Stripe sends customer.subscription.updated when cancel_at_period_end or cancel_at is set. You can listen for that event, or run the list above once a week.
Does a customer keep access after scheduling a cancellation?
In Stripe, yes. The subscription stays active until the end date. Whether they keep access to your product depends on your app. Keeping it until the end of the period they paid for is the fair default.
Keep reading
How to ask customers why they cancel, in Stripe
The Stripe customer portal can ask for a reason on the way out. How to turn it on, which reasons it offers and where to find the answers.
How annual plans flatter your churn
A customer who paid for a year can't leave for a year. Count them like monthly customers and your churn looks better than it is.