utm_source vs utm_medium vs utm_campaign: the difference, explained
The three UTM parameters people mix up the most, what each one actually means, and a simple rule for deciding what goes where. With real examples you can copy.
If you’ve ever stared at a link and wondered whether newsletter is a source or a medium, this post is for you. It’s the single most common UTM question, and it has a simple answer once you stop thinking about the words and start thinking about the questions each one answers.
Here’s the whole thing in one line:
- utm_source answers where?
- utm_medium answers what kind of channel?
- utm_campaign answers why?
Get those three straight and you’ll never second-guess a tag again. Let me break each one down.
utm_source: where the link lives
utm_source is the specific place someone clicked your link. Not the category, the actual named place.
Think of it as the room you walked into: twitter, newsletter, reddit, producthunt, founder-slack. If a stranger asked “where did you post that?”, the answer is your source.
utm_source=newsletter
utm_source=twitter
utm_source=producthunt
The mistake here is going too broad. utm_source=social is not a source, it’s a medium (more on that in a second). Source should be so specific that you could point to it: that newsletter, that subreddit, that Slack.
utm_medium: what type of channel it is
utm_medium is the category the source belongs to. It’s how you group many sources into one bucket so you can compare buckets against each other.
If source is the room, medium is the kind of room: email, social, community, referral, cpc (paid ads). Your newsletter and a one-off email blast are two different sources, but both are email. Twitter and LinkedIn are two sources, both social.
utm_medium=email
utm_medium=social
utm_medium=community
This is the parameter that pays off later. When you want to answer “is email or social driving more signups?”, you’re comparing mediums. That question is impossible if you never set them.
utm_campaign: why you’re sharing it
utm_campaign is the reason or moment behind the link. The why. A launch, an announcement, a seasonal push, a specific piece of content you’re promoting.
utm_campaign=launch
utm_campaign=v2-announce
utm_campaign=weekly-tips
The campaign is the one parameter that stays identical across every channel you share the same thing on. That’s the whole trick: same reason, different source and medium, one clean comparison.
The difference in one table
| Parameter | Question it answers | The idea | Examples |
|---|---|---|---|
utm_source | Where? | The specific place | twitter, newsletter, reddit |
utm_medium | What kind of channel? | The category | social, email, community |
utm_campaign | Why? | The reason or moment | launch, v2-announce |
Source is the room. Medium is the kind of room. Campaign is why you walked in.
Seeing all three at once
Here’s the same announcement shared three ways. Watch how source and medium change while campaign stays locked:
Sent in my newsletter, announcing v2:
?utm_source=newsletter&utm_medium=email&utm_campaign=v2-announce
Posted on X, same announcement:
?utm_source=twitter&utm_medium=social&utm_campaign=v2-announce
Dropped in a founder Slack, same announcement:
?utm_source=founder-slack&utm_medium=community&utm_campaign=v2-announce
Because v2-announce is identical everywhere, your analytics can now tell you the campaign sent 200 people total, that 140 came from the newsletter, and that the Slack drop punched above its weight. Same reason, three channels, one honest comparison. That’s the entire payoff of getting these three right.
The rule I use when I’m not sure
When I can’t decide what goes where, I ask the three questions in order:
- Where did I put this link? → that’s your source.
- What type of channel is that? → that’s your medium.
- Why am I sharing it right now? → that’s your campaign.
If an answer feels like it could go in two boxes, it’s almost always because you’re putting the reason in the source (utm_source=launch instead of utm_source=twitter + utm_campaign=launch). The reason is never the place. Keep them separate and everything totals up cleanly later.
What about the other two?
There are five UTM parameters in total. The other two — utm_term and utm_content — are for paid search keywords and A/B testing link variants. You can safely ignore both until you have a specific reason to use them. Ninety percent of good tracking is just source, medium, and campaign, applied the same way every time.
The part everyone skips
Knowing the difference is step one. The step that actually matters is tagging consistently — same casing, same words, every time. Twitter and twitter are two different sources to a computer, and one inconsistent tag quietly splits a channel in two. I wrote out the exact naming convention I use in a separate post; if you’re going to build tagged links, read that next.
Better yet, don’t hand-type them at all. I built linkutm so I could pick a source, medium, and campaign from a consistent list instead of retyping strings and hoping I spelled them the same as last time. The definitions above are the theory; a tool that enforces them is how you actually keep the data clean.
Field notes from building linkutm. If your UTMs are a mess and you want a second pair of eyes, email me.
- Smit
Thanks for reading. If this resonated, tell me about it. Replies are the whole point of writing in public.