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.

Source#

Checked: 2026-10-03

Edit this page on GitHub ↗ View as Markdown Last updated