one_time_charge

Learn about the ONE_TIME_CHARGE App Store Server Notification V2. Fired when a customer purchases a consumable, non-consumable, or non-renewing subscription.

App Store Server Notifications V2Purchases
one_time_charge

The ONE_TIME_CHARGE notification fires when a customer purchases a consumable, non-consumable, or non-renewing subscription. It also fires when a family member receives access to a non-consumable through Family Sharing, or when a customer redeems an offer code for a one-time product.


When does it fire?


This notification triggers for one-time In-App Purchases, not auto-renewable subscriptions:


  • A customer buys a consumable, non-consumable, or non-renewing subscription
  • A customer redeems an offer code for one of those product types
  • A family member receives a non-consumable through Family Sharing

For auto-renewable subscriptions, see SUBSCRIBED instead.


Payload highlights


The signed transaction info includes the product ID, price, currency, and transaction ID. Yeethook decodes the JWS so the message shows the product and amount instead of a raw token.


How Yeethook helps


One-time purchases are easy to miss if you only watch subscription renewals. Yeethook formats ONE_TIME_CHARGE the same way as subscription events, so consumables and lifetime unlocks show up in Slack or Discord with product and price.


Common use cases


  • Track consumable and non-consumable sales in Slack or Discord
  • Watch Family Sharing grants for lifetime unlocks
  • Alert on high-value one-time purchases

Example payload

The decoded body for a consumable purchase. There is no signedRenewalInfo and no status, because nothing about a one-time product renews — the only nested JWS is the transaction itself.

{
  "notificationType": "ONE_TIME_CHARGE",
  "notificationUUID": "70b3e94a-2c58-4d17-a6f9-15d80c37b2e6",
  "version": "2.0",
  "signedDate": 1790667591000,
  "data": {
    "appAppleId": 1234567890,
    "bundleId": "com.example.app",
    "bundleVersion": "142",
    "environment": "Production",
    "signedTransactionInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6..."
  }
}

What it looks like in Slack

Info

One-time purchase

Product
com.example.app.coins.500
Price
4.99 USD
Transaction
2000000856781234
Environment
Production

Questions about one_time_charge

Why is there no Expires or Auto-renew row in the message?

Those rows are built from expiresDate and autoRenewStatus, and neither exists for consumables or non-consumables. The message is deliberately four rows long, which also makes it a quick visual check that you are not looking at a subscription event.

How do I tell a consumable from a non-consumable?

Decode signedTransactionInfo and read type, which is one of Consumable, Non-Consumable, Non-Renewing Subscription or Auto-Renewable Subscription. The notification type alone cannot distinguish them, since all three one-time kinds share ONE_TIME_CHARGE.

Why did older integrations never see this notification?

Apple only added ONE_TIME_CHARGE to App Store Server Notifications V2 in 2024. Before that, consumable and non-consumable purchases produced no server notification at all, so anything built earlier had to detect them from client transactions or receipt validation.

Get this event in Slack or Discord

Connect Yeethook to receive one_time_charge notifications in your team's Slack or Discord channels.

Get Started Free