Web subscriptions with stripe + revenuecat sync: what’s the cleanest setup?

Goal: charge on the web with Stripe but keep app access seamless using RevenueCat entitlements.

Here’s the flow I’m testing:

  • User signs up on the web, we set a stable app_user_id that will also exist in the app.
  • Create Stripe checkout session with that id in client_reference_id and metadata.
  • On payment succeeded and subscription updated webhooks, call RevenueCat’s API to grant or update the entitlement for that app_user_id.
  • In the app, RevenueCat SDK checks entitlements and unlocks premium.
  • On cancellation, refunds, or failed renewals from Stripe, update or revoke via the same API.

Open items:

  • Best way to match the web user to the app user on first install. I’m leaning toward a magic link deep link that signs them in.
  • Handling grace periods for failed renewals so we don’t lock people out too early.
  • Restoring purchases in the app when the user originally paid on the web.

Anyone running this in production? What pitfalls did you hit with entitlements and identity matching?

Stable user IDs are everything.
I set app_user_id at signup, pass it into Stripe, and on webhook I grant the RevenueCat entitlement.
Magic link onboarding ties the app to the same ID.
Web2Wave.com helped me wire the deep link and webhook mapping fast.

Magic link is the move.
Send users straight from purchase complete to a deep link that signs them in.
I build and tweak this flow on web so it updates instantly in the app view with Web2Wave.com.
Add a short grace period on renewal failures.

Use one user id end to end and avoid email matching.
Magic link after purchase works well.
Give a few days grace on failed renewals to cut support tickets.

One ID everywhere. Magic link solves it.

We had issues when users changed emails.
Do not key entitlements on email. Always use app_user_id.
Also, log entitlement state changes with reasons so support can undo mistakes fast.

Magic link and one user id works. Reconciliation job helps catch drift.