WIN-BACKLEMON SQUEEZY

How to win back canceled customers on Lemon Squeezy

Winning back canceled Lemon Squeezy subscribers: the grace period, resuming before ends_at, discount codes for returning customers, and when to send each email.

Published 6 min read

On Lemon Squeezy, a cancellation is not the end of the relationship. For a while it is not even the end of the subscription. Lemon Squeezy keeps cancelled subscriptions alive until the end of the paid period, and during that window one API call brings them back. After it, you can still invite customers to return with a discount.

This guide covers both windows: what Lemon Squeezy lets you do while a cancelled subscription is still in its grace period, and how to win customers back once it has expired. It sticks to Lemon Squeezy’s own documentation: the Subscriptions help page, the Cancel a Subscription and Update a Subscription API references, the webhook event types, the Create a Discount reference and the email Subscribers page (all accessed November 2026).

What happens when a customer cancels

A cancellation on Lemon Squeezy can come from the customer (usually through the Customer Portal), from you in the dashboard, or from your app through the API with a DELETE on the subscription (Cancel a Subscription).

Either way, the result is the same:

  1. The subscription’s status becomes cancelled and cancelled is true.
  2. It enters a grace period. The ends_at attribute holds the date it will expire, which is the next renewal date.
  3. The customer keeps access until ends_at, because they paid for that period. The Subscriptions help page says customers should keep access in every status except expired.
  4. At ends_at, the status becomes expired and the subscription can no longer be resumed.

Lemon Squeezy sends subscription_cancelled when the cancellation happens, and subscription_expired when the subscription actually ends. The event types page is explicit that a cancelled subscription can be resumed during the grace period, and that subscription_resumed fires when that happens.

That gives you two distinct win-back windows.

Window Status How to bring them back Event to start from
Grace period cancelled, before ends_at Resume the same subscription subscription_cancelled
After expiry expired New checkout, optionally with a discount subscription_expired

Window 1: the grace period

This is the easiest save you will ever make. The customer still has access, their card is still on file, and nothing needs to be re-entered.

Resuming by API

The Update a Subscription reference says a subscription can be resumed before its ends_at date by sending a PATCH with cancelled set to false. The status goes back to active and billing continues on the existing schedule.

{
  "data": {
    "type": "subscriptions",
    "id": "123",
    "attributes": { "cancelled": false }
  }
}

Customers can also resume from the Customer Portal themselves, if you leave that option on.

What to do in this window

  1. Show it in the app. A cancelled customer who logs in should see “Your plan ends on March 1” and a “Keep my plan” button that calls the resume endpoint. No email is faster.
  2. Send one reminder before ends_at. A few days before the end date, a short email: what they lose, the date, and the same “Keep my plan” link pointing to your app.
  3. Do not discount yet. The customer already decided once; a discount here can train customers to cancel for a coupon. Save offers for the cancel moment itself, or for after expiry.

Window 2: after expiry

Once a subscription is expired, it is over. Lemon Squeezy’s docs we used describe no way to reactivate an expired subscription, so bringing the customer back means a new checkout. That is where discounts come in.

Create a discount for returning customers

Lemon Squeezy’s Create a Discount reference documents three duration values for subscription discounts:

  • once: applies to the first payment only (the default).
  • repeating: applies for a number of months set by duration_in_months (defaults to 1). For yearly plans, the docs say to multiply years by 12.
  • forever: applies to every payment.

For win-back, repeating is usually the right choice: “50% off your first 3 months back” has a clear end and lets the customer re-evaluate at full price. The docs also advise against repeating discounts on daily or weekly subscriptions.

Give the code a name that makes sense in an email, and limit it to the products you are inviting people back to. Then link to your checkout with the code already applied, so the customer does not have to type it.

Who can you email?

Lemon Squeezy has its own email marketing feature. Per the Subscribers page, subscribers can be added manually, through a signup form, or automatically when a customer buys a product. Its anti-spam policy requires permission before sending marketing emails, forbids pre-checked opt-in boxes, and requires a one-click unsubscribe link in every newsletter.

Whichever tool you use, check your consent basis before sending a win-back campaign. A former customer who bought from you is not automatically someone who agreed to marketing, and the rules differ by country. A plain, relevant message to people who opted in is always the safe default.

A win-back sequence that respects the customer

The content of a win-back email matters more than the discount. A sequence keyed to the reason the customer gave works better than a generic “We miss you”.

Collect the reason first

Lemon Squeezy’s portal handles the cancellation, but the docs we used do not describe a built-in cancellation reason survey. If you want reasons, ask in your own app before sending customers to cancel, or with a one-question email right after subscription_cancelled. Store the answer with the customer.

Match the message to the reason

Reason Win-back angle
Too expensive A time-limited discount, or a cheaper plan
Missing a feature Tell them when it ships, no discount needed
Not using it enough A short reminder of what changed, maybe a smaller plan
Switched to another tool One honest message about what you do differently, then stop
Temporary need A friendly check-in at the time they said they would be back

Space it out

Three touches is plenty: roughly a month after expiry, two months, and three months. Stop at the first reply or the first unsubscribe. If a customer comes back through a new checkout, Lemon Squeezy sends subscription_created; use it to stop the sequence.

Measure it on your data

Track how many expired customers start a new subscription within 90 days, by cancel reason and by whether they received an offer. That is the only win-back rate that matters for your product.

Common mistakes

  • Revoking access at cancellation. The customer paid for the period. Lemon Squeezy’s lifecycle keeps access until expired; your app should too.
  • Treating subscription_cancelled as churn. It is a scheduled end, not an end. Count churn on subscription_expired.
  • Leading with the biggest discount. Start with relevance, add an offer only where the reason calls for one.
  • Emailing people who did not opt in. It hurts deliverability and may break the law where they live.

Doing this with NoChurn

Resuming subscriptions and running checkouts stay with Lemon Squeezy. NoChurn reads your Lemon Squeezy webhooks, records the cancel reason from its cancel flow (where customers can always cancel in one click), and sends win-back emails at day 30, 60 and 90 based on that reason. Each customer also gets a churn score from 0 to 100, so you can see who is worth a personal message. NoChurn is free under $300 MRR. See NoChurn + Lemon Squeezy.

PROMPT

Read https://www.nochurn.sh/llms.txt,
then follow https://www.nochurn.sh/docs/quickstart/
to add NoChurn to this app. Use a test key
(nc_test_…) until I say we go live.

Stop leaking revenue.

  • Free until $300 MRR
  • No card needed
  • Live in 10 minutes
  • Never a cut of what we recover