One catalog
Products from App Store Connect and the Play Console map to one entitlement, so your backend never branches by platform.
Payments
Your Lovable or Bolt app already has a Stripe checkout. Inside the App Store and Google Play, some of those purchases must switch to in-app purchase and some may stay exactly as they are. The rule is simpler than it looks once you ask the right question: what is the user actually buying?
From $109 one-time per platform, or let our team do it all from $698.
Apple Guideline 3.1.1 and Google's Payments policy say the same thing in different words: if the user buys something that is used inside the app (features, subscriptions, credits, premium content), the purchase must go through the store's billing system. If the user buys something that is used outside the app (a physical product, a haircut, a cleaning, a delivered meal), the store billing system must not be used, and Stripe is the right tool.
Apple adds a few named exceptions in 3.1.3: multiplatform services may let users access content they bought on your website, as long as the same items are also sold in the app via IAP; real-time person-to-person services (tutoring, consultations) may use other payment methods; reader apps have their own rules. Google exempts physical goods and services and a few special cases such as donations and peer-to-peer payments. Everything digital that is consumed in the app falls under Play Billing.
| You sell… | In the iOS app | In the Android app | On your website |
|---|---|---|---|
| A subscription to app features (SaaS plan, premium tier) | IAP required (3.1.1, 3.1.2) | Play Billing required | Stripe, as before |
| AI credits, tokens, generations | IAP (consumable) | Play Billing (consumable) | Stripe |
| Courses, templates, downloads used in the app | IAP | Play Billing | Stripe |
| Physical products (shop) | Stripe required; IAP not allowed | Stripe; Play Billing not allowed | Stripe |
| Services consumed in person (bookings, cleaning, repairs) | Stripe | Stripe | Stripe |
| Live one-to-one services (tutoring call, consultation) | Stripe allowed under 3.1.3(d); IAP optional | Generally outside Play Billing; check the policy for your niche | Stripe |
| Donations to a registered nonprofit | Other methods allowed for approved nonprofits | Exempt in many cases; check the policy | Stripe |
The same web app serves both channels; only the checkout button changes.
In Config.swift set useragent_iphone and useragent_ipad, in Config.java USER_AGENT, to a string that contains a unique token, for example the default user agent followed by WebViewGoldApp/1.0. Leave the Google login helper in place; it keeps its own accepted user agent for the OAuth step.
const inApp = navigator.userAgent.includes("WebViewGoldApp"). Render the IAP button in the app and the Stripe button on the web. Do not hide the price; show the store price.
In the app, the button navigates to revenuecat://purchase?external_id=USER_ID&product=PRODUCT_ID (or revenuecat://launchPaywall?external_id=USER_ID&offering=OFFERING for a RevenueCat paywall). WebViewGold opens the native purchase sheet.
Stripe webhooks and RevenueCat webhooks write the same subscriptions table. The web app only asks "is this user active?" and never cares which store paid.
Outside the regional exceptions, the app must not tell users to buy on the website, show web prices or link to the Stripe checkout. Existing web subscribers simply log in and are active, which 3.1.3(b) allows as long as IAP is offered too.

With a good optimized version of your web app you can have a stunning mobile app within a couple of minutes. Additionally to that the customer service is very nice and very helpful! I can just recommend WebViewGold :-)
A minimal version. In production, read the product IDs from your backend so they stay in sync with both stores.
const inApp = /WebViewGoldApp/.test(navigator.userAgent);
function subscribe(userId) {
if (inApp) {
// Native purchase sheet via WebViewGold + RevenueCat (iOS and Android)
window.location.href = "revenuecat://purchase?external_id=" + encodeURIComponent(userId) + "&product=premium_monthly";
} else {
// Web: your existing Stripe Checkout session
window.location.href = "/api/stripe/checkout?plan=premium_monthly";
}
}
// After the native sheet closes, poll your backend until the webhook has arrived
async function waitForEntitlement(userId, tries = 10) {
for (let i = 0; i < tries; i++) {
const r = await fetch("/api/me/subscription").then(x => x.json());
if (r.active) return true;
await new Promise(res => setTimeout(res, 1000));
}
return false;
}cancelinapppurchase:// for store subscriptions (it opens the system subscription screen).Products from App Store Connect and the Play Console map to one entitlement, so your backend never branches by platform.
Two keys in Config.swift and Config.java, then revenuecat:// links from the web app. No native code. In-app purchases require the WebViewGold Extended License.
Initial purchase, renewal, cancellation, billing issue and expiration events reach your Supabase edge function or Cloud Function. The RevenueCat setup guide walks through it.
Telling them is the problem: that counts as steering under 3.1.1 outside the regional exceptions. A login-only app without any purchase path is sometimes accepted, but reviewers tend to ask how a new user becomes a paying user. Offering IAP is the reliable answer.
Yes, for physical goods and services consumed outside the app. Apple does not allow IAP for those at all.
No. The commission applies only to purchases made through Apple or Google billing.
Digital tips and in-app coaching content are IAP. Real-time one-to-one sessions between two people may use other payment methods on iOS under 3.1.3(d). Document which case you are in the review notes.
Yes, the Extended License. Everything else in this guide works with the standard license.
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main page$349 per license, one-time add-on
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
How the Cloud Builder works Try the free demo$698 per platform $798
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.
Full Service details Powered byWinter Sale prices valid until December 31, 2026.
App Store & Google Play approval guarantee – or your money back within 14 days
Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.
Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.