---
id: "customers/google-play-renewal-extensions"
title: "Google Play Renewal Extensions and Entitlements"
description: "On Google Play, the previous billing period can end before Google updates the subscription. That next update might be a formal grace period, a short deferred renewal charge, or another extension of expiryTime. Until the update arrives, RevenueCat active entitlements follow the existing period end and are empty, even though the subscription hasn't been confirmed as ended and an expiration event hasn't been sent."
permalink: "/docs/customers/google-play-renewal-extensions"
slug: "google-play-renewal-extensions"
version: "current"
original_source: "docs/customers/google-play-renewal-extensions.md"
---

> **AI agents:** This is the Markdown version of a RevenueCat documentation page. For the complete documentation index, see [llms.txt](https://www.revenuecat.com/docs/llms.txt).

On Google Play, the previous billing period can end before Google updates the subscription. That next update might be a formal [grace period](https://www.revenuecat.com/docs/subscription-guidance/how-grace-periods-work), a short deferred renewal charge, or another extension of `expiryTime`. Until the update arrives, RevenueCat active entitlements follow the existing period end and are empty, even though the subscription hasn't been confirmed as ended and an expiration event hasn't been sent.

Use this page to understand that shared edge-case state and optionally soft-handle access checks. After Google extends the period, entitlements return. Which webhooks you see next depends on whether Google entered grace, deferred charging, or renewed.

## Why entitlements can be empty before an extension

At the planned renewal time, entitlements go empty. They stay empty until Google updates the subscription by entering grace, extending the period, or renewing. That update can land minutes or hours after the previous `expiryTime`. Enabling a grace period in Play Console doesn't fill that window by itself. Access continues through grace only after Google has reported grace or pushed the period end forward.

Two common paths after the previous period end:

| What Google does next | What you typically see in RevenueCat | Entitlement access before the update | Entitlement access after the update |
| :-------------------- | :----------------------------------- | :----------------------------------- | :---------------------------------- |
| Formal **grace period** after a payment failure | `BILLING_ISSUE` (and related cancellation) with a grace period end | Empty until Google reports grace | Restored after grace is reported |
| Short **deferred renewal charge** (often under ~24 hours, and Google doesn't expose why) | [`SUBSCRIPTION_EXTENDED`](https://www.revenuecat.com/docs/integrations/webhooks/event-flows#subscription-extended-flow), then `RENEWAL` or `BILLING_ISSUE` | Empty until Google extends | Restored when `expiryTime` moves forward |

The soft-gate below covers that shared gap: empty entitlements, a recent period end, and still set to renew, regardless of which extension path Google takes next.

## What RevenueCat shows during the gap

Assume RevenueCat has already synced the latest Play state. Google may still return an `expiryTime` that is already past, before they've entered grace or extended the period. In this edge case, the customer will have the following state:

1. Active entitlements are **empty**, because expiration has passed.
2. A V2 subscription can still show `status: active` with `gives_access: true`. Play still says the subscription is active, but entitlements follow the stored (past) period end.
3. RevenueCat hasn't sent an `EXPIRATION` event yet, because the subscription hasn't been confirmed as ended with the store.
4. Auto-renew may still be on (`willRenew` / `auto_renewal_status: will_renew`).
5. When Google later extends the period (grace or deferred charging), entitlements return, often with `SUBSCRIPTION_EXTENDED`, then `RENEWAL` or `BILLING_ISSUE` within about a day.

For the usual patterns for reading subscription status, see [Getting Subscription Status](https://www.revenuecat.com/docs/customers/customer-info).

## Optional protection for recently expired Play subscriptions

If your backend or app hard-gates on empty entitlements at period end, paying customers can briefly lose access during that window, whether Google is about to enter grace or apply a deferred extension. You can optionally soft-handle it:

1. When active entitlements are empty, don't rely on entitlements alone. Also load subscription details (V1 subscriber info or V2 customer subscriptions).
2. To identify a potential gap, check if both of the following are true:
   - The period end is only recently past (for example, less than six hours ago).
   - Auto-renew is still on (`willRenew` / `auto_renewal_status: will_renew`).
3. If those conditions match, treat the customer as **renewal pending** rather than fully churned. For example, keep access for a short window, or wait for `SUBSCRIPTION_EXTENDED` / `RENEWAL` / `BILLING_ISSUE` before revoking.

True expiry won't match this soft-gate: when billing retry is fully abandoned and the subscription reaches `expired`, `auto_renewal_status` becomes `will_not_renew`. Account hold / billing retry can still show `will_renew` with empty entitlements. The recency window is the guardrail that limits how long you treat that as renewal pending.
