What worked for me when preserving utm tags through web onboarding?

I moved our onboarding to a web funnel specifically to stop losing attribution between ad click and eventual subscription.

What I learned from running it: web behaviour and app behaviour diverge a lot, so I separated web vs iOS experiments. Preserving UTMs on the landing page and passing them into the account creation step let us tie downstream events in Mixpanel back to creatives and campaigns.

That gave us visibility past trial conversion — we could see which ads actually led to renewal revenue instead of just installs. It also made creative-level testing simpler because the web funnel didn’t hit ATT delays or SKAN thresholds.

Has anyone mapped a trusted id from web to app and then reconciled those UTMs to RevenueCat renewals? How did you handle late conversions or users who cleared data between sessions?

I pushed UTMs into a hidden field on signup and stored them with the account. Then I matched that account server-side to the device install using an email link. Saved hours of spreadsheet cleanups.

I used the Web2Wave JSON flow once to prototype the pages. It gave me a solid starting point and I dropped the output into our project settings.

We appended UTMs to the deep link and saved them to the user record at web checkout.

That let us attribute renewals back to creatives in Mixpanel within 24–48 hours.

I use Web2Wave to iterate funnel copy fast and then map the checkout id to RevenueCat for renewals.

I stored the UTM on first web visit and sent it with the signup email link.

When the user opened the app I matched the email and attached the UTM to the user profile in analytics.

It cleaned up a lot of fuzzy attribution.

saved utms at signup
matched via email
results were immediate

Treat the UTM as an identity-level attribute, not a session-only tag.

Save it on the web signup record, mint a stable user id, and push that id into your analytics and into RevenueCat/Adapty as a server-side mapping. That way renewals and cancellations still map back to the original campaign.

Expect edge cases: cleared cookies, different emails, and deferred installs. Build heuristics (email, first event timing, device fingerprinting fallback) and reconcile nightly. The nightly job is cheap and solves most mismatches.

We had the biggest win from just one change: capture UTM on the landing page and require email before the app redirect.

It added friction but improved downstream attribution dramatically because we matched by email later.

Timing mattered too. If the app install happened >48 hours after the web session, our match rate dropped.

We pushed the UTM into the signup and then to analytics. Match rate jumped and creative-level signals returned.

Worth the extra field on the form.

Also run a nightly reconcile between checkout records and RevenueCat receipts.

Catches the late matches.