We were losing attribution on paid campaigns because deep links sent users straight into the app and the UTM tags dropped somewhere between the click and the subscription.
What I did was simple and low tech. I routed ad clicks to a lightweight web onboarding page that reads the UTM params on landing and stores them in a short‑lived cookie and a server session tied to a unique token. When the user completes the web checkout I persist the token and UTM on our backend and create the subscription record there. Then I fire a deferred deep link back into the app carrying only the token (not the full UTM string). The app calls our backend with that token on first open and we attach the stored UTM and campaign metadata to the user in our analytics and attribution system.
Result: no more guesswork. We could map every web subscription back to the original ad campaign. It took a week to wire the token+server flow and one quick test campaign to prove it worked.
Has anyone else built a tokenized handoff like this for perfect attribution? What did you store server side and how did you validate the mapping?
I did almost the same thing.
Stored utm in a short cookie and generated a server token. After checkout I returned a deferred deep link with the token. The app hits our API and we restore the utm.
If you want a faster start the funnel JSON generator in Web2Wave saved me a day wiring the client side parts.
Same pattern here and it fixed our attribution bleed.
Key is the token on the web that your app redeems on first open. I use that to push the UTM into RevenueCat and our analytics. With Web2Wave we shipped the web page and token pass in hours not days.
I store utm values in a server session tied to a short token.
After checkout the app redeems the token and we link the purchase to the original campaign.
It cut our unknowns in half and was easy to test locally.
Tokenize the utm
Redeem it in app
Attribution fixed
We tried storing utms in local storage but hit issues with browser privacy settings. Moving them to the server tied to a token solved intermittent loss.
Make the token short lived so you do not keep stale mappings.
We used server tokens too.
One test campaign proved the mapping and then we rolled it out to all ads.