Which payment method is allowed where
| What you sell | In the iOS app | In the Android app | On the web |
|---|---|---|---|
| Subscriptions, credits, premium features, digital content | In-App Purchase (RevenueCat) | Google Play Billing (RevenueCat) | Stripe |
| Physical goods, deliveries, tickets, bookings, services performed outside the app | Your web checkout is fine | Your web checkout is fine | Stripe |
| Reader-type content purchased elsewhere | May be consumed without IAP, with no purchase links in the app | Allowed with restrictions | Stripe |
Set up in-app purchases for a v0 app
RevenueCat is free up to a monthly revenue threshold and syncs both stores.
Create the products in App Store Connect and the Play Console
Define your subscription or one-time product with identical identifiers on both stores (for example pro_monthly). Apple requires a paid-apps agreement signed by the account holder.
Connect both stores to RevenueCat
Create a RevenueCat project, add the iOS and Android apps, paste the store credentials and define an Offering with your products. Optionally design a native paywall in the RevenueCat dashboard.
Enable RevenueCat in WebViewGold
Paste the RevenueCat API key and project ID into Config.swift and Config.java (or the Cloud Builder). Done on the native side.
Trigger purchases from your v0 app
Navigate to
revenuecat://purchase?external_id=USER_ID&product=pro_monthlyfrom your upgrade button, or show the native paywall withrevenuecat://launchPaywall?external_id=USER_ID. Use the user ID from Next.js route handlers and server actions, Postgres via Neon or Supabase as external_id.Unlock features in your backend
Point a RevenueCat webhook at Next.js route handlers and server actions, Postgres via Neon or Supabase and set the user's plan when a purchase or renewal event arrives. Your web app then shows the premium features exactly as it does for Stripe customers.
Hide the web checkout inside the app
Detect the app via the custom user agent WebViewGold sends and show the IAP button instead of the web checkout. Apple rejects apps that link out to external payment pages for digital goods.
Rules to respect
- Apple Guideline 3.1.1: digital goods and services unlocked in the app must be sold via In-App Purchase. Do not show "cheaper on our website" hints or external checkout links inside the iOS app.
- Google Play Billing policy: the same applies to Android with a few exceptions and regional user-choice programs.
- Subscriptions must be restorable: WebViewGold handles the native restore flow via RevenueCat; show a "Restore purchases" link in your settings.
- In-app purchase support in WebViewGold requires the Extended License (see license upgrade).
- Apple's Small Business Program and Google's 15% tier reduce the store fee for the first $1 million in annual revenue; RevenueCat supports both.
Frequently asked questions
Can I keep Stripe for my v0 web app?
Yes. The web stays as it is. Only purchases made inside the iOS and Android apps go through the stores. Many apps run both: Stripe on the web, IAP in the apps, with one plan field in the database.
Does Apple take 30 percent?
Apple and Google take 15 percent for most small developers (under $1 million per year through the Small Business Program / 15 percent tier) and 30 percent above that. The price difference is usually worth the reach of the stores.
Can I sell credits for AI features through IAP?
Yes. Consumable in-app purchases are made for credits. Define the consumable in both stores, map it in RevenueCat and add the credits in Next.js route handlers and server actions, Postgres via Neon or Supabase on the webhook event.
Do I need the native paywall?
No. You can keep your own pricing page inside the web app and just call revenuecat://purchase from the buy button. The native RevenueCat paywall is optional and can be A/B tested from the dashboard.