How do you add subscriptions to a vibe-coded app?
You built a Pro plan in an afternoon. Your builder added a Stripe checkout, and the web version takes payments. Then you look at the native app and realize none of that carries over, because digital subscriptions run on the stores' billing. Here is the order that works:
- Get a native build. Store billing needs native code, and Expo's docs say it can't run in Expo Go.
- Sign Apple's Paid Apps Agreement and set up a Google payments profile.
- Create the products in App Store Connect and in Play Console.
- Connect them to the app with RevenueCat or another library.
- Build the paywall and the restore button.
- Test, then submit the first subscription with a new app version.
If you sell something used in the real world, such as classes or physical goods, stop here. That stays on your own checkout. Our guide to Stripe or in-app purchase has the full split.
Why does a Stripe web paywall fail review?
Because Apple names subscriptions as something that must use in-app purchase, and Google names subscription services as something that must use Play billing. Moving the Stripe page into a webview doesn't change that. Google's policy names in-app webviews, buttons and links as ways of leading users to another payment method, and says apps may not do that outside its listed exceptions.
There are real exceptions. On the US storefront Apple doesn't require an entitlement for buttons and external links. Google has US programs you enroll in, and other markets have their own terms. But a link out is not a free pass: you take on support and refunds, and Google still charges a service fee.
You can keep selling on the web. Apple lets people use what they bought on your site, as long as those items are also available as in-app purchases in the app (3.1.3(b)), and you can contact your users outside the app about other ways to pay (3.1.3). RevenueCat's Stripe Billing integration can unlock entitlements on mobile for web purchases, so the two can share one record of who has access. A website paywall inside a wrapped app has a second problem: wrappers can end in a Guideline 4.2 rejection.
How do you set up a subscription in App Store Connect?
You create a subscription group, then a subscription inside it. The Account Holder must sign the Paid Apps Agreement first, and Apple says you can't create a new In-App Purchase until the latest version is agreed.
- Under Monetization in the sidebar, click Subscriptions and create a group with a reference name.
- Add a subscription with a reference name and a Product ID. RevenueCat's docs warn that a Product ID can't be reused across your apps, even if the product is deleted.
- Choose a duration: 1 week, 1 month, 2 months, 3 months, 6 months or 1 year.
- Set the price and the countries or regions it's sold in.
- Add a display name and description, plus review information. RevenueCat's docs say a screenshot of your paywall is needed before you can submit it.
- Select Add for Review on the subscription page.
Apple says one group is the best practice for most apps, since people can only buy one subscription in a group at a time. Your first auto-renewable subscription must be submitted with a new app version, so don't add it after you've already sent the build.
How do you set up a subscription in Play Console?
Google splits it into three layers, set up in order: subscriptions, base plans and offers. RevenueCat's docs add that you need an APK uploaded before you can create in-app products, and they point to a closed testing track for that. On a new personal account, that overlaps with the 12-tester requirement.
- Set up a payments profile if you don't have one.
- Go to Monetize with Play, then Products, then Subscriptions, and click Create subscription.
- Enter a product ID and a name of up to 55 characters. Don't put a label like "Free Trial" in the name.
- Add a base plan: auto-renewing, prepaid or installments. Installments are only offered in Brazil, France, Italy and Spain.
- Set availability and prices, save, and activate. Without an active base plan, the subscription isn't available to users.
- Add offers if you want them. A free trial must be between 3 days and 3 years.
Do you need RevenueCat, and what does it cost?
You don't need it, but it saves writing purchase code for two stores and tracking who has access yourself. RevenueCat's pricing page says you pay nothing up to $2,500 in monthly tracked revenue, then 1% of what you track. Its page also lists Growth Tools, covering paywalls, web-to-app funnels and A/B/n tests, at 1% of tracked revenue. Check with RevenueCat how that combines with the main 1%. Enterprise is custom. Apple's and Google's own fees still apply on top.
- Recommended
RevenueCat
An SDK and dashboard over StoreKit and Google Play Billing. You change what's on the paywall from the dashboard without an app update.
- In the stores
- App Store and Google Play
- Watch out for
- Free up to $2,500 in monthly tracked revenue, then 1%. Check its pricing page before you commit.
expo-iap
A library Expo's docs list that follows the OpenIAP specification and works with development builds.
- In the stores
- App Store and Google Play
- Watch out for
- Expo's docs describe a library, so plan how you'll track who has access.
In Expo, RevenueCat's docs ask for Expo SDK 54 or later. The steps from its docs:
- Install the SDKs: npx expo install react-native-purchases react-native-purchases-ui, then npx expo install expo-dev-client.
- Create a development build with EAS. In Expo Go, RevenueCat runs in a Preview API Mode where real purchases do not work.
- Connect the stores in the dashboard: Bundle ID, Shared Secret and In-App Purchase Key for Apple, package name and Service Credentials for Google.
- Create an entitlement for the access you sell, such as pro, and attach your products. Google Play products map to base plans.
- Create an offering, the set of products shown on your paywall.
- Check access with getCustomerInfo and unlock the feature if the entitlement is active.
What does Apple require on a subscription screen?
Apple lists it on its subscriptions page. These must be on the sign-up screen, and your app and App Store metadata must also link to your Terms of Use and Privacy Policy:
- Subscription name and duration, and the content or services provided during the subscription period.
- Full renewal price, shown clearly and prominently, and localized in available currencies.
- A way for current subscribers to sign in or restore purchases.
Guideline 3.1.2 adds more. A subscription must provide ongoing value, last at least seven days and work on all of the user's devices (3.1.2(a)). People should not be able to subscribe to several variations of the same thing by accident (3.1.2(b)). And you need to describe what the user gets before asking them to subscribe (3.1.2(c)). For a free trial, Apple says to show how long it lasts and the price billed afterwards, and the amount billed must be the most prominent price in the purchase flow.
For restore, call RevenueCat's restorePurchases from a button. Its docs say to call it only from a user action, since it can trigger a sign-in prompt. Apple also says to make it easy to reach the system page where people can cancel.
Google Play has its own rules. Its subscriptions policy asks you to disclose the offer terms, cost and billing frequency, explain how to manage or cancel, and say how and when a free trial converts to paid. Android's billing docs also say all developers must support the Play Store's restore option, which lets someone restore a canceled subscription before it expires. Your app needs to detect that change in subscription state.
How do you test it, and can you do this yourself?
Start with RevenueCat's Test Store, which works without any store setup, then test against the real stores. Test Store subscriptions renew on a fast schedule, up to 5 times. RevenueCat warns never to submit an app configured with a Test Store API key. Release builds crash on purpose with that key, including TestFlight and Google Play testing tracks, so swap to the platform keys before any of those builds. Its docs also say you can't test Apple purchases until the latest Paid Applications Agreement is signed.
Yes, you can do all of this yourself if you already have a native Expo project. RevenueCat's docs are clear, and the dashboard work is mostly form filling. The hard part for most vibe-coded apps comes earlier: there's no native app to put the SDK into. Once you have one, a one-plan paywall with restore is a contained job. Our launch checklist covers what else review asks for.
We take your AI-built app the last mile.
We rebuild your web app as a native React Native and Expo app. On our Launch plans we also move paid digital features to Apple's and Google's in-app purchase and do the store work. You can preview the native version on your phone for free first.