Subscription UI is easy to mock. Subscription state is where a mobile project usually starts accumulating edge cases.
For an Expo app, I wanted one small reference implementation that handled the current RevenueCat offering, localized package prices, purchases, cancellation, restores, entitlement state, optional custom user IDs, and customer-info updates without scattering the logic across every screen.
The key design decision was an explicit preview mode.
Before public SDK keys and native store products are configured, the app can render the complete paywall and navigate through its interface, but purchase and restore actions remain unavailable. Preview data is clearly separated from live RevenueCat data, so a developer can review the UI without suggesting that a real transaction is possible.
Once live configuration is present, the service layer initializes RevenueCat with the platform-specific public key, optionally identifies the user, retrieves the current offering, listens for customer-info changes, and maps the configured entitlement into a small app-level state.
The paywall itself does not need to know how RevenueCat is initialized. It receives packages and state, then calls purchase or restore actions exposed by the subscription layer. That keeps store-specific details out of the UI and makes the failure states easier to explain.
Before packaging the reference app, I ran a strict TypeScript check, Expo Doctor with 21/21 passing checks, and a clean static web export. The downloadable package also includes a setup guide and a real-device test checklist because a browser preview cannot validate Apple or Google billing.
I released the complete source as the Expo RevenueCat Launch Kit. This is my paid product, and I am linking it transparently rather than presenting this article as independent coverage:
https://marcomatic06.gumroad.com/l/expo-revenuecat-launch-kit/LAUNCH25
The launch link gives the first 10 buyers 25% off for 72 hours. The kit is an independent developer resource and is not affiliated with RevenueCat or Expo.
Top comments (0)