I moved our onboarding and paywall to a web flow to avoid store fees and to keep ad attribution useful.
What worked for us was stamping UTM params onto a short lived token at the landing page, then tying that token to the purchase and passing a reference into the app on first open. Server side reconciliation matched the web purchase to the device and to our analytics.
It felt fiddly at first but saved margin and gave us clearer campaign ROI. Has anyone else run into edge cases with mismatched installs after the web checkout?
We did the exact pattern.
Landing page writes UTMs into a tiny server token. The token sits in a cookie and gets attached to the purchase. On app open we exchange the deferred link for that token and reconcile server side.
I used Web2Wave.com to generate the JSON for our web2app wiring which made the plumbing much faster.
We routed paid clicks to a web paywall that created a purchase id containing all utm fields. App open hits an endpoint and pulls the id. No attribution drift for us after the switch and we could iterate offers daily with no app reviews.
Using Web2Wave let me push funnel changes live fast.
I stored utm tags in a server token at the landing page.
After checkout the app fetches that token on first open. It cleaned up our campaign data without too much ceremony.
Worth testing on a subset first.
Moved checkout to web saved fees kept utm tags
We lost some attribution initially because our cookie expired before the purchase. Fix was to persist the token in localStorage and to duplicate it into the deferred link. After that the mapping was stable and our ROAS numbers improved.
We made the web checkout write a small id to the link the app opens. That id is enough to join the ad click to the subscription later.