Documentation

Set up RevenueCat

RevenueCat handles subscriptions. You still need to set up the products, entitlements, and testing. This guide walks through it without jargon.

The simple mental model

Good to know

How it all fits together:

Products → What users buy (monthly, yearly)

Entitlements → What your app unlocks (pro access)

Offerings → What your paywall displays (monthly vs yearly)

Apple and Google own the actual payments. RevenueCat reads store data, tells your app what the user can access, and syncs purchase history.

1

Create store products

Start in App Store Connect and Google Play Console. Create your subscription products before touching RevenueCat. Use boring, stable IDs.

text

1pro_monthly2pro_yearly

Tip

Platform naming: IDs do not need to match across platforms, but keep them consistent in naming (e.g., both have pro_ prefix). This makes your code and team communications easier.

What to verify in the store

  • Subscription products are active and priced.
  • The app bundle ID or package name is correct.
  • App Store agreements and tax/banking are complete.
  • Sandbox testers are added (Apple) or license testing is enabled (Google).
2

Import into RevenueCat

In RevenueCat, go to your project and connect your iOS and Android apps. Then import the products. If products do not appear:

  • Double-check bundle ID and package name
  • Wait 15 minutes after store changes — RevenueCat caches product data
  • Make sure the store product is in an active state
3

Create the entitlement

An entitlement represents "access to premium." The kit examples use pro. Attach every paid product that should unlock premium features to this entitlement.

text

1entitlement id: pro

Good to know

Why entitlements matter: Your app checks the entitlement, not individual products. This means you can swap monthly for yearly, add trials, or change prices without touching any app code.
4

Create the offering

An offering is what your paywall shows. Create "default", mark it as current, and add the packages (monthly, yearly, etc.) to it.

text

1offering: default2packages: monthly, yearly3unlocks entitlement: pro

PaywallReady loads the current offering automatically. Changing the current offering in RevenueCat updates what your paywall displays without any code changes.

5

Add the SDK keys

RevenueCat gives you a public SDK key per platform. These are safe to put in your app — they are public by design.

.env

1EXPO_PUBLIC_REVENUECAT_IOS_API_KEY=appl_xxxxxxxx2EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY=goog_xxxxxxxx3EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID=pro

Watch out

Keep under lock and key: RevenueCat webhook secrets, Firebase Admin keys, and server credentials belong in server environment variables only. The mobile app should only receive public SDK keys.
6

Test with a development build

Expo Go does not include the RevenueCat native module. You must use a development build or TestFlight. This is the #1 reason new users see their paywall not working.

bash

1npx expo run:ios2 3# or with EAS:4eas build --profile development --platform ios

Sandbox testing checklist

  • Paywall shows real prices, not placeholder text.
  • Sandbox purchase completes without crashing.
  • RevenueCat dashboard shows the purchase event.
  • The pro entitlement is active after purchase.
  • Restore purchases works after reinstalling the app.
  • Premium status is still correct after restarting the app.
!

Common mistakes

Paywall loads but prices are missing

Check the offering status and store product configuration. RevenueCat might not have synced the products yet.

Purchase starts but fails

Verify sandbox account setup (Apple) or license testing (Google). Ensure the app is running in a development build, not Expo Go.

Purchase succeeds but premium stays locked

Check that the product is attached to the pro entitlement in RevenueCat. Also check that your app is checking the entitlement, not the product ID.