FAILED PAYMENTSAPP STORE

How to reduce involuntary churn on the App Store: billing retry and grace period

How App Store billing retry and Billing Grace Period work, which server notifications to handle, what your app can and cannot do, and where win-back offers fit.

Published 7 min read

On the App Store, Apple charges the customer, Apple retries the payment, and Apple owns the cancel button. You cannot retry a charge, change a customer’s card or see their email address. That does not mean you can do nothing: what you control is how long the customer keeps access, what your app tells them, and how you react to each notification.

This guide covers billing retry, Billing Grace Period, the App Store Server Notifications V2 that tell you what happened, what your app is allowed to do, win-back offers, and refund requests. It sticks to Apple’s documentation: Reducing involuntary subscriber churn, Enable Billing Grace Period, the notificationType reference, the billingIssue message, Supporting win-back offers in your app and Send Consumption Information (all accessed November 2026).

What Apple does when a renewal fails

When a renewal fails because of a billing problem, the subscription enters the billing retry state. Apple’s documentation says the App Store then tries to collect payment for up to 60 days.

  • If Apple recovers the payment during billing retry, the subscription renews. Without a grace period, the new billing date is the date of recovery, so subsequent renewals move.
  • If the billing retry period ends without success, the subscription expires.

You do not choose the retry schedule and you cannot trigger a retry. Apple does say that when the customer updates their payment information, the App Store immediately attempts to renew. So the most useful thing you can do is get the customer to fix their payment method.

Billing Grace Period

By default, a customer in billing retry loses access. Billing Grace Period lets them keep full access for a while as Apple tries to collect. You turn it on in App Store Connect, under your app’s Subscriptions section. According to Apple’s help page:

Grace period chosen Weekly subscriptions Monthly and yearly subscriptions
3 days 3 days 3 days
16 days 6 days 16 days
28 days 6 days 28 days

Other points from the same page:

  • The setting applies to all auto-renewable subscriptions in the app; it cannot be set per product.
  • You choose whether it applies to all renewals (including free trials and free offers turning paid) or only paid-to-paid renewals.
  • You can enable it in sandbox only first, then in production.
  • Changes can take up to 24 hours and apply to upcoming renewals only.
  • It does not apply to monthly subscriptions with a 12-month commitment.
  • Your app must still check the renewal status and give full service during the grace period.

The difference matters for revenue: if Apple recovers the payment within the grace period, the customer’s days of paid service and your revenue are not interrupted, and the subscription keeps its original billing date. A recovery after the grace period, but still within billing retry, renews on the recovery date.

The notifications to handle

App Store Server Notifications V2 tell your server about each step. The notificationType reference lists these billing events:

Event notificationType subtype
Renewal fails, subscription enters billing retry DID_FAIL_TO_RENEW none
Renewal fails, billing retry with Billing Grace Period DID_FAIL_TO_RENEW GRACE_PERIOD
Subscription leaves the grace period (billing retry continues) GRACE_PERIOD_EXPIRED none
Billing retry recovers the subscription DID_RENEW BILLING_RECOVERY
Billing retry ends without recovery EXPIRED BILLING_RETRY
Customer turns off auto-renew DID_CHANGE_RENEWAL_STATUS AUTO_RENEW_DISABLED
Customer turns auto-renew back on DID_CHANGE_RENEWAL_STATUS AUTO_RENEW_ENABLED
Subscription expires after the customer cancelled EXPIRED VOLUNTARY

Note that GRACE_PERIOD_EXPIRED does not mean the customer is gone. Apple keeps trying; you just stop giving access.

You can also ask for the current state with the App Store Server API’s Get All Subscription Statuses endpoint. Its status field is 1 (active), 2 (expired), 3 (billing retry), 4 (Billing Grace Period) or 5 (revoked). The renewal info also carries isInBillingRetryPeriod, gracePeriodExpiresDate and an expirationIntent, where 2 means a billing error and 1 means the customer cancelled.

Treat AUTO_RENEW_DISABLED as an early warning

DID_CHANGE_RENEWAL_STATUS with AUTO_RENEW_DISABLED is the closest thing to a cancellation on the App Store: the customer still has access until the end of the period, but will not renew. It is not a payment failure, but it is the best moment for a retention message, because the subscription is still active.

What your app can do

