What Is Involuntary Churn?
Involuntary churn occurs when a subscription ends due to a payment failure, not because the user chose to cancel. The user's credit card expired, their bank declined the charge, or they had insufficient funds. They still want the subscription but their payment method failed.
Involuntary churn accounts for 20-40% of all subscription churn. Unlike voluntary churn (where the user actively decides to leave), involuntary churn is entirely recoverable with the right tools and strategies. Grace periods and billing retry are the two most effective mechanisms.
Billing Retry
Both Apple and Google automatically retry failed subscription charges. This happens without any action from the developer.
Apple Billing Retry
- Apple retries the charge over a period of up to 60 days
- The retry schedule is managed by Apple and is not configurable
- During billing retry (without grace period), the subscription status is "billing retry period"
- Your app receives
DID_FAIL_TO_RENEWnotification via App Store Server Notifications v2 - If retry succeeds, you receive
DID_RENEW. If all retries fail, you receiveEXPIRED
Google Play Billing Retry
- Google retries charges for up to 30 days by default
- The retry period is configurable in Google Play Console (7, 14, or 30 days)
- During retry, the subscription enters
GRACE_PERIOD(if enabled) orON_HOLDstate - Your app receives RTDN (Real-Time Developer Notifications) for state changes
- Google also offers "Restore" functionality where users can fix payment and resubscribe seamlessly
Grace Period
A grace period gives users continued access to subscription features while the store retries their payment. Without grace period, the user loses access immediately when payment fails. With grace period, they retain access for a configured number of days.
Why Enable Grace Period?
The math is simple and compelling:
- Without grace period: User loses access immediately on payment failure. Many users do not notice the payment issue because they still have access to their phone. By the time they realize, they may have moved on.
- With grace period: User retains access and receives store notifications to update their payment method. The combination of continued access and gentle reminders recovers a significant portion of failures.
Recovery rates with grace period enabled: 30-50% of billing failures are recovered.
Apple Grace Period
Configuration: App Store Connect > Subscriptions > Grace Period
| Duration | Best For |
|---|---|
| 6 days | Short billing cycles (weekly, monthly) |
| 16 days | Longer billing cycles (quarterly, annual) |
During grace period, the subscription expirationIntent field indicates billing retry. Your app should:
- Continue providing full access
- Optionally show a subtle banner encouraging payment update
- Never block or degrade the experience
Apple sends a GRACE_PERIOD_EXPIRED notification if the grace period ends without successful payment.
Google Play Grace Period
Configuration: Google Play Console > Subscriptions > Grace period
| Duration | Options |
|---|---|
| 3, 7, 14, or 30 days | Choose based on your billing cycle |
Google recommends 7 days for monthly subscriptions and 14-30 days for annual subscriptions. During grace period, the subscriptionState is SUBSCRIPTION_STATE_IN_GRACE_PERIOD.
Account Hold (Google Only)
If grace period ends without payment recovery, Google moves the subscription to "Account Hold" for up to 30 additional days. During account hold:
- User loses access to subscription content
- The subscription is not yet canceled
- If the user fixes payment, the subscription reactivates immediately
- This provides an additional recovery window beyond grace period
Implementation Guide
Server-Side Handling
Your backend should handle these states:
Payment Failed
|
v
Grace Period (access = YES)
|
+--> Payment Recovered --> Active (access = YES)
|
v
Account Hold / Billing Retry (access = NO)
|
+--> Payment Recovered --> Active (access = YES)
|
v
Expired (access = NO)
Webhook Processing
For Apple (App Store Server Notifications v2): handle DID_FAIL_TO_RENEW (grace period started), GRACE_PERIOD_EXPIRED, and DID_RENEW (recovered).
For Google (RTDN): handle SUBSCRIPTION_IN_GRACE_PERIOD, SUBSCRIPTION_ON_HOLD, SUBSCRIPTION_RECOVERED, and SUBSCRIPTION_EXPIRED.
User Communication
During grace period, show a non-intrusive in-app banner prompting users to update their payment method. Send a push notification on day 1 and day 3. Link directly to the platform's payment settings.
During account hold (Google), clearly communicate that access is paused and provide a one-tap "Fix Payment" button.
Measuring Impact
Track these metrics after enabling grace period:
| Metric | What to Measure |
|---|---|
| Recovery Rate | % of billing failures recovered |
| Time to Recovery | Average days to recover payment |
| Revenue Recovered | Dollar amount recovered through grace period |
Related Topics
- Auto-Renewable Subscriptions - Complete subscription lifecycle management
- StoreKit 2 and Play Billing Guide - Implementing billing state handling in code
- Revenue Reporting and Payments - How recovered payments appear in revenue reports