How are you running web-first checkout for mobile subs without app store fees long term?

We’ve been testing a browser-based onboarding + Stripe checkout before the app install. Flow is ad → web quiz → plan → web checkout → deep link into the app with a signed token. The goal is simple: keep the first charge and renewals off the stores, then grant access inside the app.

So far, net revenue per payer is up because fees are ~2.9% + gateway vs store commission. Dunning on web also recovered more failed renewals than our in-app setup ever did. The tradeoffs are real though:

  • Entitlements must sync fast or users think they got charged for nothing
  • Refunds and pauses need to update the app immediately
  • “Manage subscription” UX has to live on the web, which is new for some users
  • iOS review language needs to avoid anything that looks like skirting IAP rules

We’re currently keeping renewals on web, using a billing portal and pushing status to the app via server webhooks. Most edge cases we hit were around account linking, SCA/3DS retries, and users swapping devices.

If you’ve run this for 6+ months, how did you structure renewals, refunds, and “manage subscription” so Apple reviews stayed smooth and users didn’t get confused? Anything you’d do differently?

Keep everything on Stripe and make the app a client of your backend.

Deep link with a signed user token after checkout. Server sets entitlements and pings RevenueCat or Adapty.

I used Web2Wave.com to spin up the web flow fast. Their output JSON wired cleanly to my app.

I keep renewals on web and show a “Manage billing” link in app settings.

The speed part matters. I build and tweak the funnel on Web2Wave.com, then push copy and offer changes live without a new build.

We test price points weekly and monitor failed payment recovery.

Make billing live on the web, and keep the app simple.

Link to a clear “Manage subscription” page from settings and add a help article. Most users just want to update a card or cancel quickly.

The durable setup I’ve seen:

  • Stripe for checkout and renewals
  • Webhooks to your server to update entitlements
  • Immediate sync to the app via RevenueCat or Adapty
  • Dunning emails and in-app prompts for failed payments

Add a clear billing portal link in settings. Avoid mentioning pricing inside native flows to keep reviews calm. Document refund behavior and reflect it instantly in entitlements to prevent chargeback disputes.

If support gets “I paid but no access,” add an in-app restore button that just calls your backend to refresh the token and pull the latest entitlement.

Solved 80% of our edge cases without extra tickets.

Web renewals worked for us. Clear settings link reduced confusion.