What does the App Store notification REFUND_REVERSED mean?
The App Store notification REFUND_REVERSED means Apple took back a refund it had granted, after a dispute by the customer.
Quick facts#
| Notification | notificationType REFUND_REVERSED |
| Where | App Store Server Notifications v2 (responseBodyV2DecodedPayload) |
| Sent by | The App Store server, to your notification URL |
| What Apple says | The App Store reversed a refund it granted, because of a dispute the customer raised. If your app revoked content because of the refund, it needs to restore it. |
What triggers it#
- The customer disputed a refund and Apple reversed it.
- It applies to every product type. For auto-renewable subscriptions the renewal date stays the same.
- You will have seen a
REFUNDfor the same transaction earlier.
What your server should do#
- Verify the
signedPayloadwith Apple's App Store Server Library (SignedDataVerifier.verifyAndDecodeNotification) before you act on anything in it. - Restore the access or credited item that the refund removed.
- Undo the refund record on your side so revenue reports match.
- Match it to the earlier
REFUNDbytransactionId. - Answer HTTP 200 (any code from 200 to 206) once you have stored the notification. Apple retries other answers five times, at 1, 12, 24, 48 and 72 hours after the previous attempt, so make your handler safe to run twice (the payload carries a
notificationUUID).
Example#
// Run on the decoded payload, after you verified Apple's signature.
const notification = {"notificationType":"REFUND_REVERSED","data":{"environment":"Sandbox","bundleId":"com.example.app"}};
function decide(n) {
if (n.notificationType !== "REFUND_REVERSED") return "ignore";
return "reinstate the purchase, remove the refund record";
}
console.log(decide(notification));Run-checked: npm run check:snippets runs this snippet with Node and compares its output with reinstate the purchase (checked 2026-10-03).
How RevenueDot handles it#
RevenueDot verifies Apple's signature, checks the bundle ID, stores the notification and answers 200. A purchase RevenueDot has not seen is applied only when the app's Track new purchases from server-to-server notifications setting is on. The transaction no longer has a revocation date, so the refund time is cleared and RevenueDot sends REFUND_REVERSED. Its payload adds renewal_number, the count of renewals the subscription had gone through, as RevenueCat's sample does.
Related#
- What does the App Store notification REFUND mean?
- What does the App Store notification REFUND_DECLINED mean?
- What does the App Store notification REVOKE mean?
- Which webhook events does RevenueDot send?
- Set up App Store notifications in RevenueDot
Source#
- Apple: notificationType
- Apple: Responding to App Store Server Notifications
- Apple: app-store-server-library-node (SignedDataVerifier)
- RevenueDot server: stores/apple/notifications.ts (how the notification is applied)
- RevenueDot server: stores/apple/map.ts (how the transaction becomes a stored purchase)
- RevenueDot core: events.ts (how a change becomes a webhook event)
Checked: 2026-10-03