What does the App Store notification REFUND_DECLINED mean?
The App Store notification REFUND_DECLINED means Apple turned down a refund request that a customer made.
Quick facts#
| Notification | notificationType REFUND_DECLINED |
| Where | App Store Server Notifications v2 (responseBodyV2DecodedPayload) |
| Sent by | The App Store server, to your notification URL |
| What Apple says | The App Store declined a refund request that the customer started in the app with the refund request API. |
What triggers it#
- The customer used the in-app refund request API and Apple decided against a refund.
- It usually follows a
CONSUMPTION_REQUEST, where Apple asked you for usage data about the purchase. - Nothing about the customer's access changes.
What your server should do#
- Verify the
signedPayloadwith Apple's App Store Server Library (SignedDataVerifier.verifyAndDecodeNotification) before you act on anything in it. - Do not revoke anything. The purchase stands.
- Record the outcome, so your refund statistics are right.
- If you replied to a
CONSUMPTION_REQUEST, compare your reply with the result to tune your policy. - 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_DECLINED","data":{"environment":"Sandbox","bundleId":"com.example.app"}};
function decide(n) {
if (n.notificationType !== "REFUND_DECLINED") return "ignore";
return "keep access, record the declined refund";
}
console.log(decide(notification));Run-checked: npm run check:snippets runs this snippet with Node and compares its output with keep access (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. RevenueDot records the refund request's outcome as declined in Refund Control and changes nothing else: it is not in the list of types that update the purchase, so no webhook event is sent. If no request had been recorded, it creates one with the outcome declined.
Related#
- What does the App Store notification CONSUMPTION_REQUEST mean?
- What does the App Store notification REFUND mean?
- What does the App Store notification REFUND_REVERSED 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: services/refunds.ts (Refund Control)
- RevenueDot core: events.ts (how a change becomes a webhook event)
Checked: 2026-10-03