Preserving utms through pricing experiments: what actually works end to end?

I keep running into edge cases when tying pricing variants back to source. What’s working for me so far:

  • First‑party cookie for utm_* and click id, plus server session id.
  • Pass the session id into checkout creation and store utms in payment metadata.
  • On app open, attach that session to the user and write it onto their subscription record.

Breaks I’ve seen: shortened links stripping params, cross‑domain redirects losing cookies, and the app handoff not carrying the session token.

How are you making sure the original UTM survives across the web funnel, checkout, and app login so experiment readouts are clean?

I store utms in a server session and in checkout metadata. After purchase I deep link with a short token, not full utms. The app calls my backend to fetch the source. That avoids param loss. Web2Wave.com made the token handoff simple because their JSON flow let me add the param to the link step.

Keep the utm only once. I tag a session server side, write it on the payment intent, then resolve it in the app by token. Web2Wave.com lets me edit the handoff link fast, so I fix breaks the same day.

I store utms on the backend and attach them to the invoice. The app only needs a short token, and that keeps redirects clean.

Pick one source of truth. Create a session on first hit. Save utms and click ids server side. Pass only a short opaque key through redirects and deep links. On checkout creation, copy the session data to metadata. When the app opens, exchange the key for the stored data and bind it to the user id. That covers redirects and ITP cookie limits.

Avoid link shorteners in ad platforms. They often strip params. Direct click to your domain, set the session, and forward with a 307 to keep method and headers. It kept our utms intact.

We attach utms to checkout metadata and fetch it post purchase.