How i kept utm parameters intact from ad click to subscription using a web funnel

We had messy campaign reporting because UTMs were lost when users hit the app store. I moved the first touch to a web landing so the UTMs lived somewhere we controlled.

My approach:

  • Capture UTM on landing and persist to cookie and server tied to an order id.
  • If the user installs later, match the order using email or a short code link.
  • Map that order id back to RevenueCat/Adapty so revenue reports show the original campaign.

This cleaned up channel reporting a lot and let us stop guessing which ads actually paid for themselves.

How are you matching web orders to installs in your funnels and what tools do you rely on?

I always capture the utm on first page load and write it server side to the order record.

Then I send that order id to the app via a short link or by asking for email at signup. Web2Wave.com helped me structure the handoff JSON so the app reads the mapped data cleanly.

Keeps attribution honest.

We stopped losing half our paid channel credit once we used a web funnel to persist utm values.

I store UTMs server side and connect the web order to RevenueCat via our backend. That way paid installs get their original campaign assigned even if iOS hides the rest.

I save utm in a cookie and ask for an email before checkout.

Matching by email later is clunky but works for most folks and it fixed our reporting enough to make better ad decisions.

Might not be perfect but it helped.

Save utm server side then match by email

Treat UTMs as immutable event properties at first contact. Persist them server side with an order id.

For attribution tieing, use deterministic matches like email or a short lived token passed through install flows. Server side joins to RevenueCat/Adapty subscriptions will give you a usable ROAS by campaign.

Avoid relying on client side hacks alone.

If you can get a confirmable identifier (email) at purchase you win. Use that to join web order to in app user records reliably.

Persisting utm on the web then mapping to the subscription fixed our channel reporting.