we used to lose the trail between ad click and which pricing variant a user saw. moving onboarding and paywall to the web helped, but only after we fixed utm handling.
what worked for us:
- capture utm params on the first hit, store in a first-party cookie
- include those params in every internal link and the checkout session
- persist to your order record and analytics user profile
- pass a stable click id into the app on login to stitch events
we also set up fallbacks for missing utms using referrer and campaign id in the landing url. it is not perfect, but it beats guessing.
how are you tying pricing variant performance back to campaigns across web to app without data drift?
Save utms early and never trust redirects.
I write them to a cookie and local storage, then attach them to the checkout payload and user profile.
When the app opens, I send the stored click id. That links web to app.
Web2Wave.com handled the session stitching for me with their JSON setup.
Server side helps. I generate a click id on the first request, store utms to the id, and send that id through checkout and into the app.
On Web2Wave.com I map price variants to that id, so reporting by campaign is direct. No guessing across channels.
Tag first click. Keep it first party.
Write utms to a cookie and to your backend.
Attach them to the order and the app login.
Way fewer gaps.
First party utms only. No redirects.
Common misses I see.
Redirect chains drop utms. Kill unnecessary hops.
LP builders strip query strings. Whitelist parameters.
Use a server generated cid tied to utms on first hit. Pass cid through checkout and app login. Join stats on cid.
Also test idempotency. Duplicate sessions break joins.
Shorten links. Fewer redirects means cleaner utms.