Create a Pause Flow in Stripe
Create a pause flow in Stripe using the subscription pause_collection API to let customers freeze billing for 1-3 months instead of canceling. Paused customers resume at 60-70% rates, compared to 8-12% win-back rates for fully churned users. Offer pause as a cancel flow alternative for "not using it right now" responses.
When a customer wants to cancel, the best outcome isn't always saving them on the spot. Sometimes the best outcome is a pause. A paused customer isn't churned. they're on a break. They keep their account, their data, their configuration. And when they're ready to come back, resuming is one click instead of re-onboarding from scratch. SaaS companies that offer pause as a cancel flow alternative report that 40-60% of paused customers eventually resume their subscription. That's voluntary churn you would have lost permanently to a hard cancel. Compare this to the 5-15% success rate of win-back campaigns for fully cancelled customers. Here are three ways to add pause functionality to your Stripe SaaS. Also see our guides on adding a cancel flow to Stripe and creating discount coupons for other retention tactics.
Why pause beats cancel
When a customer cancels, re-engaging them requires a win-back campaign, a re-signup flow, and often a discount to overcome the friction. The average win-back rate for fully cancelled customers is 5-15%. Compare that to the 40-60% resume rate for paused customers. The math is clear: every customer you convert from "cancel" to "pause" is 3-8x more likely to return.
Pause is especially effective for customers who say:
- "I'm not using it enough right now". seasonal businesses, part-time projects, budget freezes
- "Things are tight this month". temporary cash flow issues, not a fundamental pricing objection
- "I need a break". burnout, vacation, shifting priorities
For these customers, a hard cancel is overkill. A pause preserves the relationship.
Method 1: Stripe API
Stripe has native support for pausing subscriptions through the pause_collection parameter on the Subscription object. Here's how to implement it:
Step 1: Pause the subscription
Use stripe.subscriptions.update() with the pause_collection parameter:
// Pause for 30 days (void invoices during pause)
const subscription = await stripe.subscriptions.update(
'sub_1234567890',
{
pause_collection: {
behavior: 'void',
resumes_at: Math.floor(Date.now() / 1000) + (30 * 24 * 60 * 60),
},
}
);
// behavior options:
// 'void'. don't create invoices during pause (most common)
// 'keep_as_draft'. create draft invoices but don't charge
// 'mark_uncollectible'. create invoices and mark uncollectibleThe behavior: 'void' option is what most SaaS apps want. It skips invoicing entirely during the pause period. The customer isn't charged, and no invoices are created. When the pause ends, billing resumes automatically on the next billing cycle.
Step 2: Set a resume date
The resumes_at parameter is a Unix timestamp. Set it to 30, 60, or 90 days from now. If you omit resumes_at, the subscription stays paused indefinitely until you explicitly resume it. For most SaaS apps, setting a fixed resume date is better because it creates a natural return point and prevents customers from staying paused forever.
Offer the customer a choice of pause durations:
- 30 days, for temporary cash flow issues or short breaks
- 60 days, for seasonal businesses or longer projects
- 90 days; the maximum you should offer before the customer likely forgets you exist
Step 3: Handle resume logic
When the resume date arrives, Stripe automatically unpauses the subscription and resumes billing. You can also let the customer resume early:
// Resume immediately (customer clicks "Resume" in your app)
const subscription = await stripe.subscriptions.update(
'sub_1234567890',
{
pause_collection: null, // removes the pause
}
);Setting pause_collection to null clears the pause. The next invoice will be generated on the next billing cycle date.
Step 4: Handle access control
When a subscription is paused, the subscription status stays active in Stripe. You need to check the pause_collection field to determine if billing is paused. In your app, decide what paused customers can access: read-only mode (view data but can't create new items), full lockout (show a "Your subscription is paused" page), or limited access (basic features only). Most SaaS apps go with read-only mode. It preserves the value of the customer's data and gives them a reason to resume.
Method 2: Stripe Customer Portal
Stripe's Customer Portal can be configured to allow customers to pause their own subscriptions. Set this up in Dashboard > Settings > Customer portal > Subscriptions > Pause subscriptions.
What you get:
- Stripe-hosted pause UI. No code to build or maintain
- Customer can pause and resume on their own
- Configurable pause durations
What you don't get:
- Custom branding. it's Stripe's UI, not yours
- Conditional offers. You can't show pause only when the customer selects certain cancel reasons
- Analytics. No tracking of how many customers pause vs cancel vs accept a discount
- Integration with cancel flow; the pause option isn't tied to an exit survey
The Portal method works if you want a zero-code solution and don't need pause to be part of a cancel flow. But for retention-optimized flows where pause is one of several offers, you'll want more control.
Method 3: Cancel flow widget
The most effective approach is to offer pause as an alternative within a cancel flow. When a customer clicks "Cancel subscription," instead of immediately cancelling, you show an exit survey, then present a retention offer based on their reason, and for reasons like "not using it enough" or "need a break," the offer is a pause.
SaveMRR's Cancel Shield widget does this automatically. When activated, it intercepts the cancel button, shows a survey, and offers contextual alternatives. including pause. If the customer selects "Not using it enough," Cancel Shield offers a 30, 60, or 90 day pause. If they accept, it calls stripe.subscriptions.update() with pause_collection behind the scenes. The customer stays subscribed, and you see the save in your dashboard.
The widget approach is the most effective because pause is offered at the exact moment the customer is about to churn, and it's personalized to their reason. Generic "Would you like to pause?" modals convert at 10-15%. Reason-matched pause offers convert at 25-40%.
Best practices for pause flows
- Always set a resume date. indefinite pauses become forgotten subscriptions. 30/60/90 day options work best.
- Send a reminder before resume. email the customer 3-7 days before their pause ends so they're not surprised by a charge
- Offer read-only access during pause; this keeps the customer's data valuable and gives them a reason to come back
- Track pause-to-resume rate. If your resume rate is below 30%, your pause durations might be too long or your product might have a deeper issue
- Don't offer pause to everyone. reserve it for customers whose cancel reason suggests a temporary issue, not a fundamental fit problem
- Limit pauses per year. consider allowing 1-2 pauses per year to prevent gaming
Comparison: 3 methods
| Method | Setup time | Cancel flow integration | Best for |
|---|---|---|---|
| Stripe API | 4-8 hours | Custom (you build it) | Full control, custom UX |
| Customer Portal | 15 min | No | Quick start, standalone pause |
| Widget (SaveMRR) | 3 min | Yes (built-in) | Highest save rate, zero code |
Next step
Before adding a pause flow, find out how many customers are cancelling for reasons that a pause would solve. SaveMRR's free Revenue Scan analyzes your Stripe data and shows your churn breakdown by type. If a significant portion of your voluntary churn comes from customers who are "not using it enough" or facing temporary budget issues, a pause flow will have high impact. The scan takes 2 minutes and requires no code changes.
