How to pause subscriptions on Lemon Squeezy
Pausing a Lemon Squeezy subscription: the free and void modes, resumes_at, the dashboard and portal, the webhooks, and how to offer a pause before a cancel.
A customer who wants a break is not the same as a customer who wants to leave. If the only button they can find is “Cancel”, you lose both. Lemon Squeezy has a native pause feature, and it is more flexible than many teams realise: two pause modes, an optional automatic resume date, and full API support.
This guide explains how pausing works on Lemon Squeezy, how to trigger it from the dashboard, the customer portal or the API, and how to offer it at the right moment. It sticks to Lemon Squeezy’s own documentation: the Update a Subscription API reference, the Subscription object reference, the managing subscriptions guide, the Customer Portal page and the webhook event types (all accessed November 2026).
The two pause modes
Lemon Squeezy pauses a subscription by setting a pause object on it. The object has a mode, and the Update a Subscription reference documents two values:
| Mode | What Lemon Squeezy says it is for | What the customer gets |
|---|---|---|
void |
When you cannot offer your service for a period (maintenance is the example given): invoices are voided so customers are not charged | No charge, and by implication no service |
free |
Offering the subscription for free while halting payment collection | No charge, and continued service |
Both modes stop payment collection. The difference is about what you promise in return, and that is a product decision, not a billing one. Lemon Squeezy does not enforce access for you: your app decides what a paused customer can do.
In practice:
voidis the usual “pause” a customer asks for. They are not using the product for a while, and they are not paying for it.freeis a goodwill gesture. Use it when you want to keep a customer using the product without charging them, for example while you fix an issue that affected them.
Pausing with a resume date
The pause object also takes an optional resumes_at, an ISO 8601 date-time. When it is set, the subscription continues collecting payments from that date. Without it, the pause lasts until someone unpauses it.
The documentation we used does not state a maximum pause length. If you want one, enforce it in your own interface by always sending a resumes_at.
Unpausing
To end a pause, you set pause to null on the subscription. Per the Update a Subscription reference, the subscription then changes back to active and payment collection resumes on its original schedule.
“Original schedule” is worth thinking about. The billing anchor does not move because of the pause, so a customer who unpauses may be charged at their usual renewal date rather than on the day they come back. If that could surprise them, say so on the screen where they resume.
Three ways to pause
1. From the dashboard
The managing subscriptions guide describes the manual path: in your Lemon Squeezy dashboard, go to Store, then Subscriptions, select the subscription, and click “Pause Subscription”. Useful for support requests.
2. From the customer portal
Lemon Squeezy’s hosted Customer Portal lets subscribers pause and unpause, cancel and resume, and switch products. You choose which features the portal shows in its design settings. If you rely on the portal, check that pausing is turned on and visible next to cancellation.
3. From the API
To pause from your own app, send a PATCH to the subscription endpoint with a pause object, as shown in the Update a Subscription reference. A minimal request body, in JSON:API format:
{
"data": {
"type": "subscriptions",
"id": "123",
"attributes": {
"pause": {
"mode": "void",
"resumes_at": "2027-02-01T00:00:00.000000Z"
}
}
}
}
To unpause, send the same request with "pause": null.
What changes on the subscription
According to the Subscription object reference:
- A paused subscription has the status
paused. - The
pauseattribute holds the mode andresumes_atwhile paused, and isnullotherwise.
The event types page lists two dedicated events, subscription_paused and subscription_unpaused. Lemon Squeezy also sends subscription_updated on every change, so if you already handle that event and read status, pausing needs no extra webhook.
How to offer a pause well
Lemon Squeezy gives you the mechanics. Whether customers actually choose a pause depends on how you offer it.
Offer it at the moment of cancellation
The highest-intent moment is when the customer clicks “Cancel”. If your app sends customers straight to the portal, they see pause as one option among several. If you build your own cancel page, you can ask why they are leaving first, then offer a pause to the customers whose reason fits: “taking a break”, “seasonal”, “not using it right now”, “budget this month”.
Keep the cancel option visible on that page. A pause offer should be a genuine alternative, not a wall. Hiding cancellation creates support tickets and chargebacks, and in several places it is regulated.
Make the pause concrete
“Pause your subscription” is vague. “Pause for 1, 2 or 3 months, no charge, your data stays here” is a decision someone can make in five seconds. Map each choice to a resumes_at and send it with the request.
Tell them before it ends
A pause that silently resumes billing feels like a trap. Schedule a reminder a few days before resumes_at: “Your pause ends on March 1. You’ll be charged on your usual date. Want to extend or cancel?” Lemon Squeezy’s docs we used do not describe a built-in reminder for this, so send it from your own email tool.
Pick the mode on purpose
For a customer-requested break, use void. Reserve free for when you choose to keep serving a customer at no cost. Mixing them up means either charging for nothing or giving away service you meant to pause.
Measure it
Count subscription_paused events and what happens next for each paused customer: unpaused and renewed, cancelled during the pause, or cancelled right after resuming. That tells you whether pause offers save customers or only delay the cancellation.
A checklist before you ship
- Pausing is enabled in the customer portal, or your own cancel page offers it.
- Your app maps
pausedto an access rule (no access forvoid, normal access forfree). - Every pause from your interface sends a
resumes_at. - A reminder goes out before the pause ends.
- Your webhook handler updates your records on
subscription_paused,subscription_unpausedorsubscription_updated. - You have tested the full path in test mode with simulated webhook events.
Doing this with NoChurn
Pausing itself stays a Lemon Squeezy feature; NoChurn uses it rather than replacing it. NoChurn adds a cancel flow in front of the cancel button: the customer gives a reason, sees an offer that fits it (a pause, a discount or a plan change), and can always cancel in one click. The flow is hosted, or headless through the API if you want it fully in your own design. Answers feed the churn score and the win-back emails sent at day 30, 60 and 90. See NoChurn + Lemon Squeezy.