tracking

Where your UTMs actually show up in GA4

July 25, 2026 10 min read
/ on this page

Your campaign data is almost certainly already in GA4, sitting under a dimension the report doesn’t show you by default.

Reports, then Acquisition, then Traffic acquisition. Change the dimension at the top left of the table to Session source / medium, and your tagged traffic is there.

That’s the answer for most people. The rest of this page is for when it isn’t there.

Because six things can take a campaign out of that report, and Realtime -- where everyone goes to check -- can’t tell you which one.

Test your knowledge

True or false: finding your UTMs in GA4

Claim 1 of 5

When you open Traffic acquisition, the first column already shows the source you typed into your link.

  • Claim 1 of 5When you open Traffic acquisition, the first column already shows the source you typed into your link.False. It opens on the channel GA4 filed the visit into. You switch the dimension to Session source / medium to see your tags.
  • Claim 2 of 5If someone found you through search in March and clicked your email in July, User acquisition credits that visit to your email.False. User acquisition credits the first time a person ever arrived, so it still says search. Traffic acquisition is the report that credits this visit.
  • Claim 3 of 5A campaign you sent an hour ago might not be in Traffic acquisition yet.True. GA4 reports aren’t live. On a standard property, Google says the daily figures typically take about 12 hours.
  • Claim 4 of 5Clicking your own link and checking Realtime tells you which campaign brought the visit.False. The Realtime traffic card looks at where a person first arrived, and only for people who’ve been before. It can show your tag is firing, but not which campaign brought this visit.
  • Claim 5 of 5A big Direct number is often just traffic nobody tagged.True. Direct is where GA4 puts a visit when it has nothing to identify it with. Tagging your links is the part of that you can fix.

Open Traffic acquisition and switch the dimension

Google’s own instruction: from the left menu select Reports, then on the left select Acquisition, then Traffic acquisition.[1] And if there’s no Acquisition menu to click, nobody broke anything: an administrator or editor can rearrange which reports appear in that navigation, from a section called Library at the bottom of it.[3]

That report counts sessions, which is exactly the scope you want when the question is “did my campaign send traffic”. But its first column doesn’t arrive set to your tag. It opens on Session default channel group, which is the bucket Analytics filed the visit into, not the words you typed into the link.[1]

So change it. The dimension picker sits at the top left of the table,[2] and the two values you’re looking for are Session source / medium and Session campaign.[1]

FIG 01. The one control you change The left menu path Reports, then Acquisition, then Traffic acquisition. In that report the dimension picker at the top left of the table opens on Session default channel group. Opening it lists Session source slash medium and Session campaign, either of which shows your tagged traffic. Reports Acquisition Traffic acquisition Session default channel group Session source / medium Session campaign
FIG 01. The one control you change The left menu path Reports, then Acquisition, then Traffic acquisition. In that report the dimension picker at the top left of the table opens on Session default channel group. Opening it lists Session source slash medium and Session campaign, either of which shows your tagged traffic. Reports Acquisition Traffic acquisition Session default channel group Session source / medium Session campaign

Google’s documented navigation path and its documented dimension list.[1][2]

Check that you’re not reading User acquisition

GA4 gives you two acquisition reports that look almost identical. This is where most “my UTMs are broken” conversations actually end.

Google draws the line in a single sentence:

“The User acquisition report is scoped to new users, while the Traffic acquisition report is scoped to new sessions.”[4]

So User acquisition credits the first time a person ever showed up, and its dimensions all start with First user. Traffic acquisition credits this visit, and its dimensions all start with Session.[4]

What does session scope mean?

Session scope means the value belongs to one visit, not to the person.

Think of a ticket for a single bus ride. It’s good for that ride and nothing else, and the next ride needs its own. A session-scoped dimension works the same way: it records how the visitor arrived this time, and the next visit gets its own answer.

Somebody finds you through search in March, then clicks your email campaign in July. User acquisition still says search, because in first-user terms that’s true, and your July email looks like it drove nothing.

Neither report is broken. But for campaign performance you want Traffic acquisition.

FIG 02. Why the two reports disagree One person arrives from organic search in March and clicks an email campaign in July. User acquisition, scoped to new users, says organic search at both points. Traffic acquisition, scoped to new sessions, says organic search in March and email in July. MARCH JULY visitor User acquisition Traffic acquisition organic search organic search organic search email
FIG 02. Why the two reports disagree One person arrives from organic search in March and clicks an email campaign in July. User acquisition, scoped to new users, says organic search at both points. Traffic acquisition, scoped to new sessions, says organic search in March and email in July. visitor User acquisition Traffic acquisition MARCH JULY organic search organic search organic search email

The scoping rule, from Google’s own documentation.[4]

Six reasons your campaign is missing

You’re in the right report, on the right dimension, and the campaign still isn’t there. Six things cause that, roughly in the order we run into them.

