Apple and Google asked
Entitlements come from what the stores say, not from what the device posts.
Solution
Server-side receipt validation means your server asks Apple or Google whether a purchase is real instead of trusting the phone. RevenueDot does this for the RevenueCat SDK: it verifies StoreKit 2 transactions against Apple's root certificate and the App Store Server API, reads Google Play purchase tokens from the Play Developer API, and answers 5xx for its own failures so no purchase is lost.
Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.
Entitlements come from what the stores say, not from what the device posts.
A 5xx tells the SDK to keep the purchase and try again. A 4xx means it can never succeed.
App Store Server Notifications v2 and Google real-time notifications update state without the app.
Read active entitlements with a secret key, or receive webhooks.
How it works
| App Store | Google Play | |
|---|---|---|
| What the SDK posts | A StoreKit 2 signed transaction (or a StoreKit 1 receipt) | A purchase token |
| How it is checked | JWS verified against Apple's root certificate, then the App Store Server API with your In-App Purchase key | The Play Developer API with your service account |
| Without credentials | StoreKit 2 verified, but no history. StoreKit 1 refused with a retryable 500 | Answers 503 (code 7101), and the SDK retries after you add the service account |
| Later changes | App Store Server Notifications v2 | Real-time developer notifications over Pub/Sub, plus a daily voided-purchase scan |
| Refunds | Recorded from Apple's REFUND notification | Recorded from voided-purchase notifications and the daily scan |
RevenueDot does not call Apple's deprecated verifyReceipt endpoint.
Steps
Start free on Cloud and add an App Store app and a Google Play app.
Add the In-App Purchase key and the Play service account, and check both in the dashboard. See App Store and Google Play.
Paste the notification URLs into App Store Connect (Version 2) and a Pub/Sub push subscription. Watch each app's status turn Ready.
Set the proxy URL before configure. The SDK then posts receipts to POST /v1/receipts.
Read a customer's active entitlements with a secret key, or verify the HMAC on webhooks and deduplicate on the event ID.
Backend
Keep the secret key (sk_) on your server. Never ship it in an app.
curl -s -H "Authorization: Bearer $SECRET_KEY" \
"https://api.revenuedot.app/v2/projects/$PROJECT_ID/customers/user_1/active_entitlements" Error rules
Honest notes
allow_unsigned_receipts setting accepts StoreKit 1 receipts without checking them. Anyone could forge one, so never turn it on in production.FAQ
Send the purchase to a server that asks the store. For Apple that means verifying the signed transaction and calling the App Store Server API. For Google it means reading the purchase token with the Play Developer API. RevenueDot does both for the RevenueCat SDK.
Apple deprecated verifyReceipt. RevenueDot does not call it. It verifies StoreKit 2 signed transactions locally and uses the App Store Server API with your In-App Purchase key.
RevenueDot answers 5xx for its own and temporary store failures, so the SDK keeps the purchase and retries. It answers 4xx only when a purchase can never be valid, so a paying customer does not lose access to a server bug.
Call the Google Play Developer API with a service account that has View financial data and Manage orders and subscriptions, then acknowledge the purchase within 3 days. RevenueDot does this and re-reads each purchase on every notification.
Yes. Read a customer's active entitlements with the REST API and a secret key, or receive webhooks and verify their HMAC signature. Deduplicate on the event ID.
Get started
Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue, or move an existing RevenueCat app with one line of code.
Already have an account? Sign in · Prefer your own servers? Self-host free