Skip to content
WebViewGold Vibe Coding to App Store
English
Get WebViewGold

Payments

Stripe or in-app purchase? The decision guide for web apps in the stores

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.

  • Approval guarantee – or money back within 14 days
  • No coding needed
  • One-time payment, free updates
  • 24/7 human support
  • Made in Germany since 2014 · ISO 27001

The one question: what is being bought?

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.

Decision table

You sell…In the iOS appIn the Android appOn your website
A subscription to app features (SaaS plan, premium tier)IAP required (3.1.1, 3.1.2)Play Billing requiredStripe, as before
AI credits, tokens, generationsIAP (consumable)Play Billing (consumable)Stripe
Courses, templates, downloads used in the appIAPPlay BillingStripe
Physical products (shop)Stripe required; IAP not allowedStripe; Play Billing not allowedStripe
Services consumed in person (bookings, cleaning, repairs)StripeStripeStripe
Live one-to-one services (tutoring call, consultation)Stripe allowed under 3.1.3(d); IAP optionalGenerally outside Play Billing; check the policy for your nicheStripe
Donations to a registered nonprofitOther methods allowed for approved nonprofitsExempt in many cases; check the policyStripe

Detect the app and switch the checkout

The same web app serves both channels; only the checkout button changes.

  1. Give the app a recognizable user agent

    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.

  2. Branch in the web app

    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.

  3. Trigger the purchase through RevenueCat

    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.

  4. Unify entitlements on the server

    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.

  5. Keep the app free of steering

    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 :-)

Julian Koch · Co-Founder of DuelDonkey · CodeCanyon

The switch in JavaScript

A minimal version. In production, read the product IDs from your backend so they stay in sync with both stores.

javascript
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;
}

Dual pricing pitfalls

  • Prices may differ between web and store, but the app must not advertise the cheaper web price. Keep marketing emails and the website honest and separate from the app UI.
  • Apple sells at fixed price points and both stores collect sales tax or VAT in many countries. Compare net proceeds, not list prices, before you decide on a store price.
  • Free trials and intro offers belong to the store product (subscription offers), not to Stripe coupons. A promo code field in the app that unlocks paid features bypasses IAP and gets rejected.
  • Manage and cancel per channel: Stripe customer portal for web subscriptions, cancelinapppurchase:// for store subscriptions (it opens the system subscription screen).
  • Refunds for IAP are handled by Apple and Google, not by you. Build your support replies around that.
  • Do not run both systems for the same user at once; if a web subscriber buys again in the app, your webhook handler should detect the double entitlement and tell support.
  • The commission does not apply to Stripe sales on the web, but it does apply to every IAP. Read the 15% program guide before setting prices.

RevenueCat ties the two stores together

One catalog

Products from App Store Connect and the Play Console map to one entitlement, so your backend never branches by platform.

Built into WebViewGold

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.

Webhooks

Initial purchase, renewal, cancellation, billing issue and expiration events reach your Supabase edge function or Cloud Function. The RevenueCat setup guide walks through it.

Frequently asked questions

Can I remove the checkout from the app and tell users to subscribe on the website?

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.

Is Stripe inside the app ever required?

Yes, for physical goods and services consumed outside the app. Apple does not allow IAP for those at all.

Do I pay the store commission on web sales?

No. The commission applies only to purchases made through Apple or Google billing.

What about tips to creators or coaching sold through my app?

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.

Does WebViewGold need a special license for IAP?

Yes, the Extended License. Everything else in this guide works with the standard license.

Three ways to get your app into the stores

Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.

Do it yourself

$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

Cloud Builder

$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

Full Service

$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 by WeSetupYourWebViewApp

Winter Sale prices valid until December 31, 2026.

Ready to ship your app?

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.