A failed card doesn't cancel your subscriber. It starts a clock.
A renewal declines, and nothing gets canceled that day. Both stores treat a failed charge as the start of a recovery process, not the end of a subscription, and the window they give themselves to fix it just got longer on both platforms. If your dashboard's "active subscribers" number moves in step with your revenue, it's about to move less accurately than it used to.
What happens the moment a card gets declined
On the App Store, a failed renewal enters Billing Retry immediately — Apple keeps attempting to charge the card in the background for up to 60 days. Separately, you can opt in to a Billing Grace Period in App Store Connect, choosing 3, 16, or 28 days, during which the subscriber keeps full access while those retries run. Skip that setting and the access decision during billing retry is yours: keep serving content or cut it off, App Store Connect won't decide for you.
Google Play's sequence is stricter, and it's spelled out in Android's subscription lifecycle docs. A failed renewal enters a grace period first — configurable per base plan, access retained, the user gets a prompt to fix their payment method. When that expires without a successful charge, the subscription moves into account hold, and Google's own guidance is explicit: "When a subscription enters account hold, you should block access to the subscription entitlement." Retries keep running underneath either way.
The window just got longer
On December 1, 2025, Google changed how account hold duration is calculated. It used to default to a flat 30 days after grace period ended. Now it's 60 days minus whatever grace period you've configured — a subscriber with a 7-day grace period gets roughly 53 more days of account hold on top, pushing total recovery time toward 60 days either way. Google's own change notice is blunt about why: expect "a temporary, likely substantial decrease" in involuntary churn once the longer window takes effect, because more declined cards get fixed before the platform stops trying. Apple's 60-day retry window has worked at roughly that length for a while — this is Google converging on the same shape.
Neither company is doing this out of generosity. A declined card is very often not a canceled customer — an expired expiry date, a bank's routine fraud hold, a balance that clears in a few days — and two months of retries recovers revenue that a hard three-day cutoff would throw away for good.
Picture a subscriber whose card expires on renewal day. On the App Store, if you've enabled a 16-day grace period, they keep full access for over two weeks while Apple quietly retries — most banks reissue a card and update it on file automatically, so a fair share of these resolve themselves before the subscriber even notices anything failed. On Google Play, the same subscriber gets a shorter grace period, then loses access during account hold, but Google keeps retrying underneath for weeks more. Either way, "canceled" is the wrong word for what's happening to them on day three.
What it breaks if your code doesn't know the difference
The trap is the same shape on both stores: "the entitlement looks active" is not the same claim as "we got paid." Three specific ways that bites you:
Entitlement leaks. If you cache a device-local "is Pro" flag instead of checking server-side state, you can keep serving a Google subscriber for weeks after their subscription entered account hold — the exact state Google's docs say you're supposed to revoke access for yourself, since the platform doesn't do it on your behalf.
Inflated active counts. If "active subscriptions" is the number you read as revenue, you're overcounting by however many subscribers are mid-grace-period or mid-billing-retry on any given day — a bigger gap now that both windows can run close to 60 days.
Silent churn. If access is decided purely from a locally cached receipt with nothing listening for state changes, you find out a subscriber is gone when they email you, not when it actually happened.
What to check instead
For Apple, call the App Store Server API's Get All Subscription Statuses endpoint, or read
Server Notifications V2, instead of trusting a cached receipt — it tells you directly whether
a subscription is active, in grace period, or in billing retry. For Google, listen for
real-time developer notifications (SUBSCRIPTION_IN_GRACE_PERIOD,
SUBSCRIPTION_ON_HOLD, SUBSCRIPTION_RECOVERED) and gate access off
subscriptionState rather than a flag you set once at purchase time.
In whatever you use for MRR reporting, split "confirmed paid" from "in recovery" as two separate numbers. A dip in the second one over the following weeks isn't lost revenue yet — a meaningful share of it comes back on its own before either platform's clock runs out, without you doing anything except waiting and checking state correctly.
None of this shows up in a screenshot or a listing page — it's plumbing. But it's the plumbing ShotCanvas Pro runs through too, on both stores, which is exactly why its entitlement check is a live listener on a server-verified record rather than a receipt cached on the device.