Skip to main content
Skip to navigation

Google Play Renewal Extensions and Entitlements

Why Google Play can leave entitlements empty until it extends the period, and how to optionally soft-gate access.

AIAsk AIChatGPTClaude

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.

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 nextWhat you typically see in RevenueCatEntitlement access before the updateEntitlement access after the update
Formal grace period after a payment failureBILLING_ISSUE (and related cancellation) with a grace period endEmpty until Google reports graceRestored after grace is reported
Short deferred renewal charge (often under ~24 hours, and Google doesn't expose why)SUBSCRIPTION_EXTENDED, then RENEWAL or BILLING_ISSUEEmpty until Google extendsRestored 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.

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.

Was this page helpful?