What happens when a user accepts “Pause” in Juttu

  • Juttu updates the subscription in your payment provider (source of truth) - Stripe or Paddle
  • Your app should react to Stripe webhooks to toggle in-app access
  • Optional: Show a Pause Wall to paused users, with clear actions to Resume or Cancel

Webhook refs:


Stripe Integration Details

Juttu uses Stripe’s pause collection feature to manage pauses.

How it works

When a pause is accepted, Juttu updates the subscription:

pause_collection: {
  behavior: "void",
  resumes_at: resumeTimestamp
}

This tells Stripe to:

  • Keep the subscription active
  • Void invoices created during the pause
  • Automatically resume billing at resumes_at

IMPORTANT: Stripe does not change the subscription status — it stays "active".

You should simply treat pause_collection != null as paused in your system.

How to detect a pause (in your webhook)

Listen for the customer.subscription.updated event.

When it fires, check for the presence of the pause_collection object in the subscription payload:

if (event.type === 'customer.subscription.updated') {
  const subscription = event.data.object;

  if (subscription.pause_collection) {
    // Subscription is paused
    // Optional: subscription.pause_collection.resumes_at tells you when it auto-resumes
  } else {
    // Subscription is active (not paused)
  }
}
  • customer.subscription.updated → fires when pause is applied or removed
  • invoice.created (status = "void") → during the pause period
  • invoice.voided → when invoices are voided

What to do in your app when a user is paused

In short, you probably want to restrict access to your app.
There are different options and behaviors that you can add to make this experience nicer for the user.
A pause wall is the best approach for most companies.

How the Pause Wall works (end-user view)

A pause wall is a pop-up that restricts access to your application, informs the user about his/her status (paused) and gives the option for the user to take action (resume subscription now).

The minimal version of a pause wall

  1. Listen to provider webhooks
  2. Gate the app behind a Pause Wall (popup) when subscription.pause_collection != null

How a pause wall works in detail:

User pauses their subscription.

Then they visit your application site.

Activation

  • Subscription’s pause_collection is set (Stripe)

Behavior

  • Blocks access to your main app via a pop-up
  • An advanced pause wall shows options to:
    • Resume now (trigger immediate unpause in Stripe)
    • Optional: cancel at term end
    • Soft wall: Allow to access parts of the app, but restrict others

FAQ

Why use pause_collection instead of setting status = paused?

Short answer: it keeps the subscription live, clean, and automatically restorable.

Upsides of using pause_collection

  1. Subscription stays active
    • Keeps subscription data, history, and analytics intact
    • Avoids breaking integrations tied to subscription ID
  2. Automatic resumption
    • Stripe resumes billing at resumes_at automatically
    • No manual reactivation or new subscription creation needed
  3. Cleaner analytics
    • MRR and churn metrics remain accurate
    • You can measure pause → resume retention
  4. Better customer experience
    • Seamless resume, no new payment required
    • No disruption to trials, add-ons, or custom plans
  5. Simpler state management
    • One continuous subscription lifecycle
    • No need to link “old” and “new” subscriptions
    • All metadata persists