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 uncollectible

The 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

MethodSetup timeCancel flow integrationBest for
Stripe API4-8 hoursCustom (you build it)Full control, custom UX
Customer Portal15 minNoQuick start, standalone pause
Widget (SaveMRR)3 minYes (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.

Frequently asked questions

Does Stripe support pausing subscriptions?

Yes. Stripe has native pause support through the pause_collection parameter on the Subscription object. You call stripe.subscriptions.update() with pause_collection set to behavior 'void' and an optional resumes_at timestamp. The subscription stays active in Stripe but billing is frozen until the resume date.

What percentage of paused customers actually resume?

SaaS companies that offer pause as a cancel alternative report that 60-70% of paused customers eventually resume their subscription. Compare that to the 8-12% win-back rate for fully churned customers. Every customer you convert from cancel to pause is 3-8x more likely to return.

How long should I let customers pause their subscription?

Offer 30, 60, or 90 day pause options. Thirty days works for temporary cash flow issues, 60 days for seasonal businesses, and 90 days is the maximum before customers typically forget you exist. Always set a fixed resume date rather than allowing indefinite pauses to create a natural return point.

Should I give paused customers access to my product?

Most SaaS apps use read-only mode during a pause, where customers can view their data but cannot create new items. This preserves the value of their stored data and gives them a reason to resume. Note that Stripe keeps the subscription status as 'active' during a pause, so you need to check the pause_collection field separately.

When should I offer pause instead of a discount during cancellation?

Offer pause when the customer selects reasons like 'not using it enough,' 'things are tight this month,' or 'need a break.' These signal temporary situations, not fundamental pricing or product objections. Reason-matched pause offers convert at 25-40%, compared to 10-15% for generic pause modals shown to everyone.

Your Stripe has a leak. Let's find it.

Free Revenue Scan: paste your Stripe key, see every dollar you lost in 60 seconds. No card needed.

Run my free scan