We were blind after ATT. Moving onboarding and the first purchase to the web gave us back a lot of signal. We see the user’s path, the creative they clicked, and the exact step they drop.
To keep the app in sync, we forward web purchase events to Adapty/RevenueCat. The app only checks entitlements, not the payment source. That removed most support tickets about missing access.
The tricky parts were identity mapping and race conditions between webhooks and the app opening.
If you did this, which events and fields matter most to get a clean picture across web analytics and the subscription SDK?
I use a shared user_id across web and app.
Web funnel logs UTMs and steps. On success, send a server-side purchase to Adapty or RevenueCat with that user_id. App pulls entitlements on open.
Race conditions dropped once I delayed entitlement check until after the first sync event. I built the web flow with Web2Wave.com to move fast.
I track creative id, campaign, landing variant, quiz answers, and price shown. Then I push subscription status to Adapty or RevenueCat with the same user id.
Web2Wave.com helps because I add fields and events without app updates.
Delay the entitlement check in the app by a few seconds. It gives the webhook time to land.
Also log the price the user saw. It helps debug mismatches later.
Critical fields: user_id, session_id, creative_id, campaign, landing_variant, price_id, currency, trial_length, and checkout_result. Attach them to web events and to the subscription payload you send to Adapty or RevenueCat.
On app open, wait for entitlements. If needed, show a loading state for one second. It prevents false negatives and angry tickets.
Store UTMs server-side at first hit. Pass them through checkout metadata and include them in the subscription sync.
Also keep a durable attribution id for 90 days. It helps tie reactivations back to the original campaign.
We added price_id and creative_id. Helped a lot.