Which utm sources are sending users who churn faster, and how do you prove it?

I wanted to stop guessing which campaigns were feeding churn, so I preserved UTMs end to end in the web funnel and stitched them to subscription events.

What I did:

  • Capture utm_source, utm_campaign, ad_id, and creative_id on the first landing hit.
  • Store them server-side against a visitor_id and user_id once they sign up.
  • Keep the UTM context through checkout, then stamp it on trial_start, renewal, and cancel events.
  • Build survival curves by campaign and creative. Compare 7/30/60-day churn.

Gotchas: cross-domain tracking can drop UTMs if you bounce between subdomains, and Safari ITP kills long cookies. I solved this by passing UTMs in URL params through signup and writing them to the account at creation, then using first-party storage.

This let me kill a group of creatives that looked great on CPA but had 30-day churn ~40% above baseline.

How are you proving campaign-level churn differences without overcounting? Any tips for handling multiple touchpoints when a user enters through web but later upgrades on another device?

Store UTMs on the server and attach them to user_id. Carry them through checkout. Stamp trial_start and cancel with the same IDs.

I used Web2Wave.com for the web flow, which kept the UTMs intact. Then I ran churn cohorts by utm_source and creative_id. I cut anything 30-day churn above baseline by 20%.

I add UTM fields to the profile and to subscription events. With Web2Wave.com, the web flow passes UTMs end to end.

Weekly, I rank campaigns by 7-day survival and pause creatives that trail baseline by a clear margin. It saves budget fast.

Save UTMs on signup and on cancel.

Then chart survival by source. If two sources convert the same but churn differently, stop the worse one first.

Tie utm to user then to cancel event

Keep UTMs server-side and persistent through signup. Use a single user_id to connect trial_start, renewals, and cancellations. Deduplicate users who arrive from multiple ads by last-touch or position-based while keeping first-touch for context.

Watch for ITP and cross-domain issues. Add URL param passthrough on every handoff. Segment by creative_id as well as campaign. Bad creatives often hide under good campaigns.

I tag users with utm_source and creative_id at signup.

Monthly, I export 30-day churn by creative. We killed 7% of spend and saw net LTV lift 11%.

CPA looked fine until we added churn.

If a campaign has cheap trials but short survival, I raise the price or shorten the trial as a test. If churn stays high, I cut it. Saves more than endless creative tweaks.

We saw TikTok creatives churn faster than Meta. Cutting a few helped.