A straight checklist: App Store Connect products, RevenueCat dashboard, Expo app code, and the gotchas we hit with sandbox vs production.
RevenueCat sits between your app and Apple or Google's billing. Your job is to align three places: the store's product IDs, RevenueCat's offerings and entitlements, and what your React Native code checks at startup.
Create products in App Store Connect first, with clear reference names. Mirror those identifiers in RevenueCat exactly. One typo means "subscription never unlocks" with no stack trace in your JS.
Use entitlements for access, not packages for feature flags. Example: entitlement "pro" unlocks export. Packages are just how you sell "pro" (monthly vs annual). Mixing those up makes restore purchases confusing for testers.
In Expo, use the official RevenueCat SDK and initialize early after you know the user ID. Anonymous IDs work for guests, but if you have sign-in, call logIn when the account is stable so purchases don't stick to the wrong profile.
Sandbox testers behave differently: renewals are fast, subscriptions can stack in weird ways. Always verify with a fresh install and a real device before you blame "RevenueCat is broken."
When something fails, RevenueCat's customer event log is the first place to look. Pair it with your own logs for "user opened paywall" and "purchase completed" so you can see drop-off between intent and store.
“Good systems are mostly boring parts wired together so they don’t fall over on a Tuesday night.”
Jafrix System