All articles
Playbook8 min read

If your app still runs on App Store Server Notifications V1, Apple never asks you about subscription refunds

Apple deprecated App Store Server Notifications V1 in June 2023, and it never gained the subscription CONSUMPTION_REQUEST, REFUND_DECLINED or REFUND_REVERSED. Here's what a V1 server misses, what that costs, and how to move to V2 without losing a refund.

An old mailbox overflowing with unopened letters beside a modern server rack, illustrating refund signals lost on App Store Server Notifications V1

Key takeaways

  • Apple deprecated App Store Server Notifications V1 and the verifyReceipt endpoint on June 5, 2023. Both still work, receive no new features, and have no announced end-of-life date.
  • Apple's V1 documentation lists CONSUMPTION_REQUEST only for consumable in-app purchases. Consumption requests for auto-renewable subscriptions were added to App Store Server Notifications V2 in April 2024.
  • REFUND_DECLINED and REFUND_REVERSED exist only in App Store Server Notifications V2, so a V1 server never learns that Apple turned down a refund or took one back.
  • On V1, an Apple refund of an auto-renewable subscription arrives as CANCEL. On V2 it arrives as REFUND with a revocationDate and revocationReason on the signed transaction.
  • Apple retries a failed V2 notification five times over about a week, at 1, 12, 24, 48 and 72 hours. A failed V1 notification gets three retries, at 6, 24 and 48 hours, and can't be recovered through Get Notification History.
  • After an app switches to V2 in App Store Connect, new notifications arrive in V2 format right away, while V1 notifications already in retry can keep arriving for about 78 hours.

Version 1 of App Store Server Notifications still delivers refunds, but it leaves out the one notification that lets you argue a subscription refund. Apple deprecated V1 on June 5, 2023, alongside the verifyReceipt endpoint, and has added every refund feature since then to V2 only. If your App Store Connect settings still say Version 1, Apple can decide a subscription refund without ever sending your server a CONSUMPTION_REQUEST. You don't lose a fight there. You never get invited to one.

What Apple's App Store Server Notifications V1 deprecation means

Deprecated doesn't mean switched off. An Apple engineer wrote on the developer forums in June 2023 that verifyReceipt and V1 notifications will keep working until an end-of-life date is announced, that the date hadn't been set, and that developers will be told in advance. More than three years later, App Store Connect still offers "Version 1 (deprecated)" as a choice when you set a server URL.

What deprecation does mean is a freeze. Every change in Apple's notifications changelog since June 2023 is a V2 change: new fields on the signed transaction, new notification types, the 12-month commitment data added in April 2026. A V1 server sees none of it.

Which refund signals a V1 server never receives

Here's how the same refund events reach a V1 server and a V2 server, according to Apple's documentation for each version.

Refund eventVersion 1Version 2
Customer asks Apple to refund a consumableCONSUMPTION_REQUESTCONSUMPTION_REQUEST
Customer asks Apple to refund an auto-renewable subscriptionNot listed in the V1 documentationCONSUMPTION_REQUEST, since April 2024
Apple refunds an auto-renewable subscriptionCANCELREFUND
Apple refunds a consumable, non-consumable or non-renewing subscriptionREFUNDREFUND
Apple declines a refund the customer started in your appNot availableREFUND_DECLINED
Apple reverses a refund it already grantedNot availableREFUND_REVERSED
You recover notifications missed during an outageNot availableGet Notification History

Does V1 still get CONSUMPTION_REQUEST at all?

Yes, for consumables. Apple's V1 reference describes CONSUMPTION_REQUEST as the notification sent when a customer starts a refund request for a consumable in-app purchase. An Apple engineer confirmed on the forums in 2023 that V1 consumption requests fire for eligible refunds. The gap is subscriptions. Apple's changelog dates subscription consumption requests to April 11, 2024, in V2, and the Send Consumption Information documentation says Apple sends the request through your V2 endpoint.

Why CANCEL on V1 is easy to misread

On V1, when Apple refunds a subscription, the notification type is CANCEL, often paired with DID_CHANGE_RENEWAL_STATUS. Plenty of servers treat any cancel as a customer turning off auto-renew, which leaves access running until the period ends. V2 removes the ambiguity. A refund arrives as REFUND, and a customer turning off renewal arrives as DID_CHANGE_RENEWAL_STATUS with subtype AUTO_RENEW_DISABLED.

What staying on V1 costs in money

Apple decides every App Store refund. The CONSUMPTION_REQUEST is the only point where your usage data reaches that decision, and Apple asks you to answer within 12 hours. On V1, subscription refunds skip that step.

Here's a worked example with illustrative numbers. Say your app sells a $9.99 monthly subscription that includes AI image generations. A subscriber runs 400 generations in a month, and each one costs you real money in model inference. Then they ask Apple for a refund.

