# How to find scheduled cancellations in Stripe

> A customer who cancels at the end of the period still looks active in Stripe. How to find them and what to do before the date.

By Luis Miguel, founder of TrustChurn. Published 2026-10-31.
Web version: https://trustchurn.com/blog/scheduled-cancellations-stripe

To 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](https://docs.stripe.com/billing/subscriptions/cancel) 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_end` set to `true`.** The subscription stays `active` until 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_at` set 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_at` also takes values like `max_period_end` or `min_period_end` instead 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:

```ts
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](https://trustchurn.com/blog/annual-plans-and-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](https://trustchurn.com/blog/stripe-churn-rate-doesnt-match).
- **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](https://trustchurn.com/blog/stripe-cancellation-reasons)).

## 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 subscription `active` and 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](https://trustchurn.com/blog/stripe-cancellation-reasons.md)
- [How annual plans flatter your churn](https://trustchurn.com/blog/annual-plans-and-churn.md)

TrustChurn is a public ranking of SaaS by monthly churn, read from Stripe with a read-only restricted key, not typed by the founder. The formulas are public: https://trustchurn.com/methodology
