By Malik Chohra
Stripe Payments in React Native with Expo, Pre-Built and Ready to Ship
How to add Stripe payments to a React Native Expo app. Plus: why RevenueCat beats Stripe for mobile subscriptions, and how AI Mobile Launcher ships with payments pre-integrated.
Stripe payments in React Native with Expo, what you actually need to know
Adding Stripe to a React Native Expo app requires the @stripe/stripe-react-native SDK, a backend endpoint to create PaymentIntents (Stripe never processes payments client-only), and platform-specific native setup for both iOS and Android. For one-time payments this is manageable. For subscriptions, RevenueCat is almost always the better choice, it handles App Store and Google Play billing natively without a backend.
This guide covers both paths: how to integrate Stripe for one-time payments in Expo, and why most mobile subscription apps use RevenueCat instead.
Stripe vs. RevenueCat for mobile subscriptions
Before writing a line of payment code, clarify what you're building:
- One-time purchases, marketplace payments, or complex pricing: Stripe is the right choice. It's the most flexible payment processor available and handles web-style billing well.
- Mobile app subscriptions (weekly, monthly, annual): RevenueCat is almost always better. Apple and Google require in-app purchases for digital subscriptions, Stripe cannot process App Store or Google Play subscriptions. Using Stripe for mobile subscriptions means you lose 30% to Apple/Google anyway and add server-side complexity that RevenueCat eliminates.
For a typical consumer mobile app with a subscription model, RevenueCat is the correct tool. This post covers both so you can choose based on your specific use case.
How to add Stripe to a React Native Expo app
Step 1: Install the Stripe SDK
Stripe's React Native SDK works with Expo but requires a custom dev client (you cannot use Expo Go, as the SDK includes native code):
npx expo install @stripe/stripe-react-native
Then run a new build to get the native module included:
eas build --profile development --platform ios eas build --profile development --platform android
Step 2: Wrap your app with StripeProvider
import { StripeProvider } from '@stripe/stripe-react-native';
export default function App() {
return (
<StripeProvider publishableKey={process.env.EXPO_PUBLIC_STRIPE_KEY}>
<NavigationContainer>
{/* your app */}
</NavigationContainer>
</StripeProvider>
);
}Step 3: Create a PaymentIntent on your backend
This is the step most tutorials skip. Stripe requires a server-side call to create a PaymentIntent, you cannot create one client-side without exposing your secret key. Your backend endpoint:
// Node.js / Express example
app.post('/create-payment-intent', async (req, res) => {
const { amount, currency } = req.body;
const paymentIntent = await stripe.paymentIntents.create({
amount, // in cents
currency,
automatic_payment_methods: { enabled: true },
});
res.json({ clientSecret: paymentIntent.client_secret });
});Step 4: Present the payment sheet
import { useStripe } from '@stripe/stripe-react-native';
const { initPaymentSheet, presentPaymentSheet } = useStripe();
// After fetching clientSecret from your backend:
await initPaymentSheet({
paymentIntentClientSecret: clientSecret,
merchantDisplayName: 'Your App Name',
});
const { error } = await presentPaymentSheet();
if (!error) {
// Payment succeeded
}Platform-specific setup for Stripe in Expo
iOS
Add the following to your app.json or app.config.js:
{
"expo": {
"plugins": [
[
"@stripe/stripe-react-native",
{
"merchantIdentifier": "merchant.com.yourapp",
"enableGooglePay": true
}
]
]
}
}Apple Pay requires a Merchant ID registered in the Apple Developer portal and a verified domain. Google Pay requires enabling the Google Pay API in your Google Cloud project.
Android
Add your Stripe publishable key to android/app/src/main/AndroidManifest.xml:
<meta-data android:name="com.stripe.android.publishableKey" android:value="pk_live_your_key_here" />
Why most Expo apps use RevenueCat instead of Stripe for subscriptions
For subscription-based mobile apps, RevenueCat is almost universally preferred over Stripe. Here's why:
- Apple/Google mandate in-app purchases for digital subscriptions. If your app sells a subscription for digital content or features, App Store Review requires you to use IAP. Stripe cannot process Apple or Google IAP. Trying to bypass this with a web payment flow risks App Store rejection.
- No backend required for subscriptions. RevenueCat handles receipt validation, subscription status, trial periods, and grace periods server-side, you just call Purchases.purchasePackage() and check customerInfo.entitlements. No PaymentIntent, no webhook, no server.
- Built-in paywall UI and analytics. RevenueCat's Paywalls SDK lets you A/B test paywall designs without app store submissions. Their dashboard shows MRR, churn, LTV, and trial conversion out of the box.
- Cross-platform entitlement management. A user who subscribes on iOS is automatically recognized on Android. Stripe has no concept of this, you'd need to build your own entitlement sync layer.
Expo + RevenueCat: the faster path for subscription apps
Installing RevenueCat in an Expo app:
npx expo install react-native-purchases react-native-purchases-ui
Configure with your API keys (from the RevenueCat dashboard):
import Purchases from 'react-native-purchases';
// In your app initialization:
Purchases.configure({
apiKey: Platform.OS === 'ios'
? process.env.EXPO_PUBLIC_RC_IOS_KEY
: process.env.EXPO_PUBLIC_RC_ANDROID_KEY,
});To check subscription status:
const customerInfo = await Purchases.getCustomerInfo(); const isPro = customerInfo.entitlements.active['pro'] !== undefined;
That's the core pattern. No backend, no webhook, no PaymentIntent.
Payments pre-integrated in AI Mobile Launcher
Setting up Stripe or RevenueCat correctly in a production Expo app takes more than following the docs. You need platform-specific configuration, error handling, receipt validation logic, and a paywall UI that converts.
AI Mobile Launcher's Standard and AI Pro tiers ship with RevenueCat fully integrated, pre-built paywall screens, entitlement checking hooks, and RevenueCat dashboard setup guidance included. The monetization layer is production-ready before you write a single line of product code.
If your app requires Stripe for one-time payments or marketplace billing, the codebase is structured to add Stripe alongside RevenueCat, the .cursorrules and payment service architecture make it straightforward to extend without breaking the existing subscription flow.