CANCEL FLOWSSTRIPE

How to pause a subscription on Stripe instead of losing the customer

The ways to pause a Stripe subscription: pause_collection and its three behaviors, the newer pause endpoint, the customer portal option, and how resuming works.

Published 6 min read

A customer who says “I don’t need this for a couple of months” is not the same as one who wants to leave. If the only button they see is Cancel, you lose both. A pause keeps the account, the history and the payment method in place, and gives the customer an easy way back.

Stripe now has more than one way to pause, and they behave differently. This guide explains each one, when to use it, and how resuming works. It sticks to Stripe’s documentation: pause payment collection, pause subscriptions, the pause subscription API reference, the changelog entries for pause and resume on demand and pausing in the customer portal, and using webhooks with subscriptions (all accessed November 2026).

Two different things called “pause”

Stripe has two mechanisms, and mixing them up causes most of the confusion.

Pause payment collection Pause the subscription
How Set pause_collection on the subscription Call the pause subscription endpoint
Subscription status Unchanged (for example, stays active) Becomes paused
Invoices Still created, then handled by the behavior you chose Not generated while paused
Billing periods Keep advancing Do not advance
Resume Clear pause_collection, or set resumes_at Resume through the API
Events customer.subscription.updated customer.subscription.paused, then customer.subscription.resumed

The first is older and widely used. The second was added in Stripe’s 2026-09-30 changelog and is closer to what customers mean by “pause my account”. Check which API version your integration uses before relying on the newer endpoint.

Option 1: pause payment collection

Pausing payment collection keeps the subscription running but stops you from charging for it. You choose one of three behaviors:

  • keep_as_draft: you offer the service for free for now and collect payment later. Invoices stay as drafts.
  • mark_uncollectible: you offer the service for free and mark the invoices as uncollectible.
  • void: you offer the service for free and never collect for the period. Invoices are voided.

You can set an optional resumes_at timestamp so collection restarts on its own. Without it, collection stays paused until you clear pause_collection. Stripe also notes that any existing customer balance is still applied to invoices during the pause.

When it fits

Payment collection pauses suit situations where the customer keeps access: a goodwill gesture after an outage, a few free weeks while a customer sorts out a budget, or a B2B account waiting on a purchase order. For a customer who will not use the product at all for a while, it is a poor fit: the subscription status stays the same, periods keep advancing, and your own app has to decide whether to block access.

For a retention offer, void is usually the honest choice. keep_as_draft means the customer owes the paused months later, which surprises people who thought “pause” meant “no charge”.

Option 2: pause the subscription itself

With the pause subscription endpoint, the pause takes effect immediately. According to Stripe’s pause subscriptions guide:

  • The subscription status becomes paused.
  • A paused subscription does not generate invoices and does not advance to new billing periods.
  • You resume it through the API. Resume is only available on subscriptions that use charge_automatically collection.
  • If resuming does not generate an invoice, the status goes back to active immediately.
  • A coupon on the subscription keeps its original validity period. The pause does not extend it.

Stripe sends customer.subscription.paused when the status changes to paused and customer.subscription.resumed when it comes back. The webhooks guide is explicit that customer.subscription.resumed does not apply when only payment collection is unpaused, which is a good reminder that the two mechanisms are separate.

Other ways a subscription becomes paused

Two cases produce the paused status without you calling the endpoint:

  1. A trial ends without a payment method, if you configured the trial to pause in that case. Stripe documents this in the webhooks guide.
  2. A payment fails and you use pause on payment failure. Only eligible subscriptions on flexible billing mode can pause this way. You choose automatic resume or a manual resume, and the status_details.paused.subscription.type field tells you why a subscription paused.

If you read paused subscriptions in your own reports, use that field so a voluntary pause is not counted the same way as a trial that ended without a card.

Option 3: let customers pause in the customer portal

Stripe’s 2026-10-28 changelog adds pausing to the redesigned customer portal:

  1. In your portal configuration, set features.subscription_pause.enabled to true.
  2. Optionally set features.subscription_pause.duration to offer predefined pause lengths.
  3. To send a customer straight into the pause flow for one subscription, create a portal session with flow_data.type set to subscription_pause and the subscription ID.

This is new, and older Stripe support articles still say the portal cannot pause subscriptions. Rely on the changelog and the API reference for your API version, and test it in a sandbox before you announce it to customers.

How to offer a pause well

Whichever mechanism you use, the offer matters as much as the plumbing.

  1. Offer it at the right moment. A pause is most useful when the cancel reason is temporary: seasonal business, a project on hold, travel, budget timing. It is a weak answer to “it’s too expensive” or “missing features”. Our guide on pause vs discount offers covers which offer fits which reason.
  2. Give fixed lengths. One, two or three months is easier to choose than an open-ended pause, and the subscription comes back on its own. Use resumes_at for collection pauses, or the portal’s predefined durations.
  3. Say exactly what happens. Will the customer keep access? Will they be charged on resume? When? Put the resume date in the confirmation email.
  4. Remind before resuming. Send a short email a few days before the pause ends, with a link to extend the pause or cancel. Surprise renewals after a pause turn into refund requests and disputes.
  5. Keep cancel visible. A pause offer is an offer, not a gate. The customer must still be able to cancel in one step. See click to cancel rules.

Handling resume in your app

Pausing touches access control, so wire up the events:

  • On customer.subscription.paused, switch the account to a paused state. Decide whether data stays readable and say so in the product.
  • On customer.subscription.resumed, restore access and log the resume.
  • For collection pauses, watch customer.subscription.updated and read the pause_collection field, since the status does not change.
  • Count pauses separately in your churn reporting. A paused customer has not churned, but a pause that ends in a cancellation should be attributed to the original cancel reason. See how to calculate churn rate.

Testing checklist

  • A collection pause with void produces voided invoices and no charge.
  • A collection pause with resumes_at restarts billing on that date.
  • A subscription pause sets status paused and stops invoices.
  • Resume returns the subscription to active and your app restores access.
  • Your app reacts to paused and resumed events, and ignores collection unpauses for the resumed logic.
  • The reminder email goes out before every scheduled resume.

Doing this with NoChurn

NoChurn’s cancel flow asks for the cancellation reason and can offer a pause, a discount or a plan change based on it, with a one-click cancel button visible at every step. It runs hosted, or headless through the API if you want your own design. The pause itself is applied in your Stripe account. Every answer is stored and later used for win-back emails at day 30, 60 and 90 and for the churn score. See NoChurn + Stripe.

PROMPT

Read https://www.nochurn.sh/llms.txt,
then follow https://www.nochurn.sh/docs/quickstart/
to add NoChurn to this app. Use a test key
(nc_test_…) until I say we go live.

Stop leaking revenue.

  • Free until $300 MRR
  • No card needed
  • Live in 10 minutes
  • Never a cut of what we recover