---
title: "What does the App Store notification ONE_TIME_CHARGE mean?"
description: "ONE_TIME_CHARGE means a customer bought a consumable, non-consumable or non-renewing subscription, or got a non-consumable through Family Sharing. Deliver the purchase once."
url: https://revenuedot.app/docs/notifications/apple-one-time-charge
---

# What does the App Store notification ONE_TIME_CHARGE mean?

The App Store notification ONE_TIME_CHARGE means a customer bought a consumable, a non-consumable or a non-renewing subscription.

## Quick facts

| | |
|---|---|
| Notification | `notificationType` `ONE_TIME_CHARGE` |
| Where | App Store Server Notifications v2 (`responseBodyV2DecodedPayload`) |
| Sent by | The App Store server, to your notification URL |
| What Apple says | The customer purchased a consumable, non-consumable or non-renewing subscription. It is also sent when they get a non-consumable through Family Sharing. |

## What triggers it

- A purchase of a one-time product, including by redeeming an offer code for one.
- A family member received a non-consumable through Family Sharing.
- Purchases of auto-renewable subscriptions arrive as `SUBSCRIBED`, not as this type.

## 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. Deliver the product once, keyed on `transactionId`, so a retried notification does not grant it twice.
3. Check `inAppOwnershipType` to tell a purchase from a Family Sharing grant.
4. Check `offerType` when you need to know if an offer code was used.
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":"ONE_TIME_CHARGE","data":{"environment":"Sandbox","bundleId":"com.example.app"}};

function decide(n) {
  if (n.notificationType !== "ONE_TIME_CHARGE") return "ignore";
  const delivered = new Set();
  const txId = "2000000123456789";
  if (delivered.has(txId)) return "already delivered";
  delivered.add(txId);
  return "deliver the product once";
}

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

*Run-checked: `npm run check:snippets` runs this snippet with Node and compares its output with `deliver the product once` (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 is stored as a one-time purchase keyed on `transactionId`. A purchase RevenueDot has not recorded gives a `NON_RENEWING_PURCHASE` event; a refund later gives `CANCELLATION` with `cancel_reason: CUSTOMER_SUPPORT`.

## Related

- [What does the App Store notification REFUND mean?](https://revenuedot.app/docs/notifications/apple-refund.md)
- [What does the App Store notification OFFER_REDEEMED mean?](https://revenuedot.app/docs/notifications/apple-offer-redeemed.md)
- [What does the App Store notification SUBSCRIBED mean?](https://revenuedot.app/docs/notifications/apple-subscribed.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)

Checked: 2026-10-03
