Apple and Google both let you extend a subscription renewal date after an outage, and their limits are nothing alike
When your app goes down, you can extend a subscription renewal date instead of waiting for refund requests. Here's how Apple's 90-day extensions and Google Play's billing deferral work, where each store draws the line, and what each option costs you.

Key takeaways
- Apple's App Store Server API lets a developer extend the renewal date of a paid, active auto-renewable subscription by 1 to 90 days, to make up for an outage, a canceled event or an interrupted live stream.
- Apple allows two renewal date extensions per customer within 365 days. An extension can't be reversed once it takes effect, and Apple emails the customer the new renewal date.
- Apple won't extend a subscription that's in a free offer period, in billing retry, in a grace period whose expiration date has passed, or already expired. The subscription needs at least one paid period behind it.
- Days added by an Apple renewal date extension don't count toward the one year of paid service that raises a developer's subscription revenue share from 70% to 85%.
- Google Play's purchases.subscriptionsv2.defer pushes a subscription's next billing date back by as little as one day and up to a year per call. The user keeps full access without being charged, and Google sends a SUBSCRIPTION_DEFERRED notification.
- A renewal date extension returns no cash, so the developer keeps the payment but pays for compute, storage and API calls during the added days with no renewal to cover them. A refund sends the price back and none of the money already spent serving that customer.
- If an outage kept an in-app purchase from being delivered and Apple sends a CONSUMPTION_REQUEST, the honest deliveryStatus is UNDELIVERED_SERVER_OUTAGE, and Apple requires consumptionPercentage to be 0 for any status other than DELIVERED.
Downtime gives every subscriber the cleanest refund story there is, and you can't stop them from telling it. What you can do is hand the lost days back before anyone asks. Both app stores let you extend a subscription renewal date so the customer gets free time instead of cash. Apple caps each extension at 90 days and allows two a year. Google lets you defer billing by up to a year per call. The paperwork, the notifications and the bill underneath are different enough that one outage plan won't cover both.
What an outage does to your refund exposure
Refunds are decided by the stores, not by you. On the App Store, a customer asks Apple and Apple decides. You may receive a CONSUMPTION_REQUEST notification and get 12 hours to send consumption data through Send Consumption Information. That's your whole say.
On Google Play, a buyer can get a refund within 48 hours of purchase without you being asked. After that, requests come to you. The single Google flow that asks for your evidence is a chargeback flagged for developer review, which you answer through orders.reviewrefund within 24 hours. The bank's decision on a chargeback is final.
So neither store gives you a way to block a refund. What you control is whether a subscriber still feels short-changed when the service comes back. Extra time on the subscription, granted quickly and announced clearly, is the tool both stores built for exactly that.
How to extend a subscription renewal date on the App Store
The App Store Server API has two endpoints for this. Extend a Subscription Renewal Date acts on one subscription, which you identify by its originalTransactionId. Extend Subscription Renewal Dates for All Active Subscribers acts on every eligible subscriber of one productId, and you can limit it with storefrontCountryCodes when the outage only hit some regions.
Each request carries three things: extendByDays, a number from 1 to 90; an extendReasonCode; and a requestIdentifier you generate. Reason code 3 means a service issue or outage. Code 1 is customer satisfaction, code 2 is other reasons, and code 0 is undeclared.
Which subscriptions Apple will extend
Only active auto-renewable subscriptions with at least one previously paid period qualify. Apple skips these:
- Subscriptions in a free offer period, such as a free trial.
- Inactive subscriptions in a billing retry state.
- Subscriptions in a billing grace period whose expiration date is in the past.
- Subscriptions that already got two renewal date extensions in the past 365 days.
- Expired subscriptions.
Family Sharing comes along for free. When Apple extends a purchased subscription that supports Family Sharing, the family members' subscriptions are extended too. You can't target a family member's subscription directly.
The mass request is slow, so watch the notifications
Apple says a request to extend all active subscribers can take hours, or even days, depending on how many subscribers you have. A 200 response only means Apple is processing it. App Store Server Notifications V2 tells you how it went:
| Notification | Subtype | What it means |
|---|---|---|
| RENEWAL_EXTENDED | none | One subscription's renewal date was extended |
| RENEWAL_EXTENSION | FAILURE | One subscription's extension failed |
| RENEWAL_EXTENSION | SUMMARY | The whole mass request is complete |
For each FAILURE, take the originalTransactionId from the signed transaction in the payload and retry it with the single-subscription endpoint. If you'd rather poll, Get Status of Subscription Renewal Date Extensions reports whether the request is complete and how many extensions succeeded or failed.
How Google Play's billing deferral works
Google's version is purchases.subscriptionsv2.defer, called once per purchase token. The request body holds a deferralContext with three fields. The etag comes from purchases.subscriptionsv2.get, and the call fails if it doesn't match the subscription's latest etag. The deferDuration says how far to push the date. And validateOnly, when true, runs the request as a dry run without touching the subscription.
Google's billing guide sets the range at one day to one year per API call. To go further, call again before the new expiration date arrives. For an auto-renewing subscription, the deferral moves the next renewal date. For a prepaid plan, it moves the expiration time. On a subscription with add-ons, every item is deferred by the same duration. The response lists each item's new expiryTime.
During the deferral the user stays subscribed with full access and isn't charged for the extra time. Google sends a SUBSCRIPTION_DEFERRED real-time developer notification. The older purchases.subscriptions.defer is deprecated, so new code should use the v2 method.
Google doesn't tell your customer, so you have to
Apple emails the customer after every successful extension. Google's billing guide describes no message to the user at all. If the whole point is to head off refund requests, the subscriber has to know the extra time exists. Send it yourself, in the app and by email, and say how many days and why.
Apple and Google side by side
| Apple App Store | Google Play | |
|---|---|---|
| API | Extend a Subscription Renewal Date, plus a mass endpoint | purchases.subscriptionsv2.defer |
| Length per request | 1 to 90 days | 1 day to 1 year |
| How often | Twice per customer within 365 days | No cap stated; call again before the new expiration date |
| Bulk option | One call per productId, optionally by storefront | One call per purchase token |
| Free trial | Not eligible | Not addressed in Google's guide |
| Notification | RENEWAL_EXTENDED, RENEWAL_EXTENSION | SUBSCRIPTION_DEFERRED |
| Customer told | Apple sends an email | Up to you |
| Reversible | No | Not addressed in Google's guide |
What an extension costs compared with a refund
A refund and an extension take money from different places. A refund sends back what the customer paid for the period. Everything you already spent serving that customer stays spent: compute for each session, model API calls, storage, and any payout to a creator whose content they used.
An extension keeps the payment. What it costs is service you deliver without a renewal to pay for it. Every added day, an active subscriber keeps running up the same bills. For a light user that's close to nothing. For a heavy user of an AI feature, 30 extra days can mean 30 days of model calls with no revenue against them. Size the extension to the outage, not to the apology you'd like to make.
| What you give up | Refund | Renewal date extension |
|---|---|---|
| The subscription payment | Returned to the customer | Kept |
| Costs already spent serving the customer | Lost | Lost |
| Compute, storage and API calls during the added days | None, access ends | Paid by you, no renewal yet |
| The subscription afterward | Ends if the refund revokes access | Active, renews on the new date |
The commission cost on Apple
Apple pays 70% of each renewal during a subscriber's first year of paid service and 85% after that. Apple's subscription page says renewal extension days are excluded from days of paid service. So a 30-day extension pushes that subscriber's move to 85% out by 30 days. If you're in the App Store Small Business Program, you already receive 85%, and this cost doesn't apply.
The chargeback cost on Google Play
For orders placed after August 3, 2026, a chargeback the cardholder wins costs a Google Play developer the purchase price less Play's service fee, plus the bank's fees. An outage is exactly the kind of event that sends an annoyed customer to their bank. A deferral that reaches them first is cheaper than a dispute you can't overturn.

