This gives you in-app subscriptions on both stores through RevenueCat: src/lib/payments.ts implements the shim on react-native-purchases, a PaymentsProvider (order 70) keeps the RevenueCat app user id on the signed-in user and listens for customer-info changes, and /paywall ships as a modal with your feature bullets, the current offering's packages and prices, Buy, the store's renewal terms, "Compare all plans", Restore, and Terms/Privacy links from readynative.config.ts urls. If you set up with --with-examples there's an example at /examples/paywall and jest mocks for both native packages. @/lib/payments keeps the same API whichever option you pick - pick RevenueCat when you want StoreKit and Play Billing handled for you, plus remote paywalls you can edit without shipping an update.
When to pick RevenueCat
Pick RevenueCat for the default path to store subscriptions - it handles StoreKit and Play Billing, and its remote paywalls can be edited without shipping an update.
At a glance
- Runs in Expo Go
- No - needs a development build
- Files added
- 9
- npm packages
- 2
- Keys to paste
EXPO_PUBLIC_REVENUECAT_IOS_KEY,EXPO_PUBLIC_REVENUECAT_ANDROID_KEY- Included in
- Pro
- Screens added
/paywall/- Tests included
- 1
Set it up
bun run setup --payments revenuecatSetup copies the module in, installs SDK-matched versions and removes the options you did not pick. Then bun run doctor lists every key still missing, with a link to where you get it. The step-by-step guide is in the RevenueCat docs.
Wiring it by hand instead? Read the guide: RevenueCat subscriptions in an Expo Router app.
RevenueCat vs other payments options
| Option | Expo Go | npm packages | Keys to paste | Included in |
|---|---|---|---|---|
| RevenueCat | Dev build | 2 | 2 | Pro |
| Adapty | Dev build | 2 | 2 | Pro |
| Stripe Checkout | Yes | 1 | 2 | Pro |
Questions
Can I use RevenueCat in Expo Go?
No. This module needs a development build: npx expo run:ios or npx expo run:android locally, or eas build --profile development in the cloud.
What do I need to set up RevenueCat in an Expo app?
Run bun run setup --payments revenuecat, then paste 2 keys into .env: EXPO_PUBLIC_REVENUECAT_IOS_KEY, EXPO_PUBLIC_REVENUECAT_ANDROID_KEY. bun run doctor lists any that are missing, with a link to where you get each one.
Does the ReadyNative free tier include RevenueCat?
No. Payments is a Pro category: the free tier and Starter ship it switched off. Pro is one payment with lifetime updates.
Can I build the app without RevenueCat?
Yes. Pick none for payments (bun run setup --payments none) - payments.useEntitlements() shim returns none.
RevenueCat or Adapty for Expo?
Pick RevenueCat for the default path to store subscriptions - it handles StoreKit and Play Billing, and its remote paywalls can be edited without shipping an update. Pick Adapty if the no-code Paywall Builder and A/B tests on placements are what you want to iterate on; it's the same store billing underneath.
RevenueCat or Stripe Checkout for Expo?
Pick RevenueCat for the default path to store subscriptions - it handles StoreKit and Play Billing, and its remote paywalls can be edited without shipping an update. Pick Stripe if you're selling to the web too, or if what you sell isn't digital goods that Apple and Google require in-app purchase for - it runs on hosted Checkout in the system browser, needs backend/api-routes, and is the one option that works in Expo Go.
What does RevenueCat mean for the App Store and Google Play privacy forms?
It collects: Purchase history; App user id (anonymous by default); Device info. Shared with: RevenueCat (processor). Setup adds its data types to the iOS privacy manifest; the docs page lists the answers for Play's Data safety form.
Which RevenueCat version does it install?
For Expo SDK 57: react-native-purchases ^10.10.1, react-native-purchases-ui ^10.10.1. Setup installs Expo packages with expo install, so they match the SDK.
Get it
RevenueCat ships in Pro: one payment, lifetime updates. See pricing or browse every module.