WIN-BACKGOOGLE PLAY

How to win back lapsed subscribers on Google Play

How to bring canceled and expired Google Play subscribers back: restore, Resubscribe, winback offers, promo codes, deep links and returning purchases.

Published 6 min read

On Google Play, a subscriber who leaves goes through two stages. First they cancel: renewal stops but access continues until the end of the period. Then the subscription expires. Google gives you different tools for each stage, some inside your app and some in the Play Store itself, and a returning subscriber can come back through any of them.

This guide maps those tools, shows how to target offers at lapsed users, and explains the backend work needed so a returning subscriber is linked to the right account. It sticks to Google’s documentation, mainly subscriptions: customer management, the subscription lifecycle, promo codes and the Google Play Developer API reference for subscription offers (all accessed November 2026).

The four ways back

Google’s subscriptions guide has a table of “winback” options by stage and place. Summarized:

Before expiry, in app Before expiry, in Play Store After expiry, in app After expiry, in Play Store
Feature New in-app purchase Restore New in-app purchase Resubscribe
Checkout flow Yes No Yes Yes
New purchase token Yes No Yes Yes
Enabled by default No Yes, all developers must support it No Yes for apps on Billing Library 2.0+, can opt out
When the user pays Same product: end of current period End of current period Immediately Immediately

Before expiry: restore

While a canceled subscription is still active, the user can tap Resubscribe in the Play Store’s subscriptions center. Google calls this a restore: the cancellation is undone, the subscription keeps its purchase token and renews as if nothing happened. Supporting it is required for all developers. Your backend receives SUBSCRIPTION_RESTARTED, and Google suggests you record that the subscription will renew and stop showing restoration messages.

From your app, you can do the same with a new purchase. For the same product, the new subscription replaces the old one and keeps the same renewal date. For a different product or a winback price, Google suggests an upgrade or downgrade with the WITHOUT_PRORATION replacement mode, so the user is charged the new price on the original expiry date.

After expiry: Resubscribe in the Play Store

If enabled for the base plan (the default for eligible apps), the user can buy the same subscription again from the Play Store. Google’s subscriptions guide says this works “for up to one year after expiration”; the lifecycle guide adds that the button may not appear for various reasons, for example when a subscription expired long ago.

This creates a new purchase with a new token, made outside your app. You must process it on your backend (see below), or the user is refunded automatically after three days.

After expiry: in your app

A user who still has your app can subscribe again through the normal purchase flow. Here you choose what to show: the regular plan, or a discounted one.

Making a winback offer

Google’s guide talks about a “winback SKU”: a product or offer with special pricing for returning users, shown in your app or sent “outside of the app, such as in email.”

With base plans and offers, a winback discount is an offer on a base plan. Each offer can have up to two phases (for example, three discounted months, then the base price) and per-region prices: a fixed price, an absolute discount, a relative discount, or free.

Who sees the offer

Offer targeting in the API reference supports two rule types:

  • Acquisition: the user never had this subscription, or any subscription in the app.
  • Upgrade: the user currently has this subscription or a specific one, optionally with a given billing period, and optionally only once per user.

Neither rule says “lapsed subscriber”. The reference adds that these are the requirements Play evaluates, and that “developers may further filter these offers themselves.” In practice, a winback offer is an offer you show only to users your backend knows have lapsed, filtered in your app using offer tags (up to 20 per offer).

Free trials for returning users

Two details from Google’s guide:

  • A user who resubscribes to the same product is “no longer eligible for free trials or introductory price.” Your UI must not promise one.
  • If you put a free trial or intro price on a winback product, make sure the Allow one free trial per app setting in the Play Console does not exclude returning users.

Promo codes

Promo codes give a free trial on a subscription. Google says users who previously subscribed but no longer are “are still eligible for a free trial through a promotion.” Limits to know:

  • Promo codes give free trials, not free subscriptions.
  • One promo code per subscription product.
  • Up to 10,000 one-time use codes per quarter per subscription product; unused codes do not carry over.
  • Custom (shared) codes can only be redeemed by users who have not subscribed before, so for win-back use one-time codes.
  • A promotion can last up to one year.

Bringing users to the right place

Google recommends a link in your app’s settings to manage subscriptions, and documents two deep links:

  • All subscriptions: https://play.google.com/store/account/subscriptions
  • One subscription: the same URL with ?sku= your product ID and &package= your package name.

The first is the one Google suggests “to help a user restore a canceled subscription.” For users whose subscription has expired, send them to your app’s subscription screen instead, where you can show the winback offer.

Processing a returning purchase

This is where many winbacks quietly fail.

  1. Listen for SUBSCRIPTION_PURCHASED. A Play Store resubscription is a new purchase with a new token, made outside your app.
  2. Call purchases.subscriptionsv2.get. For resubscriptions from the Play Store, the response includes outOfAppPurchaseContext, with the expired subscription’s purchase token and the obfuscated account and profile IDs from that previous subscription, if you set them. Use either to find the user.
  3. Acknowledge it from your backend within three days, even if the user never opens the app. Otherwise Google refunds and revokes it.
  4. For in-app re-signups before expiry, the new purchase carries a linkedPurchaseToken pointing to the old one. Google asks you to invalidate the old token.

A practical plan

  1. Track the stage. Canceled but active (SUBSCRIPTION_CANCELED, future expiry), expired (SUBSCRIPTION_EXPIRED), or lost to billing after account hold. Each needs a different message.
  2. Read why they left. The subscription resource’s canceledStateContext tells you whether the user, the system or you canceled, and the user’s cancel survey answer if they gave one. See Google Play’s cancellation survey.
  3. Before expiry, one message in the app with the end date and a restore link. No discount yet.
  4. After expiry, a sequence spaced over weeks, matched to the reason: cost gets the winback offer, “not enough usage” gets news and maybe a promo-code trial, technical issues get an honest update on the fix.
  5. Email only those who gave you their address. Play’s real-time notifications don’t include the user’s email address. You need your own account and the obfuscated account ID set at purchase to connect the two.
  6. Measure returns with SUBSCRIPTION_PURCHASED linked to a previously expired user, and check whether they stay past the discounted phase.

Doing this with NoChurn

NoChurn reads your Google Play real-time developer notifications and the subscription state, so it knows who canceled, who expired, who was lost after account hold, and what they answered in the cancel survey. It sends win-back emails at day 30, 60 and 90 based on that reason, to users whose email you share from your app, pointing them to your app or to Google Play. Google keeps the checkout, the offer pricing and the payment. See NoChurn + Google Play.

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