Cost lineV1 serverV2 server
Your share of the paymentReturned if Apple approvesReturned if Apple approves
Compute, API calls and storage used that monthAlready paid, not recoverableAlready paid, not recoverable
Chance to show Apple the 400 generationsNoneOne CONSUMPTION_REQUEST, 12 hours
Learn Apple declined the refundNeverREFUND_DECLINED
Learn a refund was reversedNeverREFUND_REVERSED

The payment you lose is your share, not the sticker price. Apple pays 70% of a subscription price, minus applicable taxes, during a subscriber's first year of paid service, and 85% after that or for members of the App Store Small Business Program. The compute bill doesn't shrink with it. Inference, third-party API calls and file storage were paid when the customer used them.

The two missing outcome notifications cost money too. Without REFUND_REVERSED, a server that revoked access on a refund never restores it when Apple takes the refund back, so a paying customer stays locked out and writes to support. Without REFUND_DECLINED, you can't tell a refund that's still pending from one Apple turned down.

A developer's hands moving a network cable from an old patch panel port to a new one beside an open laptop

How to migrate from V1 to V2 without dropping a refund

Moving to V2 is a server change plus one setting. Apple's own guidance on the forums, from an App Store Commerce Engineer in December 2025, explains what happens on the day you switch.

Build the V2 endpoint before you flip the setting

  • Accept a POST whose body carries a signedPayload. V2 payloads are JWS, signed by Apple, so verify the signature before you trust anything inside. Apple's App Store Server Library does this for you.
  • Map CANCEL handling to REFUND, and handle REFUND_DECLINED and REFUND_REVERSED as new cases.
  • Answer CONSUMPTION_REQUEST for subscriptions with Send Consumption Information, and only when the customer consented to sharing data with Apple. Apple says that without consent you shouldn't respond.
  • Return HTTP 200 to 206 on success. Any 40x or 50x makes Apple retry.

Switch the setting in App Store Connect

In App Store Connect, open your app, choose App Information under General, find App Store Server Notifications, and set the Production Server URL to your V2 endpoint with Version 2 selected. Do the same for the sandbox URL first if you want to test, and use Request a Test Notification to confirm your server answers.

Keep the V1 handler alive for about three days

After the switch, new notifications arrive in V2 format right away, for every subscription, old or new. V1 notifications already in retry keep coming in V1 format until they succeed or run out. Apple puts the last possible V1 retry at about 78 hours, which is 6 plus 24 plus 48. Leave the old handler running past that, then remove it.

Replace verifyReceipt while you're there

verifyReceipt was deprecated the same day. It still answers, but Apple points servers to the App Store Server API instead. Get Transaction Info returns one signed transaction, Get Transaction History returns a customer's history, and Get Refund History lists every refunded purchase for a customer. Together with V2 notifications, those cover what most servers used receipts for, including the cancellation_date field that once marked a refund in a receipt.

RefundHalt connects to App Store Server Notifications V2 and answers each CONSUMPTION_REQUEST inside the 12-hour window, using the usage your app already records. If you're still on V1, the switch is the step that makes any of that possible.

Frequently asked questions

Is App Store Server Notifications V1 being shut down?
Not yet. Apple deprecated V1 and verifyReceipt on June 5, 2023, and both still work. Apple has said there's no end-of-life date yet and that developers will be notified in advance. V1 receives no new features in the meantime.
Do I get CONSUMPTION_REQUEST notifications on V1?
Only for consumables, according to Apple's V1 documentation. Consumption requests for auto-renewable subscriptions were added to V2 in April 2024, and Apple sends them through your V2 endpoint. If you sell subscriptions and stay on V1, you can't answer those refund requests.
What does a subscription refund look like on V1 versus V2?
On V1 it arrives as CANCEL, often with DID_CHANGE_RENEWAL_STATUS. On V2 it arrives as REFUND, with a revocationDate and revocationReason on the signed transaction. V2 also sends REFUND_DECLINED when Apple turns down a refund started in your app and REFUND_REVERSED when Apple takes back a refund it granted.
What happens to notifications when I switch from V1 to V2?
New notifications arrive in V2 format shortly after you switch, for all subscriptions. V1 notifications already being retried keep arriving in V1 format until they succeed or exhaust their retries, which Apple puts at about 78 hours after the switch. Keep both handlers running through that window.
Can I go back to V1 after switching to V2?
Yes, through the Modify an App endpoint of the App Store Connect API, as Apple's technote TN3180 describes. Apple calls it an unusual case and still marks V1 as deprecated, so reverting gives up subscription consumption requests and the newer refund notifications.

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.