Apple is explicit about which tools you have.

  1. Let StoreKit show the billing message. When a subscription is in billing retry, the App Store sends a billingIssue message. StoreKit shows a Billing Problem sheet when your app launches (or when you ask it to), and the customer can fix their payment method without leaving your app. Apple documents the frequency: every 24 hours on days 1 to 3, every 72 hours on days 4 to 16, every 96 hours on days 17 to 30 and every 120 hours on days 31 to 60. You can delay or suppress it, but if you have no better message, let it show.
  2. Show your own in-app message. Apple’s guide on involuntary churn says your app may tell users they can avoid losing access by resolving their billing error, and can deep link to the Manage Payments page of their account. Check expirationIntent first, so you do not show a billing message to someone who cancelled.
  3. Link to subscription management. showManageSubscriptions(in:) (or manageSubscriptionsSheet in SwiftUI) opens the same sheet as Settings, where the customer can view, change or cancel their subscription.
  4. Contact the customer through your own channels. If the customer has an account with you and gave you an email, you can email them. Apple does not share the customer’s email, so you need to match the App Store transaction to your own user, for example with an appAccountToken set at purchase.
  5. Restore access fast. After a recovery, StoreKit adds the renewal transaction to the queue. Apple notes that if your app is already running, the observer may not be called and the app finds out at the next launch. Your server will usually know first from DID_RENEW.

What you cannot do: retry the charge, change the payment method yourself, extend billing retry, or remove Apple’s own cancel option.

Win-back offers

Once a subscription has churned (expiration date in the past and auto-renew off), Apple lets you offer a win-back offer: a free or discounted period for eligible former subscribers. According to Apple’s guide:

  • You configure the offers and eligibility rules in App Store Connect: paid subscription duration, time since expiration, and time between redeemed offers.
  • Customers can find them in the App Store, in their account’s subscription settings, and in your app, where StoreKit can show a win-back offer sheet by default.
  • App Store Connect gives each offer a direct link that you can send through your own channels, such as email. Before you send it, call Get All Subscription Statuses and check the eligibleWinBackOfferIds array, and send the link to eligible customers only.
  • A redemption after expiry produces SUBSCRIBED with subtype RESUBSCRIBE; transactions redeemed with a win-back offer have offerType 4.

For active subscribers, Apple’s promotional offers and offer codes are the related tools (redemption sends OFFER_REDEEMED).

Refund requests and CONSUMPTION_REQUEST

Customers ask Apple, not you, for refunds, and Apple decides. When a customer requests a refund, the App Store sends a CONSUMPTION_REQUEST notification. If the customer consented to sharing their data with Apple, you can answer with the Send Consumption Information endpoint within 12 hours. Apple says it uses this information to inform its refund decisions. You are responsible for getting valid consent, and Apple says not to use the App Tracking Transparency prompt for it. If you do not have consent, do not respond.

When Apple refunds, you receive REFUND; when it declines a refund requested through your app, REFUND_DECLINED; and if a refund is reversed, REFUND_REVERSED.

A checklist

  • App Store Server Notifications V2 are enabled, and your server handles the billing events above.
  • Billing Grace Period is turned on, tested in sandbox, then enabled in production.
  • Your app grants access during the grace period and removes it on GRACE_PERIOD_EXPIRED.
  • The StoreKit billing message is allowed to show, or replaced with your own.
  • Your settings screen links to subscription management.
  • Each purchase carries an appAccountToken, so you can reach the customer.
  • Win-back offers are configured and sent only to eligible customers.
  • Consumption requests are answered within 12 hours when the customer consented.

Doing this with NoChurn

Apple keeps payments, retries, the grace period and the cancel button; NoChurn does not change that. NoChurn reads your App Store Server Notifications, matches each subscription to your user through the appAccountToken, and puts billing problems, auto-renew changes and refunds on the customer timeline and in a churn score from 0 to 100. Where Apple allows it, it acts: messages in your app or by email linking to Apple’s subscription settings, a cancel flow your app shows through the headless API before linking to Apple, win-back emails at day 30, 60 and 90 based on the cancel reason, and answers to consumption requests from your own usage data. See NoChurn + App Store.

PROMPT

Read https://www.nochurn.sh/llms.txt,
then follow https://www.nochurn.sh/docs/quickstart/
to add NoChurn to this app. Use a test key
(nc_test_…) until I say we go live.

Stop leaking revenue.

  • Free until $300 MRR
  • No card needed
  • Live in 10 minutes
  • Never a cut of what we recover