What does the Google Play notification SUBSCRIPTION_RESTARTED mean?

The Google Play notification SUBSCRIPTION_RESTARTED means a customer undid a cancellation before the subscription expired.

Quick facts#

Notification subscriptionNotification.notificationType 7, SUBSCRIPTION_RESTARTED
Where Google Play real-time developer notifications (Pub/Sub, DeveloperNotification)
Sent by Google Play, as a Cloud Pub/Sub push to your endpoint
What Google says The user restored their subscription from Play, Account, Subscriptions. The subscription was cancelled but had not expired when the user restored it.

What triggers it#

  • The customer tapped Resubscribe on a cancelled subscription that was still running. Google calls this a restore.
  • The same purchase token continues and all cancellation fields are cleared.
  • After expiry the same action is a new purchase and arrives as SUBSCRIPTION_PURCHASED.

What your server should do#

  1. Do not trust the message for the state. Google says a notification only tells you the purchase state changed; call the Google Play Developer API (purchases.subscriptionsv2.get) with the purchase token to get the full state.
  2. Record that the subscription is set to renew again and stop showing restore messages.
  3. Do not grant anything new: the customer already has access until expiryTime.
  4. Stop your win-back flow for this customer.
  5. Answer 2xx once you have handled the message, and skip a messageId you have seen: Google recommends checking the uniqueness of message IDs so a redelivery does not make a second API call.

Example#

JavaScript
// A Pub/Sub push body: the notification is base64 JSON in message.data.
const body = { message: { messageId: "136969346945", data: Buffer.from(JSON.stringify({"version":"1.0","packageName":"com.example.app","eventTimeMillis":"1790800914000","subscriptionNotification":{"version":"1.0","notificationType":7,"purchaseToken":"PURCHASE_TOKEN"}})).toString("base64") } };

function decide(body) {
  const n = JSON.parse(Buffer.from(body.message.data, "base64").toString("utf8"));
  if (!(n.subscriptionNotification?.notificationType === 7)) return "ignore";
  return "mark as renewing, stop restore messages";
}

console.log(decide(body));

Run-checked: npm run check:snippets runs this snippet with Node and compares its output with mark as renewing (checked 2026-10-03).

How RevenueDot handles it#

RevenueDot answers every handled message with 2xx and every temporary failure with 5xx so Pub/Sub redelivers it. For subscription types it re-reads the subscription from Google with purchases.subscriptionsv2.get and applies that state, and it acknowledges a new purchase if the app has not. A purchase RevenueDot has not seen is applied only when the app's Track new purchases from server-to-server notifications setting is on. The cancellation is cleared on the stored purchase and RevenueDot sends UNCANCELLATION.

Source#

Checked: 2026-10-03

Edit this page on GitHub ↗ View as Markdown Last updated