When an extension isn't the right tool
The purchase wasn't a subscription
Renewal date extensions only apply to subscriptions. If an outage broke a consumable or a one-time unlock, redeliver the item. If Apple sends a CONSUMPTION_REQUEST for it, report what happened. Apple's deliveryStatus field has a value for this, UNDELIVERED_SERVER_OUTAGE, and Apple says any status other than DELIVERED must come with consumptionPercentage set to 0.
The customer already used both Apple extensions
Apple's cap is two extensions per customer in 365 days. Two outages in a year spend them both, and a third leaves you with nothing to offer through the store. Track how many extensions each originalTransactionId has used, so the mass request's FAILURE notifications don't surprise you.
The customer is on a free trial
Apple won't extend a subscription in a free offer period. A trial user lost free days, not paid ones, so the refund risk is low. If you want to make it up to them, an in-app message costs less than any API call.
A checklist for the next outage
- Log when the outage started and ended, and which products and regions it hit.
- Pick a number of days that covers the lost time. On Apple, use reason code 3 and stay within 1 to 90.
- On Apple, send one mass request per productId, limited by storefrontCountryCodes when only some regions were affected.
- Listen for RENEWAL_EXTENSION FAILURE and retry each one with the single-subscription endpoint.
- On Google Play, loop over active purchase tokens, read each etag, run with validateOnly first, then defer for real.
- Tell Google Play subscribers about the extra time yourself, since Google won't.
- Update entitlement expiry from RENEWAL_EXTENDED and SUBSCRIPTION_DEFERRED, not from your own date math.
- Keep usage logs per account, so if a refund request or chargeback arrives anyway, your evidence is ready inside 12 hours for Apple and 24 hours for Google.
Frequently asked questions
- How many times can I extend an App Store subscription renewal date?
- Twice per customer within 365 days. Each extension can be 1 to 90 days, and a subscription that already received two extensions in the past 365 days isn't eligible for another.
- Does Apple tell the customer when I extend their subscription?
- Yes. After a successful renewal date extension, Apple sends the customer an email with the updated renewal date. Google Play's billing guide describes no such message, so on Android you should tell subscribers yourself.
- How long can I defer a Google Play subscription?
- Google's billing guide says one day to one year per call to purchases.subscriptionsv2.defer. To defer further, call the API again before the new expiration date arrives. The user keeps full access and isn't charged for the deferred time.
- Can I undo an Apple renewal date extension?
- No. Apple says that after a subscription renewal extension goes into effect, there's no way to reverse it. Check the product, the number of days and the storefronts before sending the request.
- Does a renewal date extension affect my 85% revenue share on Apple?
- Yes. Apple excludes renewal extension days from days of paid service, so an extension delays the point where a subscriber moves from 70% to 85% by the number of days you added. Developers in the App Store Small Business Program already receive 85%.
- Can I extend a subscription that's in a free trial?
- Not on the App Store. Apple excludes subscriptions in a free offer period, along with billing retry, an expired grace period and expired subscriptions. Only active subscriptions with at least one paid period qualify.
Sources and further reading
- Apple Developer: Extending the renewal date for auto-renewable subscriptions
- Apple Developer: Extend a Subscription Renewal Date
- Apple Developer: Extend Subscription Renewal Dates for All Active Subscribers
- Apple Developer: extendReasonCode
- Apple Developer: Auto-renewable subscriptions
- Apple Developer: deliveryStatus
- Google Play Developer API: purchases.subscriptionsv2.defer
- Google Play Billing: Manage subscriptions and one-time purchases
- Google Play Billing: Subscription lifecycle
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
The refund autopilot for the App Store and Google Play
Keep reading
Excessive refund requests can cost you more than the refunds, because both app stores treat them as a quality signal
Apple's Guideline 5.6.4 names excessive refund requests as a sign an app isn't meeting quality standards, and Google's Distribution Agreement lets it remove new developers' apps on refund rates. Here's what each store says, what removal costs, and how to stay clear.
Verify App Store server notifications before you act on a refund, because anyone can post to your webhook URL
A refund notification is just an HTTPS request until you check its signature. Here's how to verify App Store server notifications and Google Play RTDN messages, what each store signs, and what a forged or wrongly rejected refund costs you.