UTM Campaign Tracking Lab
Every attribution model you will ever build sits on top of one boring question: did the click arrive with a label on it? Tag a real campaign, run it for 30 days, then find out how much of your dashboard was telling you the truth.
STAGE 1 β ANATOMY OF A TAGGED LINK
The brief
Lumen & Co. is a direct-to-consumer skincare brand. On Monday they launch Summer Glow, a 30-day push across paid search, paid social, email, two influencers and retargeting display. Total media budget: $61,500.
You are the analyst. Nobody will ask you about tracking for the next 30 days. Then everybody will ask you about it at once.
How this lab works, in four stages
- Anatomy. Learn to read a link the way an analytics platform reads it, so you can predict where a visit will be filed before you ship anything.
- Tagging Plan. Decide how to label all five of Lumen's traffic sources. These are your decisions, and you will live with every one of them.
- Deploy. The campaign runs for 30 days. You cannot change your tags now, which is exactly how it works in practice.
- Debrief. Answer the questions your CMO actually asks, using only the dashboard your own tagging produced. Then find out what was really happening.
One thing to hold onto: the 30 days never change. The same customers buy the same things for the same reasons no matter how you tag. All your tagging decides is how much of that you are able to see. That is why you can come back at the end, revise your plan, and re-measure the identical month.
Start with the problem
Below is an ordinary campaign link, exactly as most people would paste it into an ad. Watch what the analytics platform is able to record about anyone who clicks it.
You can edit this URL directly, or load one of the examples below.
Five versions of the same link, colour-coded so you know what you are looking at: one has no tags three are common mistakes one is correct
What the analytics platform records
The five fields, explained with one real click
The five field names sound alike until you watch them describe the same event. So follow one single click all the way through. Someone is scrolling Facebook. They see Video A, the founder-story ad. They tap it. Lumen paid for that tap, and the ad only exists because of the Summer Glow launch.
That one click gets described by all five fields at once. Each field answers a different question about it, and once you can hear the difference between the questions, the fields stop blurring together.
utm_source- WHO showed them the link facebook The site or app the person was actually on at the moment they clicked. It is a company or website name and nothing else.
utm_medium-
HOW it reached them, and whether money changed hands
cpc
The mechanism, not the platform.
cpcmeans somebody paid per click. This is the field that decides the channel group, which is why getting it wrong is so expensive. utm_campaign- WHY it ran — which business push it belongs to summer-glow The initiative that paid for the ad to exist. Every source in the same launch shares this value, which is what lets you total the launch up later.
utm_content- WHICH ONE of several it was video-a Which specific ad, email send or partner link this exact click came from. Without it, everything a source runs collapses into one row and you can never tell the winner from the loser.
utm_term- WHAT THEY SEARCHED empty here The keyword that triggered a paid search ad. Nobody searched for anything to see a Facebook ad, so this field stays empty. It is the only one of the five that genuinely does not apply most of the time.
Which field changes, and which one does not
Here is a different brand, so nothing below gives away your own plan. Northvale Coffee is running one launch, Spring Roast, across three completely different kinds of traffic. Read the table across each row rather than down each column.
| Field | A Google search ad | Their weekly newsletter | A podcast sponsor read |
|---|---|---|---|
utm_source |
northvale-weekly | brewcast | |
utm_medium |
cpc | audio | |
utm_campaign |
spring-roast | spring-roast | spring-roast |
utm_content |
bag-15oz | mar-04-send | mid-roll |
utm_term |
cold-brew | — | — |
One row is identical all the way across, and it is the whole reason campaign exists. Source and medium change because the traffic genuinely is different. Content changes because each link is a different object. Campaign stays put because all three were bought for the same reason — so at the end of the month there is one row that totals the entire launch.
The two pairs everyone mixes up
utm_source vs utm_medium
facebook is WHO. cpc is HOW. The most common mistake in this whole lab is
writing medium=facebook, which names the platform twice and never once says that
anyone paid for the click. Analytics then files your ad spend under free traffic. That is
exactly what example 3 above does.
Quick test: if the answer is a company you could write a cheque to, it belongs in source. If it describes the kind of link, it belongs in medium.
utm_campaign vs utm_content
Campaign is the whole launch. Content is one link inside it. If you put
summer-glow in content you have learned nothing, because every single link would
say the same thing. Content only earns its place when it is different for each ad, each send,
each partner.
Quick test: campaign should be identical on every link in the launch. Content should be different on every one.
Words the dashboard will use back at you
- Session source
- Where the visit came from, as the platform recorded it. Taken from
utm_sourceif the link was tagged, and guessed from the referring website if it was not. - Session medium
- The kind of traffic, as recorded. Taken from
utm_medium, or guessed from the referrer. This is the field that decides the channel group. - Referrer
- The website the browser says it came from. Email apps and messaging apps send no referrer at all, which is why untagged email has nothing to fall back on.
- Default channel group
- The bucket the platform files the visit into (Paid Search, Email, Display and so on). It is calculated from source and medium together, not chosen by you.
- Direct
- The bucket for visits with no tags and no referrer. It reads as "someone typed our address in", but in practice it is where untraceable traffic accumulates.
- Unassigned
- The bucket for visits the platform could not fit into any channel, usually because the medium was a word it does not recognize.