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.
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_automaticallycollection. - If resuming does not generate an invoice, the status goes back to
activeimmediately. - 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:
- A trial ends without a payment method, if you configured the trial to pause in that case. Stripe documents this in the webhooks guide.
- 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.typefield 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:
- In your portal configuration, set
features.subscription_pause.enabledto true. - Optionally set
features.subscription_pause.durationto offer predefined pause lengths. - To send a customer straight into the pause flow for one subscription, create a portal session with
flow_data.typeset tosubscription_pauseand 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.
- 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.
- 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_atfor collection pauses, or the portal’s predefined durations. - Say exactly what happens. Will the customer keep access? Will they be charged on resume? When? Put the resume date in the confirmation email.
- 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.
- 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.updatedand read thepause_collectionfield, 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
voidproduces voided invoices and no charge. - A collection pause with
resumes_atrestarts billing on that date. - A subscription pause sets status
pausedand stops invoices. - Resume returns the subscription to
activeand your app restores access. - Your app reacts to
pausedandresumedevents, 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.