---
title: "What does the App Store notification REFUND mean?"
description: "REFUND means the App Store refunded a purchase. Revoke what the customer got, using the revocation date and reason. Applies to consumables, non-consumables and subscriptions."
url: https://revenuedot.app/docs/notifications/apple-refund
---

# What does the App Store notification REFUND mean?

The App Store notification REFUND means Apple refunded a transaction, so the customer should lose what that purchase gave them.

## Quick facts

| | |
|---|---|
| Notification | `notificationType` `REFUND` |
| Where | App Store Server Notifications v2 (`responseBodyV2DecodedPayload`) |
| Sent by | The App Store server, to your notification URL |
| What Apple says | The App Store refunded a transaction for a consumable, a non-consumable, an auto-renewable subscription or a non-renewing subscription. revocationDate holds the time of the refund. |

## What triggers it

- Apple approved a refund request, whether the customer asked through Apple support or through your app's refund request API.
- The decoded transaction has `revocationDate` and `revocationReason`, and `originalTransactionId` and `productId` identify the purchase.
- Apple's Get Refund History endpoint lists a customer's refunded transactions.

## What your server should do

1. Verify the `signedPayload` with Apple's App Store Server Library (`SignedDataVerifier.verifyAndDecodeNotification`) before you act on anything in it.
2. Revoke the access or the credited item for that transaction, effective at `revocationDate`.
3. Keep a record of the refund against the customer for support.
4. Only roll back what that transaction gave: a refund of an old renewal does not undo the current period.
5. 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

```javascript
// Run on the decoded payload, after you verified Apple's signature.
const notification = {"notificationType":"REFUND","data":{"environment":"Sandbox","bundleId":"com.example.app"}};

function decide(n) {
  if (n.notificationType !== "REFUND") return "ignore";
  const revokedAt = 1790800914000;
  return "revoke the purchase as of " + new Date(revokedAt).toISOString().slice(0, 10);
}

console.log(decide(notification));
```

*Run-checked: `npm run check:snippets` runs this snippet with Node and compares its output with `revoke the purchase as of 2026-09-30` (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's `revocationDate` becomes the purchase's refund time. A refunded subscription period gives `CANCELLATION` with `cancel_reason: CUSTOMER_SUPPORT` and a negative price. A refund of an older period never rolls the chain back, because RevenueCat reports only the latest period. If the transaction had a refund request, Refund Control marks it approved.

## Related

- [What does the App Store notification REFUND_REVERSED mean?](https://revenuedot.app/docs/notifications/apple-refund-reversed.md)
- [What does the App Store notification REFUND_DECLINED mean?](https://revenuedot.app/docs/notifications/apple-refund-declined.md)
- [What does the App Store notification REVOKE mean?](https://revenuedot.app/docs/notifications/apple-revoke.md)
- [Which webhook events does RevenueDot send?](https://revenuedot.app/docs/api/webhook-events.md)
- [Set up App Store notifications in RevenueDot](https://revenuedot.app/docs/guides/app-store.md)

## Source

- [Apple: notificationType](https://developer.apple.com/documentation/appstoreservernotifications/notificationtype)
- [Apple: Responding to App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications/responding-to-app-store-server-notifications)
- [Apple: app-store-server-library-node (SignedDataVerifier)](https://github.com/apple/app-store-server-library-node)
- [RevenueDot server: stores/apple/notifications.ts (how the notification is applied)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/stores/apple/notifications.ts)
- [RevenueDot server: stores/apple/map.ts (how the transaction becomes a stored purchase)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/stores/apple/map.ts)
- [RevenueDot core: events.ts (how a change becomes a webhook event)](https://github.com/revenuedot/revenuedot/blob/main/packages/core/src/events.ts)
- [RevenueDot server: services/refunds.ts (Refund Control)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/services/refunds.ts)

Checked: 2026-10-03
