What does the Google Play notification SUBSCRIPTION_RENEWED mean?

The Google Play notification SUBSCRIPTION_RENEWED means an active subscription renewed for another period.

Quick facts#

Notification subscriptionNotification.notificationType 2, SUBSCRIPTION_RENEWED
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 An active subscription was renewed.

What triggers it#

  • The renewal charge succeeded on the billing date.
  • For installment subscriptions, Google sends it each time a payment is charged on its billing date.
  • Renewals do not need to be acknowledged.

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. Check the customer is still entitled, then store the new expiryTime from the subscription resource.
  3. Do not acknowledge a renewal: Google says it is not needed.
  4. Keep the order ID (latestOrderId), which is new for every renewal.
  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":2,"purchaseToken":"PURCHASE_TOKEN"}})).toString("base64") } };

function decide(body) {
  const n = JSON.parse(Buffer.from(body.message.data, "base64").toString("utf8"));
  if (!(n.subscriptionNotification?.notificationType === 2)) return "ignore";
  return "extend access to the new expiryTime";
}

console.log(decide(body));

Run-checked: npm run check:snippets runs this snippet with Node and compares its output with extend access (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. A new order on the token gives a RENEWAL event, with is_trial_conversion: true when the previous period was a free trial. Renewal order IDs carry a ..N suffix, which is how RevenueDot tells a renewal order from the first.

Source#

Checked: 2026-10-03

Edit this page on GitHub ↗ View as Markdown Last updated