How Analytics Reads a Visit
Why the browser can say where a click came from but not why, how the link carries the why in five fixed slots, and how analytics turns them into channels.
On this page
Skip ahead to March 1, a little after nine in the morning. A Stride customer taps the hero image in the spring sale newsletter and lands on the sale page. Before the page has finished loading, Stride’s analytics has recorded the visit.
Where did she come from?
If the link was bare, analytics has to work it out from what the browser tells it, and a tap inside an email app tells it nothing. The visit files under direct, as if she’d typed the address herself. She didn’t. Stride paid to send that email, and the report hands the visit to nobody.
If the link carried four short tags, the report says newsletter, email, spring_sale-runners-2025_03, hero-image. Same person, same tap. The only difference is what the link said when it arrived.
https://
- sourcewhere
- mediumhow
- campaignwhy
- contentwhich link
Hold on to that link. It’s where the book is heading, not where Dana is: she hasn’t chosen a single value yet, and the pattern in that campaign value is the next chapter’s business. First, the question Chapter 1 left hanging. Doesn’t analytics already know where visitors come from?
Two clicks from Facebook
It knows something. Here’s a test.
On March 1, two people reach Stride’s sale page from Facebook. One taps Stride’s paid ad for the spring sale. The other taps a friend’s post sharing the sale with a running group. Neither link was tagged.
Before reading on, predict which channel each visit lands in. Paid Social for the ad? Referral for the friend’s post?
Show what the report saysHide it
Both visits arrive looking the same:
| Source | Medium | Channel |
|---|---|---|
m.facebook.com | referral | Organic Social |
m.facebook.com | referral | Organic Social |
GA4 files both as Organic Social. The paid click reads as free, and nothing in the report tells the two apart. Tagged, the ad’s click would have arrived as facebook / paid_social and landed in Paid Social.
Analytics knew where both clicks came from: Facebook. One was a paid ad from a campaign Dana will be asked to defend, the other a favor from someone Stride never paid, and from where the report sits they’re the same visit.
The report saw where. It never saw why.
The browser is a bad witness
Most clicks come with a note from the browser: here’s where this person just was. That note is the referrer. For an untagged link it’s all analytics has to go on, and it fails in three ways:
- It’s often missing. Email apps, most other apps, QR codes and bookmarks send no referrer at all, and a visit with no referrer and no tags files as direct: analytics’ name for “I can’t place this”. Untagged email often lands there.
- It’s often vague. By default, browsers now send only the domain that linked to you,
m.facebook.com, and nothing about the page or the post. - It never says why. Even a complete referrer can only say where. It can name Facebook. It can’t name the ad, the campaign, or whether anyone paid for the click.
The link carries the why
So the why has to travel with the link itself. Everything between the question mark and any # is the query string: a list of key=value pairs joined by &, which analytics reads.
stride.com/
Tags placed there arrive with the click whatever the browser does or doesn’t send. One rule keeps them working: tags go before any # in the link, because everything after a # stays in the browser, and analytics doesn’t read tags there.
UTM parameters are the standard set of these tags, five named keys that nearly every analytics tool reads. They’re the envelope from the Introduction, opened.
Five slots, and a convention
The envelope has a fixed shape: five slots. And the names on those slots don’t mean anything on their own. UTM stands for Urchin Tracking Module, after Urchin, the analytics tool Google bought in 2005 and turned into Google Analytics. The five names are Urchin’s convention. Nothing in a link makes utm_source a “where” or utm_medium a “how”.
A slot means what the tool reading it does with it, plus what your team agrees. GA4 builds its channels from source and medium and its campaign reports from campaign, so in GA4 the convention has teeth. A tool that read the slots differently, or a team that agreed to fill them differently, would get different meanings from the same link.
By that convention, each slot answers one question:
| Slot | By convention, answers | For example |
|---|---|---|
utm_source | Where did the click come from? | facebook, google, newsletter |
utm_medium | How did it reach you? | paid_social, cpc (paid search), email |
utm_campaign | Why does the link exist? | the spring sale |
utm_term | Which keyword or audience? | running_shoes |
utm_content | Which link or creative? | hero-image, cta-shop_now |
GA4 relies on source, medium and campaign, so those three go on every tagged link. Term and content are there for when you need them.
Now put Dana’s dimensions into the slots, the five she wrote down in Chapter 1:
| Dana’s dimension | Where it goes |
|---|---|
| Channel | utm_medium (with the source, it decides the channel) |
| Source | utm_source |
| Campaign | utm_campaign |
| Placement | utm_content |
| Product line | no slot |
Four dimensions have slots, and product line has none.
This is where the fixed shape bites.
The letter is Dana’s to write, but the envelope came with five slots, and product line, the dimension behind her second question, has nowhere obvious to go. It has two ways in:
- share a slot with another dimension;
- come from a lookup, the two-column list from Chapter 1, if every campaign promotes one line.
Stride will put it into the campaign slot, which is why the March 1 link reads spring_sale-runners-2025_03. How to do that without making a mess is the next chapter’s subject, and the other options are Chapter 4’s.
The tool picks the channel
Analytics reports your tags as you wrote them, and it also reads the source and the medium together and files the visit into a channel. This is channel grouping, and the channel column is the one most reports show first. When Dana’s board asks which channel drives revenue, this is the column that answers.
The rules are the tool’s, not yours. The source says what kind of site sent the visit: a social network, a search engine, a video site. The medium says whether the click was paid, or names it as email, referral or affiliate. Here are the chapter’s own cases:
| Source / medium | Channel |
|---|---|
facebook / paid_social (the ad, tagged) | Paid Social |
m.facebook.com / referral (either click, untagged) | Organic Social |
facebook / social_ads | Organic Social |
| no referrer, no tags (an untagged QR code) | Direct |
Look at the third row. Someone tagged the ad, but social_ads doesn’t read as paid to GA4, so the social source decides, and the spend reads as free again. If the medium doesn’t read as paid, the source alone decides the channel.
You have two ways to live with this:
Use the tool’s rules
Use values the default rules understand. That’s why Chapter 3’s mediums look the way they do.
The one deliberate exception is offline, for QR codes and print, which GA4 files as Unassigned unless you add a custom channel group.
Write your own
Define your own channel groups: GA4 allows custom ones, and Adobe Analytics has its own channel rules.
Either way, someone has to decide.
The full GA4 rule set, with a simulator for trying your own values, is in the GA4 field notes.
Other ways to carry the letter
UTMs are the most common envelope, not the only one, and each carrier has a cost.
| Carrier | What it is | Its cost |
|---|---|---|
| UTM parameters | five named tags on the link | read by nearly every tool, but only five slots |
| A custom parameter | your own key, like the Introduction’s cid= | one slot holds everything, but every tool that reads it needs rules to split it |
| A click ID | an ID the ad platform adds to the link itself, like Google’s gclid | analytics can turn it into a campaign only when the two are linked (connected in their settings) |
Click IDs raise a fair question about the two Facebook clicks: didn’t Meta mark the ad’s link? It did, with its own click ID, fbclid. Meta uses it for its own conversion tracking, and GA4 doesn’t use it, because Meta and GA4 aren’t linked the way Google Ads and GA4 are. Facebook adds it to ordinary shared links too, so it couldn’t have told the two clicks apart anyway. With Google Ads, auto-tagging adds a gclid, and GA4 fetches the campaign from Google Ads instead of the link. What happens when that campaign and your own tags disagree is Chapter 5’s story.
GA4 reads a few more utm_ keys than these five. They’re for the expert who goes looking, and the GA4 field notes list them.
Where the visit goes next
Zoom out. The click Stride paid for lands at one stop on a longer route, from the moment someone makes a link to the moment someone reads a report:
The visit is recorded here, but what it can say was settled earlier, when someone made the link.
Keep that line in your head. The rest of the book walks it.
Your situation
Read your own setup off stage 3:
- If you’re on GA4, it reads UTMs and its own linked click IDs.
- If you’re on Adobe Analytics, you may carry the letter in one custom parameter instead.
- If your ad platforms are linked to your analytics, auto-tagging carries the campaign for you.
- Whatever you run, most email, apps, QR codes and print arrive with no referrer, so for them the tags are the whole record.
What changes
| The decision | When the browser is the record | When the link is the record |
|---|---|---|
| Which links to tag | only channels analytics can’t see, like email and QR codes | every link you pay for or want to measure, including the obvious ones |
| The referrer | the record of where visits come from | a fallback, for visits that arrive untagged |
| Where a dimension goes | into whatever field is free | each slot answers one question by the convention your tools read; a dimension with no slot needs a home, chosen on purpose |
| The medium | a free label | half of the pair analytics groups channels by |
Where the rule lives
Five slots are five fields that can each be typed wrong, at four o’clock on a Friday, by whoever is making the link. The rules for them can live in one of two places:
Beside the path
Written in a document, the rules have to be remembered by every one of those people.
Inside the path
Built into the place where links get made, each slot offers only values that pass.
Which values those are, and who decides, is where Stride goes next.
Check yourself
An in-store display carries a QR code with no tags. What does the report record for the visits it brings, and why?
Show answerHide answer
Direct. A QR code sends no referrer at all, and with no tags either, analytics can’t place the visit. This is how Dana’s question about the QR codes goes unanswered: the visits arrived, and nothing said where from.
A colleague tags paid search links with a source of google_ads_brand. Which slot does each part of that value belong in?
Show answerHide answer
By the convention GA4 relies on, the platform, google, goes in source. The kind of traffic, paid search, goes in medium as cpc. The brand strategy belongs in campaign. One value was doing three jobs, and the convention gives each job its own slot.
Your Facebook ads are tagged facebook / social_ads. Which channel do their visits land in, and why?
Show answerHide answer
Organic Social. social_ads doesn’t read as paid to the channel rules, so the social source decides. The ads are tagged and still read as free. paid_social would land them in Paid Social.
In one line
The browser can say where a click came from but not why, so the link has to carry it. The link has five fixed slots, analytics reads them as a pair to choose a channel, and a dimension with no slot needs a home.
Before the next chapter
Find one link your team shipped untagged this month, and say which channel its visits landed in and why.