Renewals fail more often than customers cancel, and that involuntary churn is revenue you can still win back
A declined card, not a tap on cancel, ends a large share of subscriptions, and the store keeps trying to collect for weeks. Here is how the billing grace period, billing retry, and account hold work on the App Store and Google Play, and what involuntary churn really costs you.

Key takeaways
- Involuntary churn is a subscription that ends because a renewal charge failed, usually an expired or declined card, not because the customer chose to cancel. It is a payments problem, and both stores are built to recover it for you.
- When a renewal fails, neither store ends the subscription right away. Apple retries the card for up to 60 days, and Google Play holds a 60-day recovery window split between a grace period and account hold.
- During a billing grace period the subscriber keeps full access while the store retries. Recover inside grace on either store and there is no interruption and no lost days, and the billing date does not move.
- After the grace period the subscriber loses access, but the retry continues. Recover then and Apple starts a new billing cycle on the recovery date, and Google resets the billing date, so you get the subscriber back on a fresh clock.
- The recovery runs in the background at no cost to you. You do not pay a processor to retry, and Apple even absorbs the free days served during grace. The revenue you lose is usually revenue you let slip by turning grace off or misreading a recoverable subscriber as gone.
- The signals arrive on the same App Store Server Notifications and Google Play RTDN feeds you already use for refunds: DID_FAIL_TO_RENEW and SUBSCRIPTION_IN_GRACE_PERIOD, SUBSCRIPTION_ON_HOLD, then a BILLING_RECOVERY or SUBSCRIPTION_RECOVERED when the card clears.
- A subscriber in grace or hold is not churned yet. Count them as lost only when the 60-day window closes with no recovery, or your churn looks worse than it is and your recovery rate looks like zero.
A card expires, a bank declines a renewal, and a subscriber you never lost stops paying. They did not open your app and tap cancel. Their payment method just failed, and unless you know what happens next, they drop off your revenue without a sound. This is involuntary churn, and on both the App Store and Google Play the store does not give up on that payment when it fails. It keeps the subscriber, keeps retrying the card, and in most cases holds a window open for weeks where the money can still arrive. Most of that recovery happens whether you act or not. Reading it correctly is the difference between counting a real cancellation and writing off a payment the store is about to collect for you.
This is not a refund and not a chargeback. Nothing reverses, no money leaves your account. The revenue simply never lands, and in your reports it looks like an ordinary expiration. That is exactly why it leaks quietly. A customer who cancels tells you they are leaving. A customer whose card failed tells you nothing, and if you treat them the same, you lose the ones the store was about to win back.
What involuntary churn actually is
Churn comes in two shapes, and they are not the same problem. Voluntary churn is a decision: the customer cancels because they no longer want the subscription. Involuntary churn is an accident: the renewal charge fails, usually because a card expired, hit its limit, or got flagged by the bank for a recurring or foreign charge. The first is a product problem you fix with the product. The second is a payments problem, and it is the one the store is built to fix for you.
Why it is bigger than it looks
Failed renewals are common, and they have nothing to do with how good your app is. Cards expire on a schedule, balances run dry, and banks decline recurring charges they decide look risky. Every renewal cycle a slice of your charges fail for reasons the subscriber never chose. Because those subscribers never announced they were leaving, they are easy to misread as ordinary expirations and easy to lose track of, which is how recoverable revenue ends up booked as dead.
The App Store keeps trying for 60 days
When an auto-renewable subscription fails to charge, Apple does not end it. It moves into a billing retry period that runs for up to 60 days, and Apple keeps attempting the card across that window. What the subscriber experiences during those 60 days depends on one setting you control: the billing grace period.
Billing grace period keeps access while Apple retries
Turn on Billing Grace Period and the subscriber keeps full access to your paid content for the grace length, up to 16 days on monthly and yearly plans, while Apple retries the card. Recover inside the grace period and there is no interruption at all: the same billing date, no lost days of service, and no gap in your revenue. Apple even absorbs the cost of the days it served for free during grace. This is the rare setting that is almost pure upside, because a recovered subscriber never even notices the failed charge.
After grace, access stops but the retry does not
Once the grace period ends without a successful charge, the subscriber loses access, but Apple keeps retrying the card for the rest of the 60-day window. Recover in that stretch and the subscriber renews on the recovery date, starting a new billing cycle, and Apple does not bill for the grace days already given away. Only when the full 60 days pass with no successful payment does the subscription expire for good. Leave grace period off and the subscriber loses access the instant the renewal fails, which is the worst possible moment to hand a paying customer a locked door.
The notifications that mark each step
Your App Store Server Notifications feed narrates the whole sequence. DID_FAIL_TO_RENEW tells you a renewal failed, carrying a GRACE_PERIOD subtype while the subscriber is still inside grace and should keep access. GRACE_PERIOD_EXPIRED marks the end of grace, the point to revoke access. DID_RENEW with a BILLING_RECOVERY subtype means the card finally cleared and the subscriber is back. EXPIRED with a BILLING_RETRY subtype means the 60 days ran out and the subscriber is truly gone. Handle those four and your access always matches the real state.

