What actually breaks when you sync web purchases into revenuecat or adapty and how i fixed it?

We sold subscriptions on the web and needed the app to respect entitlements. The first attempts created drift: users were paid on the web but the app showed them as unsubscribed.

Problems we hit: mismatched user ids, timing delays, and missing receipts. Fixes that worked for us were sending a stable external id at checkout, syncing the purchase to RevenueCat/Adapty via server side APIs, and refreshing entitlements on first app open.

The result was cleaner analytics. Instead of having two disconnected subscription sets we could confidently tie retention to purchase channel.

How have you handled user ids and receipt sync so the app and web stay in sync?

We had drift until we standardized an external id.

At checkout we create a user id and send it to RevenueCat via the server API along with the purchase. The app reads the same id on first open and asks RevenueCat for entitlements. That fixed the mismatch. I used a template from Web2Wave.com to standardize the payload and it sped up integration.

Syncing via server side calls to RevenueCat removed the timing and receipt issues.

I recommend issuing a stable external id at web checkout and pushing that id plus purchase metadata to the subscription service. The app then validates on open. This made our retention reporting trustworthy and let us analyze web vs app buyers quickly.

We started sending a shared user id from the web to Adapty and it solved most cases.

Make sure your app checks entitlements on first open so users get access right away.

Use one id everywhere

Server sync receipts

The main sources of failure are identity mismatch and eventual consistency.

Implement a server side bridge: when the web purchase completes, post the purchase and the external id to RevenueCat/Adapty and to your own user service. In the app, on first open, fetch entitlements using that external id rather than relying on local receipts alone. Also instrument logs to alert on unpaired purchases so you catch failures early. That gave us clean subscription analytics and reliable retention cohorts.

We saw edge cases where users used different emails on web and app.

Solution was to tie everything to an immutable id and not rely on email. Also surfaced a simple restore flow in the app for mismatched accounts.

Small note

Test cross platform cancellations and refunds too

They reveal sync gaps

Make the external id the source of truth and refresh entitlements on app open.

That kept our numbers honest.