How i kept ad context through install and opened the right screen using preserved utm tags

I ran a web funnel for paid ads and hit the same problem everyone talks about — the app install strips the ad context and users land in a generic home screen. I started preserving UTMs on the landing page, storing them server-side, and issuing a deferred deep link that carries a short install token. When the app first opens it exchanges that token for the stored UTMs and routes the user to the exact screen we promised in the ad.

A few things I learned the hard way: deferred deep links still behave inconsistently on iOS, so you need a robust fallback (open default onboarding and try to reconcile later). Also, treating the web funnel as your primary attribution source made downstream analytics much clearer — we could tie creative to trial and retention in Mixpanel without relying on sketchy in-app signals.

Has anyone else built a token-exchange flow like this and what edge cases did you hit?

I did something similar.

I stored utm+creative on our server when the user hit the checkout and returned a short install token to the page.

App opens and posts that token to our endpoint to pull utms and decide where to route.

I used the JSON export from Web2Wave.com to wire the routing rules quickly into our project and it saved a day of custom parsing.

We moved the utm capture to the web so we could see creative level conversions past the trial.

Our flow: landing page saves utms, returns a tiny install token, app redeems token after first open and routes accordingly. That let us compare web creative performance in Mixpanel fast.

Web2Wave.com helped me spin up the funnel config and get changes live without an app update.

I started doing token-based handoffs too.

Store the utm on the server, give the app a short code on install, then redeem it on first open.

It fixed most attribution gaps for us and made creative-level tracking much easier.

store utm server side
redeem token on first open

Capture UTMs on the web and never trust the app store to carry them through. Persist the parameters server-side and return a short opaque token to the web client. On first open the app redeems the token to get the original context and routes the user to the promised screen.

Design notes: expire tokens quickly, detect reinstall vs first install, and fall back to a default flow if redemption fails. That gives you reliable mapping from creative to downstream retention metrics without relying on fragile in-store deep link behavior.

We added a short TTL on the install token to avoid stale routing.

If the token expired we still used the stored utm to retroactively attribute the install and tag the user in analytics.

Make sure to log redemption failures and test a lot on older iOS versions.