1. You’re looking too early

GA4 reports aren’t live. They’re also nowhere near as slow as the folklore says, and Google publishes the real numbers.

How long GA4 actually takes

On a standard property, intraday data typically lands in 2 to 6 hours, and the daily figures in about 12. Realtime is the exception, at typically a few minutes.[5]

Google also warns that processing can run 24 to 48 hours, and that your reports may change while it does.[5]

A campaign you sent an hour ago may genuinely not be in Traffic acquisition yet. Nothing to chase down there. Just wait for it.

This is the most common cause by far, and it’s rarely the tag’s fault.

Parameters get stripped by redirects, by link shorteners that drop the query string, by email platforms that wrap your URL in their own tracking domain, and by anyone who copies the address out of the browser bar after the page has already tidied it up.

A half-tagged link does the same damage more quietly. Google’s guidance is that if you set one UTM parameter you should set all the relevant ones, and it says what happens if you don’t: “Missing UTM parameters will result in (not set) values being present in reporting.”[6]

What does (not set) mean in GA4?

It means nothing arrived. Google calls it a placeholder name that Analytics uses when it hasn’t received any information for a dimension.[7]

So it isn’t an error code, and there’s nothing to go and fix inside it. It’s an empty box with a label on it -- and the label is the only thing in there.

One more cause has nothing to do with your link at all. Google says Session source / medium goes (not set) when session_start is missing,[7] which is the event Analytics fires when a visit begins. Miss that and the problem is how the tag was installed, not how the link was built.

3. Your campaign is in the report twice

Google is explicit that parameter values are case sensitive: utm_source=google is a different value from utm_source=Google.[6] So Newsletter and newsletter are two rows, and neither one shows the number you expected.

The channel layer is the exception, which is what makes this so hard to spot. Channel definitions aren’t case sensitive,[8] so the channel report looks perfectly healthy while the campaign rows underneath it quietly split in two.

Search the report for your campaign name rather than scanning for it, and look for near-duplicates. We wrote up the naming rules that prevent the split in UTM best practices.

/ free tool

The only place to fix a split campaign is where the link gets made.

Our free UTM builder lowercases every value by default, so the same campaign can’t go out under two spellings.

Open the UTM builder

You’ll read that UTMs on internal links restart the session. That was Universal Analytics, the version before GA4, and repeating it sends people looking for a symptom that isn’t there any more.

What actually happens is worse. Analytics reads the source off your parameters whenever they’re there,[9] so a visitor arrives from your campaign, clicks a tagged banner on your own homepage, and the source of that visit becomes your homepage. Sessions follow a non-direct last click model,[4] so that value can follow them into later visits too.

The tell: a campaign showing far more sessions than the ad or email platform reported clicks, or internal-sounding names in an acquisition report. Measure clicks on your own pages as events instead.

5. Google Ads wrote its own values on top

For Google Ads, auto-tagging is usually doing the work already, and manual UTMs on top don’t beat it. Google states it flatly: use manual tagging and auto-tagging together, and the source, medium and other traffic-classification dimensions take the auto-tagged values.[9]

Nothing errors and nothing warns you. Your paid traffic just lands under the source Google Ads assigned, and the campaign names in your report stop matching the ones in your spreadsheet. So pick one approach per channel, then check it with a real click.

6. It really is Direct

Direct is where GA4 puts a visit when it has nothing to identify it with, and the rule is narrow. The source has to exactly match (direct), and the medium has to be (not set) or (none).[8]

Your UTMs and the referrer get blamed on each other here. Your UTMs live in the URL, so they survive anything short of the query string being dropped. The referrer is different: it’s the page the visitor came from, the browser is the one reporting it, and privacy settings, in-app browsers and pasted links all take it away. It happens to AI assistants too: for a week in October 2026, ChatGPT’s links lost both the tag and the referrer, so those visits showed up as Direct.

So a big Direct number often isn’t a tracking failure. It’s the traffic nobody tagged, which happens to be the only part of this you can fix.

Why Realtime can’t confirm your tag worked

Here’s the part that caught us out, and it’s why we stopped recommending the obvious check.

Realtime is the natural place to go. Google lists verifying that your measurement code is working as one of the report’s jobs, and it covers the last 30 minutes.[10] You click your own link, open Realtime, and go looking for your campaign.

Now look at what the traffic card is scoped to. It’s called Active users by First user source, medium, source platform, or campaign.[10] First user. Not session.

And Google puts a second limit on top of the first:

“The ‘Active users by First user source’ card shows information only for established users.”[10]

Put those side by side and the card can’t answer your question from either direction. Click your link from a fresh browser and you’re a new user, so Google says you won’t be in that card at all, because there’s no first-user information for you yet.[10] Click it as somebody who has been to the site before, and the card shows where that person first arrived, which might be a search from last spring.

