All articles
Deep dive9 min read

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.

A hand holding a phone that shows a subscription payment-failed banner beside an expired bank card, illustrating involuntary churn from a declined renewal

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.

A calendar with a range of days marked and a small hourglass resting on it, illustrating the recovery window a store keeps open on a failed subscription renewal

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.

StageApp StoreGoogle Play
Renewal failed, access keptBilling grace period, up to 16 daysGrace period, length you set
Renewal failed, access lostAfter grace, through the rest of the 60 daysAccount hold
Total recovery windowUp to 60 days60 days, grace plus hold
Recover during graceSame billing date, no lost daysSame renewal date, no interruption
Recover after graceNew billing cycle on the recovery dateBilling date resets to recovery date
Ends for goodEXPIRED, subtype BILLING_RETRYSUBSCRIPTION_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

RefundHalt

The refund autopilot for the App Store and Google Play

Keep reading

The next refund request is already on its way.

Set up RefundHalt in the time it takes to read another support email about a refund you didn't get to contest.