Starting from release 9.7.6 of react-native-purchases, teams building with React Native can manage subscriptions across iOS, Android, and web using the same SDK and the same RevenueCat entitlements system. If your app already runs on mobile and you’re extending it to the web — or you’re starting with a shared codebase from day one — this makes it easier to support subscriptions everywhere without rethinking your architecture.
Add react-native-purchases to your Expo or React Native project, and you have power subscriptions, in-app purchases, entitlement management on three different platforms with a single code-base.
Why we built this
As more React Native apps expand beyond mobile, the web has become part of the product rather than just a marketing surface. Teams want users to sign up, upgrade, or manage subscriptions in a browser, while still unlocking access inside their iOS and Android apps. Until now, that often meant maintaining a separate billing system for web and stitching everything together with custom logic.
React Native Web support removes that split. Web purchases flow into the same RevenueCat backend as native purchases, so you can rely on a single entitlements system instead of reconciling multiple sources of truth.
How billing works on web
On iOS and Android, RevenueCat integrates directly with the App Store and Google Play. On the web, purchases are handled through RevenueCat Web Billing, which uses Stripe or Paddle as the payment processor. Web Billing is separate from native in-app purchases, but it connects to the same entitlements system, making it possible to grant access across platforms using a shared appUserID.
From your app’s perspective, subscription state stays consistent regardless of where a user originally subscribed. A customer who signs up on the web can immediately access premium features on mobile, without you needing to write platform-specific logic.
Getting started with React Native Web
Enabling React Native Web support starts with configuring RevenueCat using the appropriate API key for each platform. When your app runs on the web, you’ll initialize the SDK with a Web Billing public API key, while iOS and Android continue to use their native keys.
Here’s what that looks like in practice:
1import { Platform } from 'react-native';
2import Purchases from 'react-native-purchases';
3
4if (Platform.OS === 'web') {
5 Purchases.configure({ apiKey: '<public_web_billing_api_key>' });
6} else if (Platform.OS === 'ios') {
7 Purchases.configure({ apiKey: '<public_apple_api_key>' });
8} else if (Platform.OS === 'android') {
9 Purchases.configure({ apiKey: '<public_google_api_key>' });
10}
Once configured, entitlement checks work the same way across platforms. Your app logic doesn’t need to branch based on where a subscription was purchased.
1import Purchases from 'react-native-purchases'
2// all of the following methods work on iOS, Android, and Web
3
4// Check offerings
5try {
6 const offerings = await Purchases.getOfferings();
7 if (offerings.current !== null && offerings.current.availablePackages.length !== 0) {
8 // Display packages for sale
9 }
10} catch (e) {
11
12}
13
14// Check entitlements
15const customerInfo = await Purchases.getCustomerInfo();
16if(typeof customerInfo.entitlements.active[<my_entitlement_identifier>] !== "undefined") {
17 // Grant user "pro" access
18}
19
20// Purchase a package
21try {
22 const { customerInfo } = await Purchases.purchasePackage(package);
23 if (
24 typeof customerInfo.entitlements.active["my_entitlement_identifier"] !==
25 "undefined"
26 ) {
27 // Unlock that great "pro" content
28 }
29} catch (e) {
30 if (!e.userCancelled) {
31 showError(e);
32}
33
To enable web purchases, you’ll also need to create a Web Billing app in the RevenueCat dashboard and configure your products for web. These live alongside your iOS and Android products, but are billed through Web Billing rather than native stores.
Using Expo
If you’re building with Expo, React Native Web support also improves the development experience. You can preview subscription UI, test entitlement logic, and validate integration flows directly on the web without immediately creating a custom development client. This makes it easier to iterate early and confirm that your setup works end to end.
To fully test real in-app purchases on iOS and Android, you’ll still need an Expo development build. Web support doesn’t replace that requirement, but it does remove a lot of friction during early development.
Current limitations
Because web billing works differently from native app stores, there are a few limitations to be aware of. Web purchases require RevenueCat Web Billing and can’t process native iOS or Android in-app purchases. In addition, some operations that depend on native store APIs aren’t supported on web environments, including getProducts, purchaseProduct, and restorePurchases. Expo Go and similar sandbox enviroments don’t support purchasing either.
1// this will not work on web, but works on iOS and Android:
2try {
3 const restore = await Purchases.restorePurchases();
4 // ... check restored purchaserInfo to see if entitlement is now active
5} catch (e) {
6
7}
Users can manage their web subscriptions through the RevenueCat-hosted customer portal, which provides a consistent way to update or cancel subscriptions outside of native app stores.
What’s next
As subscription apps increasingly span mobile and web, we’re continuing to invest in making cross-platform subscription management simpler and more reliable. React Native Web support is a foundation for that work, and we’ll keep improving the experience as teams push it further in production.
If you’re already using RevenueCat with React Native on mobile, adding web support is now a natural next step.

