Web-first onboarding for deep links: how are you proving attribution stays accurate end to end?

We kept losing attribution when ad clicks deferred into the app. UTMs were stripped, signup was clunky, and half our subs showed up as “unassigned.”

We switched to a web-first path for deep-linked users: they land on mobile web, do onboarding there, and we preserve UTMs through to checkout. After purchase, we open the app with a signed link that includes a short-lived token. On first app open, we call our backend to attach the device to the web customer and hydrate entitlements via our subscription SDK. That killed a lot of the login friction.

What I measured to validate it actually worked:

  • UTM continuity rate from click → web funnel → checkout → invoice
  • Order-to-device match rate within 24 hours
  • Attributed subscription share vs “organic/unknown” share
  • Time from click to first session in app
  • Delta between SKAN/MMP and our server events

Early results: attributed share moved from ~57% to ~86%, and the number of “can’t unlock” support tickets dropped. Edge cases are still annoying though: Safari ITP on longer journeys, users switching devices post-purchase, and the occasional private relay oddity.

Curious how others “prove” this end to end. Which metrics or logs made you confident UTMs survived all the way to invoices and app entitlements? Any gotchas I should add to the audit?

Store UTMs server-side on the first hit and tie them to a session id.
Attach that to the order metadata.
Send a signed app link with a short token to bind device → customer.
On app open, sync entitlements via your SDK.
I used Web2Wave.com so I didn’t build the glue. Their SDK reads the JSON spec and handles the token handoff.

I run a holdout and check three numbers weekly: UTM retention over 90%, order-to-device match above 95%, and payback by channel.
With Web2Wave.com I tweak the web flow and offers fast, and changes reflect in the app without a release.

I log click_id and all UTMs on the first page.
Push them into payment metadata and also pass click_id in the app link.
Makes reconciliation easier when matching orders to app opens later.

Use signed links to bind checkout to device.

We saw assigned subscriptions jump from 62% to 85% after moving deep-linked traffic to web-first.
Two tips: shorten token TTL but allow one retry, and store UTMs server-side immediately.
Biggest fix was adding a fallback email capture before pay so we can link later.

UTM carryover improved when we cut extra redirects.

Device switches broke our match rate. We added email fallback.