Google Play splits the same 60 days in two
Google Play runs the same idea in a different shape and with its own vocabulary. A failed renewal moves the subscription through a grace period and then account hold, and the two together make up a 60-day recovery window.
Grace period keeps access, account hold takes it away
During the grace period the subscriber keeps access while Google retries the card, and the expiry time is pushed out as the retries run. If the card clears, the subscription recovers with its original renewal date intact, as if the failure never happened. If grace runs out, the subscription drops into account hold. Now access stops, and it stays off until the payment is fixed. Recover from account hold and access returns, but the billing date resets to the recovery date rather than the old one.
The 60-day math changed at the end of 2025
As of December 1, 2025, Google calculates the account hold length as 60 days minus your grace period. A 16-day grace leaves 44 days of hold, and the combined recovery window stays at 60 days. Choose a longer grace and you trade hold time for access time, but the total window does not change. Google recommends reading the live subscription state through its API rather than assuming a fixed hold length, because the split is now derived, not static.
The RTDN types you handle
Google Play's Real-time Developer Notifications call each stage. SUBSCRIPTION_IN_GRACE_PERIOD means keep access and prompt the customer to fix the card. SUBSCRIPTION_ON_HOLD means revoke access now. SUBSCRIPTION_RECOVERED means the payment cleared and access comes back. SUBSCRIPTION_CANCELED and then SUBSCRIPTION_EXPIRED mean the window closed with no fix and the subscriber has churned. These land on the same RTDN pipe you already run for voided purchases and refunds.
| Stage | App Store | Google Play |
|---|---|---|
| Renewal failed, access kept | Billing grace period, up to 16 days | Grace period, length you set |
| Renewal failed, access lost | After grace, through the rest of the 60 days | Account hold |
| Total recovery window | Up to 60 days | 60 days, grace plus hold |
| Recover during grace | Same billing date, no lost days | Same renewal date, no interruption |
| Recover after grace | New billing cycle on the recovery date | Billing date resets to recovery date |
| Ends for good | EXPIRED, subtype BILLING_RETRY | SUBSCRIPTION_EXPIRED |
What involuntary churn costs you
The cost here is not the refund kind, where money you booked gets clawed back. It is revenue that never shows up, and it hides in your numbers as a plain expiration.
A renewal you already paid to earn
Every recurring subscriber cost you real money to win: the ad spend and creative that acquired them, the onboarding, and the compute, storage, and API calls you have run for them every cycle since. A subscriber lost to a dead card walks out with all of that sunk cost unrecovered, and to replace the revenue you pay acquisition costs all over again for someone new. A subscriber the store recovers costs you nothing to reacquire. The gap between those two, full reacquisition versus zero, is the money involuntary churn actually moves.
The recovery is running for free, if you let it
Here is the part that gets missed. During grace and retry, the store is collecting on your behalf at no cost to you. You do not run the dunning, you do not pay a processor for each retry, and you do not have to send a single email. The recovery is happening in the background across a 60-day window. When that revenue is lost anyway, it usually traces to one of two self-inflicted mistakes: turning the grace period off, so subscribers get locked out the moment a card fails, or treating a subscriber who is still inside the recovery window as a hard cancellation and giving up on revenue the store had not.
How to actually keep involuntary churn low
Spend your effort on the few settings and signals that move recovery, and let the store do the retrying it already does well.
Turn on the billing grace period
On both stores, enable a grace period. It keeps paying subscribers in your app while the store retries, so a recovered subscriber never loses a day, and it is the single highest-leverage control here. On the App Store it is a toggle in App Store Connect. On Google Play a grace period is on by default for auto-renewing base plans, so the job is to keep it on and set a length you are comfortable serving for free.
Make access match the real state on grace and hold
Keep access during grace, on Apple's DID_FAIL_TO_RENEW with the GRACE_PERIOD subtype and Google's SUBSCRIPTION_IN_GRACE_PERIOD. Revoke access when Apple's grace expires and when Google sends SUBSCRIPTION_ON_HOLD. Restore it the moment recovery lands, on BILLING_RECOVERY or SUBSCRIPTION_RECOVERED. Get this wrong in one direction and you give away free access for weeks. Get it wrong in the other and you lock out a subscriber who is one retry away from paying you again.
Count recovery apart from churn
A subscriber in grace or account hold has not churned. Do not book them as lost until the recovery window closes without a successful charge. If your analytics fold renewal failed and customer canceled into one number, your churn reads worse than it is and your recovery reads like nothing is happening. Separate involuntary churn out and track its recovery rate, because that rate is a number you can actually move with a setting and a prompt.
Prompt the fix, then get out of the way
The one useful thing you can add is a nudge. Both stores let you prompt the subscriber to update their payment method, Apple inside the app and Google through its In-App Messaging API and Play notifications. A well-timed prompt during grace lifts recovery, because most of these customers still want the subscription and just need to fix a card. Beyond the nudge, let the store retry. It is already doing the expensive part, for free, for weeks.
The same App Store Server Notifications and RTDN feeds RefundHalt already listens to for refunds carry every one of these billing signals too. Grace, hold, recovery, and involuntary churn land in your dashboard next to your refunds, so you can watch the recovery window do its work instead of guessing which failed renewals are gone and which are coming back.
The short version
A failed renewal is not a cancellation, and the store treats it that way for weeks. Apple retries a card for up to 60 days and, with a grace period on, keeps the subscriber in your app while it does. Google Play splits the same 60 days between a grace period that keeps access and an account hold that removes it. Turn grace on, handle the grace and hold notifications so access matches reality, prompt the customer to fix their card, and count a subscriber as churned only after the window closes empty. Involuntary churn is the one revenue leak the store is actively working to plug for you. Your job is mostly to stay out of the way, and to read your numbers well enough to know when the loss is real.
Frequently asked questions
- What is the difference between voluntary and involuntary churn?
- Voluntary churn is a customer choosing to cancel a subscription. Involuntary churn is a subscription ending because a renewal charge failed, usually an expired or declined card, without the customer deciding to leave. Involuntary churn is a payments problem the store tries to recover for you, so it should not be counted or handled the same way as a real cancellation.
- Does a subscriber keep access when their renewal payment fails?
- It depends on the stage. During a billing grace period the subscriber keeps full access while the store retries the card, on both the App Store and Google Play. After the grace period ends, access stops: Apple continues retrying for the rest of the 60-day window with access off, and Google moves the subscription into account hold, where access is removed until the payment is fixed.
- How long does the store keep trying to charge a failed subscription?
- Up to 60 days on both stores. Apple runs a billing retry period of up to 60 days, with the billing grace period sitting inside it. Google Play holds a 60-day recovery window split between the grace period and account hold, where, since December 1, 2025, account hold is calculated as 60 days minus your grace period length.
- Should I turn on the billing grace period?
- For most apps, yes. Grace period keeps paying subscribers in your app while the store retries a failed card, so anyone who recovers inside it never loses a day and never notices the failure. The cost is a few days of free access to the subscribers who never recover. The benefit is keeping the ones who would have walked away over a sudden lockout.
- Is a subscriber in grace period or account hold already churned?
- No. They are inside the recovery window, and the store is still trying to collect. Counting them as churned overstates your churn and hides your recovery rate. Book a subscriber as lost only when the 60-day window closes with no successful payment, which the stores signal with an EXPIRED (billing retry) notification on Apple and SUBSCRIPTION_EXPIRED on Google Play.
- Does involuntary churn create a refund or a chargeback?
- No. Nothing reverses and no money leaves your account. A failed renewal is revenue that never arrives, not a payment being pulled back. That is the opposite of a refund or chargeback, and it is why it hides in your reports as an ordinary expiration rather than showing up as money going out.
Sources and further reading
- Apple Developer: Reducing Involuntary Subscriber Churn (billing retry and billing grace period for auto-renewable subscriptions)
- Apple: App Store Connect Help, Enable Billing Grace Period for auto-renewable subscriptions (grace keeps access; up to 16 days on monthly and yearly plans)
- Apple Developer: App Store Server Notifications notificationType and subtype (DID_FAIL_TO_RENEW with GRACE_PERIOD, GRACE_PERIOD_EXPIRED, DID_RENEW with BILLING_RECOVERY, EXPIRED with BILLING_RETRY)
- Android Developers: Subscription lifecycle (grace period keeps access, account hold removes it, and the recovery RTDN types)
- Google Play Console Help: Changes to Google Play subscription payment recovery periods (from December 1, 2025, account hold is 60 days minus grace period)
- Android Developers: Real-time developer notifications reference (SubscriptionNotification types including SUBSCRIPTION_IN_GRACE_PERIOD, SUBSCRIPTION_ON_HOLD, SUBSCRIPTION_RECOVERED, SUBSCRIPTION_EXPIRED)
RefundHalt
The refund autopilot for the App Store and Google Play
Keep reading
Unauthorized in-app purchases by children get refunded to the parent almost every time, and you carry the cost
When a child buys a coin pack on a parent's phone, both Apple and Google refund it and neither one asks you first. Regulators built it that way. Here is how these unauthorized in-app purchase refunds work on each store, the 15-minute window where the money goes, and what one actually costs you.
You never owned the app refund tax, so a refund costs you your share, not the total on the receipt
Refund an in-app purchase and the receipt shows the price plus tax going back. The tax was never your money. Apple and Google collect and remit it as the merchant of record, then reverse it on a refund without touching your share. Here is what a refund actually costs, and the one setup where the tax becomes yours.