What does the App Store notification SUBSCRIBED mean?
The App Store notification SUBSCRIBED means a customer subscribed to an auto-renewable subscription, for the first time or again.
Quick facts#
| Notification | notificationType SUBSCRIBED |
| Where | App Store Server Notifications v2 (responseBodyV2DecodedPayload) |
| Sent by | The App Store server, to your notification URL |
| What Apple says | The customer subscribed to an auto-renewable subscription. The subtype says whether it is the first purchase or a resubscribe. |
What triggers it#
- Subtype
INITIAL_BUY: the customer bought or got access through Family Sharing to a subscription in the group for the first time, including by redeeming an offer code. - Subtype
RESUBSCRIBE: the customer resubscribed, or got access through Family Sharing, to the same subscription or another one in the same subscription group, including through a promotional, offer code or win-back offer. - To tell whether an offer was used, Apple says to check
offerTypein the decoded transaction (JWSTransactionDecodedPayload).
What your server should do#
- Verify the
signedPayloadwith Apple's App Store Server Library (SignedDataVerifier.verifyAndDecodeNotification) before you act on anything in it. - Decode
signedTransactionInfo, find the customer through your own account link (for example theappAccountToken) and grant the entitlement untilexpiresDate. - Treat
RESUBSCRIBEas access again, not as a second first purchase, so your counts of new subscribers stay right. - 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":"SUBSCRIBED","data":{"environment":"Sandbox","bundleId":"com.example.app"}};
function decide(n) {
if (n.notificationType !== "SUBSCRIBED") return "ignore";
return n.subtype === "RESUBSCRIBE" ? "grant access, count a returning subscriber" : "grant access, count a new subscriber";
}
console.log(decide(notification));Run-checked: npm run check:snippets runs this snippet with Node and compares its output with count a new subscriber (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. SUBSCRIBED is one of the types that update the stored purchase from the signed transaction and renewal info. A chain RevenueDot has not stored before produces INITIAL_PURCHASE; a chain it already holds with a new period produces RENEWAL, because RevenueCat reports a lapsed customer who resubscribes as a renewal and RevenueDot copies that. The subtype is not used; the stored state is.
Related#
- What does the App Store notification DID_RENEW mean?
- What does the App Store notification OFFER_REDEEMED mean?
- What does the App Store notification EXPIRED 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: stores/apple/map.ts (how the transaction becomes a stored purchase)
- RevenueDot core: events.ts (how a change becomes a webhook event)
Checked: 2026-10-03