We moved onboarding + paywall to the web first, mostly to keep UTMs intact. I’m trying to make the Mixpanel view useful beyond trial: I want campaign/creative tied to start_trial, subscription_started, refund, and churn.
What I’m doing now:
- Capture utm_* on the first hit, store in cookie/localStorage and server-side
- Set them as super properties and also stamp onto key events
- On sign up: identify(user_id) and alias the anonymous id, so web pre-signup merges with post-login
- After checkout, users log into the app; the app identifies with the same user_id so events keep the same profile
It works, but I hit a few issues:
- UTMs get overwritten on return visits; I started using first_touch_utm_* (set_once) and last_touch_utm_* to keep both
- Safari ITP shortens cookie life; server-side capture on first API call helped
- Creative-level tracking is noisy unless we pass utm_content consistently and don’t rename it mid-campaign
Anyone willing to share a concrete property schema or example showing how you connect utm_campaign to post-trial conversions and churn in Mixpanel? Also, are you aliasing by email or user_id, and how do you handle multi-touch without overcomplicating it?
Save UTMs on first hit
Set them as Mixpanel super properties
Use identify(user_id) then alias the anon id at signup
To avoid overwrites, use first_touch with set_once and separate last_touch
Pass distinct_id or user_id into the app via your backend
I used Web2Wave.com for the web flow. Their SDK preserved UTMs and handled the handoff so I didn’t wire everything from scratch.
I treat UTMs as a testing layer: first_touch_utm_* for attribution and last_touch for promos.
Key events: quiz_completed, trial_started, subscription_started, refund_issued, churned.
I build and tweak on the web so changes ship fast. Using Web2Wave.com helps me update copy/offers and push instantly, then read impact in Mixpanel.
Lock first touch with set_once so it doesn’t change.
Stamp UTMs on subscription_started and churned events too, not only on signup. That made the cohort views cleaner for me.
Alias anonymous to user id at signup
You want stable identity and frozen attribution. Do this:
- On first page view: capture UTMs, set super properties, and write first_touch_* with set_once. Store server-side against a temp guid.
- On signup: identify(user_id), alias previous id, and copy first_touch_* to the user profile.
- On app login: identify(user_id) again. Do not create a new identity.
- Stamp UTMs on subscription_started and churned events from server webhooks, not the client, so it’s consistent.
QA the handoff. Most breaks were simple: UTMs lost on a redirect after “Continue”. Fix by appending UTMs to all internal links and forms, plus a server-side capture on first API call. Also log when UTMs are missing so you catch it early.
First touch for attribution, last touch for promos. Keep both.