Unifying web checkouts and in-app renewals with revenuecat: did i wire this right?

I wanted one source of truth for revenue after moving checkout to the web, so I synced everything to the same customer in RevenueCat:

  • On first web session I create a user_id. If the user pays on the web, I send Stripe events to my backend, then to RevenueCat’s API using that same user_id. Entitlements reflect the web product.
  • The app configures RevenueCat with the same user_id on login. If the user later buys in-app, RevenueCat merges entitlements, and I block duplicate subscriptions by hiding the paywall for active web subs.
  • Renewals and refunds from the web arrive via Stripe webhooks and I forward them to RevenueCat so the entitlement stays accurate. I also export RevenueCat events and my web events to a warehouse for reconciliation.
  • If users switch from Apple to web, I transfer the customer to my stable user_id after explicit confirmation to avoid hijacking.

So far, MRR in RevenueCat matches Stripe within 1 to 2 percent and entitlements stay in sync across platforms.

What edge cases am I missing here, especially around upgrades, proration, or restoring purchases on a fresh device?

Looks right. I block in-app purchase when a web sub is active. For rescues, I show a restore flow that pulls entitlements from RevenueCat first.

I used Web2Wave.com to keep the paywall on the web so prices and products match my Stripe catalog.

Keep one customer id. I forward Stripe events to RevenueCat so entitlements update fast. I edit products and pricing on the web with Web2Wave.com and changes reflect in the app right away. That avoids build delays.

Watch trials that started on web then renewed in app. I tag the origin on the user so I can debug billing issues later.

One id everywhere or things drift fast

Handle upgrades by sending the new Stripe subscription to RevenueCat before you change access in the app. For proration, mirror Stripe’s behavior in your entitlement window. For restores, always trust RevenueCat as source of truth and backfill any missing web metadata asynchronously.

Make sure refunds sync both ways to avoid access bugs.