That’s our reading of two documented sentences rather than a line Google writes as one. But if you’ve ever had a tag work while Realtime stayed stubbornly blank, that’s the mechanism.

Where you lookWhat it provesWhat it can’t tell you
The address bar, right after the clickThe utm_ parameters survived the tripAnything about what GA4 recorded
RealtimeYour Analytics tag is firing[10]Which campaign brought this visit
Traffic acquisition, the next dayThe exact values GA4 filed against the sessionAnything about the last few minutes[5]

None of it is a disaster. It just moves the only check that works to before you send.

Do this once and you stop debugging after the fact.

  1. Build the link somewhere that enforces your convention, so the values are lowercase and consistent before anything is sent.
  2. Click it yourself, from the real place it will be sent, on the device your audience will use.
  3. Look at the address bar when the page lands. If the utm_ parameters aren’t in the URL, Analytics never saw them, and no report is going to invent them.
  4. Open Traffic acquisition the next day and check the values match what you built. Google’s freshness table puts the daily figures at about 12 hours.[5]

Two minutes at the front of a campaign beats a week of arguing about whether a channel underperformed or was simply mislabelled.

Put source, medium and campaign in one table

Explore is where source, medium and campaign sit side by side, and it has its own entry in the left navigation.[11]

You need it because the dimension picker swaps what the first column shows,[2] which is fine for one question at a time. Comparing three assets inside one campaign needs those values next to each other. Pick Explore’s Free-form technique and you get a crosstab: a plain table where you choose what goes in the rows and what goes in the columns.[11]

Although a crosstab can only separate what your tags separated in the first place. That work happened before the send.

In short -- GA4 isn’t hiding your campaign data. It’s either in a report you haven’t opened, in a row you haven’t recognised, or it never arrived at all, because something between the click and the landing page took the tags off.

Sources
  1. Traffic acquisition report Google Analytics Help. Retrieved 27 August 2026.
  2. Customize detail reports Google Analytics Help. Retrieved 27 August 2026.
  3. Customize report navigation Google Analytics Help. Retrieved 27 August 2026.
  4. User acquisition report vs. Traffic acquisition report Google Analytics Help. Retrieved 27 August 2026.
  5. Data freshness and Service Level Agreement constraints Google Analytics Help. Retrieved 27 August 2026.
  6. Collect campaign data with custom URLs Google Analytics Help. Retrieved 27 August 2026.
  7. What the value (not set) means in your reports Google Analytics Help. Retrieved 27 August 2026.
  8. Default channel group Google Analytics Help. Retrieved 27 August 2026.
  9. Traffic-source dimensions, manual tagging, and auto-tagging Google Analytics Help. Retrieved 27 August 2026.
  10. Realtime report Google Analytics Help. Retrieved 27 August 2026.
  11. Explorations Google Analytics Help. Retrieved 27 August 2026.

Frequently asked questions

How do I check UTM source in GA4?

Open Reports, then Acquisition, then Traffic acquisition. That report counts sessions, which is the scope you want when you are asking whether a campaign sent you traffic. Its first column opens on a channel grouping rather than on your tag, so change it in the dimension picker at the top left of the table to Session source / medium, or to Session campaign.

What does (not set) mean in GA4?

Google describes (not set) as a placeholder it uses when it has not received any information for a dimension. So it is an empty field with a name on it, not an error code. On campaign reports the usual cause is a half tagged link, because Google's guidance is that missing UTM parameters produce (not set) values in reporting. Session source / medium also goes (not set) when the session_start event is missing, which points at your tag setup rather than at your links.

Traffic acquisition vs User acquisition: what is the difference?

Scope. Google states that the User acquisition report is scoped to new users, while the Traffic acquisition report is scoped to new sessions. So User acquisition uses first user dimensions and credits the first time a person ever arrived. Traffic acquisition uses session dimensions and credits this visit. Someone who found you through search in March and clicked your July email still counts as search in User acquisition. For campaign performance you want Traffic acquisition.

Why is my traffic showing as Direct in GA4?

Direct is where a visit goes when Analytics has nothing to identify it with. Google's channel rule for it is narrow: the source has to exactly match (direct), and the medium has to be (not set) or (none). In practice that means untagged links, pasted URLs, redirects and shorteners that drop the query string, and privacy settings or in app browsers that remove the referrer. A large Direct number is often just the traffic nobody tagged.

Can I see UTM source in GA4 Realtime?

Not reliably, and this one surprised us. The Realtime traffic card is scoped to first user source, medium, source platform or campaign, and Google says it shows information only for established users. So a click from a fresh browser will not appear in it at all, and a click from a returning visitor shows the source that person first arrived from. Realtime can confirm your Analytics tag is firing. It cannot confirm which campaign brought this visit.