Guide

Involuntary Churn & Billing Retry on iOS

Involuntary churn on iOS is mostly payment-method failure — an expired or declined card that Apple's billing retry never recovers. Apple retries silently for up to 60 days in grace or billing-retry state. Your job is to detect the state via RevenueCat or App Store Server Notifications and prompt the user in-app to update payment.

Most indie founders never see this churn because it doesn't look like churn. Nobody tapped Cancel, nobody left a one-star review, and the user often doesn't know they've lost access until they open the app a week later. The revenue just quietly stops.

That's what makes it the cheapest line item on your growth list. You're not buying installs or rewriting a paywall — you're recovering subscribers who already decided you were worth paying for. Per RevenueCat's State of Subscription Apps 2026, billing errors cause 14% of subscription cancellations on the App Store vs 31% on Google Play (medians across 115,000+ apps, $16B+ tracked revenue, primarily 2025 data). On iOS that's roughly one in seven cancellations you may be able to win back with plumbing, not persuasion.

What actually causes involuntary churn on iOS?

The dominant cause is a payment method that stopped working: an expired card, a card the issuer declined for insufficient funds, or a card replaced after fraud. Everything else is a distant second.

Apple handles the retry for you, which is both the good news and the trap. When a renewal fails, StoreKit moves the subscription into a billing-retry state and keeps attempting the charge for up to 60 days. If you've enabled Billing Grace Period in App Store Connect, the user keeps access during the first stretch of that window. If you haven't, entitlement drops the moment the charge fails — while Apple is still trying, and while the user has no idea anything is wrong.

The second cause is specific to iOS and catches people out: a price increase that requires consent. If you raise the price on an existing subscription and choose the option that requires user opt-in, every subscriber who never sees the prompt silently lapses at renewal. It looks identical to a billing failure in your dashboard, and the fix is completely different.

The third is upgrade/downgrade and refund edge cases — a user who refunds, a family-sharing entitlement that ends, or a crossgrade that your entitlement logic reads as a cancellation.

The diagnostic sequence, ordered by likelihood

Work these in order. Each check tells you what you'll see, what it means, and the fix. Stop when the numbers explain your gap.

  1. Check whether Billing Grace Period is on. In App Store Connect → your app → Subscriptions → Billing Grace Period. If it's off, turn it on. This is the single highest-yield thirty seconds in the whole list, because it converts "lost access instantly" into "still using the app while Apple retries."
  2. Pull the count of subscriptions in billing-retry state. In RevenueCat, filter customers by billing issue / grace period. What you'll see: a standing population you probably never looked at. What it means: those are live recoverable dollars, not churned users.
  3. Confirm you're receiving App Store Server Notifications V2. Specifically DID_FAIL_TO_RENEW (with and without the GRACE_PERIOD subtype), GRACE_PERIOD_EXPIRED, and DID_CHANGE_RENEWAL_STATUS. No endpoint, no webhook, no signal — you're blind for 60 days.
  4. Check your entitlement logic for grace-period handling. If your gate is a naive expirationDate > now, you're cutting off users Apple is still billing. That's self-inflicted churn on top of involuntary churn.
  5. Check for a pending price-consent prompt. Look for PRICE_INCREASE notifications with a pending status. A cluster of lapses concentrated on one renewal cohort, not spread evenly, is the tell.
  6. Segment failures by region and card type. Decline rates aren't uniform. If one market spikes, the fix is often offering an alternative payment method through Apple's own options rather than anything you build.
  7. Rule out refund-driven false positives. Refunds show up as revenue loss but are a different problem with a different playbook — don't dump them into your billing-recovery bucket.

Quick checks vs structural fixes

Triage matters more than completeness here. Half of this list is a single afternoon; the other half needs a release cycle.

FixEffortWhere it livesWhat it does
Enable Billing Grace PeriodMinutesApp Store ConnectKeeps access alive while Apple retries
Hook up App Store Server Notifications V2HoursServerGives you the billing-failure signal at all
In-app "update payment" bannerDaysApp + releasePuts the fix in front of the user
Grace-aware entitlement logicDaysApp + releaseStops you revoking access prematurely
Push/email on billing failureDaysServer + pushReaches users who won't open the app
Price-consent re-prompt flowDaysApp + releaseRecovers lapses from unaccepted price changes
Region-level payment analysisOngoingAnalyticsFinds concentrated decline pockets

Do the top two before you do anything else. They cost nothing and they're prerequisites for every other item on the list.

Where the generic advice is wrong

