Apple App Store Server Notifications
RevenueCat does not require server notifications from the App Store, however doing so can speed up webhook and integration delivery times, reduce lag time for Charts, and allow you to use our Handling Refund Requests feature.
Setup Instructionsβ
Apple server-to-server notifications should be set up in App Store Connect with the URL provided in the RevenueCat dashboard.
- Navigate to your iOS app under Project settings > Apps in the RevenueCat dashboard.
- Scroll to the Apple Server to Server notification settings section, and copy the entire URL provided under Apple Server Notification URL.
- Log in to App Store Connect and select your app.
- Under the App Information > App Store Server Notifications section, paste the entire URL from RevenueCat in both the Production Server URL field and the Sandbox Server URL field. You can use either Version 1 or Version 2 notifications, but Version 2 notifications are recommended to use features such as auto-detecting price changes.
Considerationsβ
RevenueCat will be able to process V1 or V2 notifications, however, we recommend utilizing V2 for the following reasons:
- Auto-detect price changes
- Better reliability for handling refund requests
Here are some key points to keep in mind when considering this switch:
- RevenueCat continues to operate normally without relying on notifications. Even if there's a brief downtime during the transition, there is no risk of data interruptions.
- Apple has deprecated their V1 notifications and will continue to make improvements to their V2 notifications.
- The main reason to stay on V1 notifications is if your system has specific logic tied to V1. For example, if you have custom logic for processing notifications and are forwarding V1 notifications from RevenueCat to your own systems or from your systems to RevenueCat. You will have to update your custom logic before making the switch to V2.
Apple supports separate URLs for production as well as sandbox purchases, but only allows one of each. You should enter the RevenueCat URL for both of these fields if you don't want to receive these notifications on your own server.
If you want to also receive these notifications on your own server for one or both environments, see our guide on setting up RevenueCat to forward the notifications to your server below.
If RevenueCat receives a notification for a user that doesn't have any purchases in RevenueCat, a 200 code will be sent and the request will be ignored, so the last received notification timestamp won't be updated. Keep this in mind when forwarding events yourself.
[Option 1 (recommended)] Setting up RevenueCat to forward Apple notifications to your serverβ
If you still want to receive Apple's notifications to your server, you can configure RevenueCat to forward them to a URL that you specify.
- Navigate to your iOS app under Project settings > Apps in the RevenueCat dashboard.
- Scroll to the Apple Server to Server notification settings section, and enter your server's URL in Apple Server Notification Forwarding URL.
- Click Save Changes in the top right corner.
If your server needs to have specific hostnames or IP addresses on its allowlist to receive App Store Server Notifications, you can add the hostname dps.iso.aple.com
and IP addresses 17.58.0.0/18
and 17.58.192.0/18
. These IP addresses are same for sandbox and production.
[Option 2] Forwarding Apple notifications to RevenueCatβ
While you can forward Apple S2S notifications to RevenueCat, we strongly recommend setting RevenueCat as the S2S notification URL in App Store Connect and letting RevenueCat forward the events to your server to ensure that the events are sent correctly.
Apple only supports a single server notification URL. If you're already using the notifications on your server and are unable to set up RevenueCat's forwarding URL, you can still forward the payload to the Apple Server Notification URL provided in the app settings of your RevenueCat project.
Here's how we recommend doing this:
1. Configure your server to receive Apple notificationsβ
First, make sure your server meets the criteria outlined in Apple's Enabling App Store Notifications page or you won't receive notifications.
Then, in your app settings on App Store Connect, enter a subscription status URL that links to your server (see step 4 of the Setup Instructions above).
2. Receive Apple notifications on your serverβ
Apple sends notifications as JSON data via an HTTP POST request to the URL you provided on App Store Connect.
Wherever you handle this POST request in your code, be sure to respond to Apple with a status code. Responding with a 4xx or 5xx status code will permit Apple to retry the post a few more times.
3. Forward Apple notifications to RevenueCatβ
As soon as your server successfully receives a notification, send the payload to RevenueCat. To do this, make an HTTP POST request to the Apple Server Notification URL provided in the app settings of your RevenueCat project.
The payload should be passed along as-is in the data value of your request. Any manipulation you want to do with the data should happen after forwarding to RevenueCat.
Here's a basic example of these steps using Node, Express, and Axios:
- JavaScript
app.post('/subscription-update', (req, res) => {
// - Let Apple know we received the notification
res.status(200).json();
// - Forward the request body as-is to RevenueCat
axios.post(process.env.REVENUECAT_URL, req.body)
.then(response => {
// - Successfully forwarded to RevenueCat
console.log("Successfully forwarded to RevenueCat", response);
})
.catch(error => {
// - Consider a retry to RevenueCat if there's a network error or status code is 5xx
// - This is optional as RevenueCat should recheck the receipt within a few hours
console.error("Failed to send notification to RevenueCat", error);
});
// - Anything else you want to do with the request can go here
});
Tracking new purchases using Apple App Store Server Notificationsβ
By default, RevenueCat ignores any Apple App Store Server Notifications for purchases that have not yet been posted to the RevenueCat API by one of our SDKs or from your own backend. For RevenueCat to track new purchases from Apple App Store Server Notifications, you can enable the "Track new purchases from server-to-server notifications" option in our Dashboard. This allows RevenueCat to process new purchases from server-to-server notifications that are not yet in our system. This ensures all purchases are tracked, even in the case of network issues between your app and RevenueCatβs backend or if your customer was using a version of the app without the RevenueCat SDK.
Considerationsβ
- The subscriber's app user ID will be taken from the
appAccountToken
field of the transaction.- If the
appAccountToken
is set and does not match with an existing subscriber: RevenueCat will create a new subscriber with an app user ID matching theappAccountToken
value set. - If the
appAccountToken
is set and matches with an existing subscriber: No new subscriber will be created, and the purchase will be linked to that existing subscriber. - If the
appAccountToken
is not set: RevenueCat will generate an anonymous app user ID to associate that purchase with.
- If the
- If you are using RevenueCat's SDK to track purchases, we may receive the notification directly from the store before the SDK. When this happens, we will follow the app user ID logic as described in the bullet point above, and then proceed with your transfer behavior for the new app user ID sent by the SDK.
RevenueCat will start processing the purchase as soon as we receive the Apple server notification. If you rely on RevenueCat customer attributes being attached to the customer before the purchase is created on RevenueCat (e.g: sending customer attributes to your enabled third-party integrations or webhooks), you should make sure to send and sync the customer attributes as soon as you have them or before the purchase is completed.
If you have enabled Keep with original App User ID or Transfer if there are no active subscriptions transfer behavior, we highly recommend turning this setting off unless you are not setting the appAccountToken
or if the appAccountToken
will match their RevenueCat app user ID.