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 via the built-in Stripe integration |
| Physical goods, deliveries, tickets, bookings, services performed outside the app | Your web checkout is fine | Your web checkout is fine | Stripe via the built-in Stripe integration |
| Reader-type content purchased elsewhere | May be consumed without IAP, with no purchase links in the app | Allowed with restrictions | Stripe via the built-in Stripe integration |
Set up in-app purchases for a Bolt 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 Bolt 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 Supabase, Firebase or your own API as external_id.Unlock features in your backend
Point a RevenueCat webhook at Supabase, Firebase or your own API 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 via the built-in Stripe integration 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 via the built-in Stripe integration for my Bolt 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 Supabase, Firebase or your own API 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.