The standard advice — "run dunning emails like a SaaS company" — mostly doesn't apply on iOS, and following it wastes the recovery window.

You don't control the payment method on the App Store. Apple does. You can't retry a charge, can't update a card server-side, and can't offer a one-click "pay now" link. Every dunning tactic imported from Stripe-land dies at that wall. What you can do is get the user to Settings → Apple Account → Payment & Shipping, and that's an in-app job, not an email job.

So the actual mechanism is attention, not persuasion. The subscriber already wants the app; they just need to be told a card expired and shown where to fix it. That means a persistent in-app banner on the screen they use most — not a modal on cold launch that gets dismissed reflexively, and not an email to an address most of your users never gave you. Also, don't discount them. Offering a coupon to someone whose card expired trains a price-sensitive behavior you didn't need to create, and it converts a full-price recovery into a discounted one.

The second place generic advice misleads: people treat involuntary churn as a rounding error and skip it for paywall work. Look at the denominators. Per RevenueCat's State of Subscription Apps 2026, about 72% of annual subscribers cancelled within year one, worse than the ~56% reported in the 2025 edition — with billing errors driving 14% of App Store cancellations. Recovering a slice of that costs you zero acquisition spend.

Building the recovery flow that actually works

The flow has three jobs: detect the failure, tell the user in the app, and confirm the recovery. Keep it that narrow.

Detection comes from App Store Server Notifications V2 landing on your server, mirrored into RevenueCat so your entitlement checks and your growth data agree. Store a billingIssueDetectedAt timestamp per customer — you'll need it for the escalation schedule and for measuring recovery rate later.

Messaging escalates over the retry window rather than firing once. A soft banner in the first days, a stronger interstitial around the mid-point, and a final warning before grace expires. If you have push permission, one push at the point access is genuinely about to end outperforms a push on day one, because on day one nothing has broken from the user's point of view.

Confirmation is the part most people skip. When the renewal finally succeeds, clear every banner immediately and say so. Nothing kills trust faster than nagging a subscriber to fix a card they already fixed.

Measure recovery rate as: subscriptions that returned to active ÷ subscriptions that entered billing retry, over a fixed window. Track it monthly. If it isn't moving, your messaging isn't landing where users actually look.

How AppApex handles this

AppApex merges RevenueCat and Superwall subscription data into one view, so billing-failure cohorts sit next to the rest of your funnel instead of in a separate tab. The Retention agent runs churn autopsies and builds winback sequences off that data.

Because Autopilot writes back through Superwall, RevenueCat, and App Store Connect, a recommendation doesn't stop at a slide — it ships, with rollback metadata and a 7–14 day watch window, and auto-rolls-back if lift falls below threshold. Autonomy sits inside rails: approval gates, quiet hours, per-agent budgets, kill switches, and a full audit log. Autopilot writes are Growth and Studio tier; Starter stays advisory.

Once you've plugged the billing leak, the next questions are usually why users cancel subscription apps on purpose and how to build a winback campaign for a subscription app that reaches them after they're gone.

Want to know where your own leaks are? Run the free Growth Audit — enter an App Store ID, get a health score and analysis, no account required.

Method note: all benchmark figures cited above come from RevenueCat's State of Subscription Apps 2026, medians across 115,000+ apps, $16B+ tracked revenue and 1B+ transactions, primarily 2025 data.

Last updated September 1, 2026

Frequently asked questions

Apple attempts the charge for up to 60 days after a failed renewal. If Billing Grace Period is enabled in App Store Connect, the user keeps access during the grace window; after that, entitlement ends while retries may continue.

Yes for most subscription apps. The alternative is revoking access from a paying customer whose card Apple is still charging. The unpaid access window is short relative to the value of keeping a renewed subscriber.

Only if you collected an email yourself. Apple does not share subscriber emails. Apple sends its own billing notices, but your most reliable channel is an in-app banner plus push, since the card update happens in iOS Settings.

Use App Store Server Notifications V2. DID_FAIL_TO_RENEW signals a billing issue; DID_CHANGE_RENEWAL_STATUS with auto-renew off signals a deliberate cancellation. RevenueCat surfaces both as separate customer states.

It can. If you choose the price-increase option that requires user consent, subscribers who never see or accept the prompt lapse at renewal. Watch for PRICE_INCREASE notifications with pending status and re-prompt in-app.

There is no published iOS median to quote. Measure your own baseline first: subscriptions returning to active divided by subscriptions entering billing retry, over a fixed window. Then improve it with better in-app messaging timing.