Most people who ask how to see UTMs in GA4 are really asking two questions they haven’t separated yet: where does the campaign data live, and why doesn’t it match what they tagged? The first is a five-click answer. The second is where GA4 quietly rewrites your reality — renaming every UTM parameter, re-attributing sessions to the “last non-direct” source, and bucketing your carefully tagged links into channel groups you never asked for. Get the second part wrong and you’ll make budget decisions off numbers that describe something other than what you think they describe.
The Fast Answer: Where UTMs Actually Live
To see UTMs in GA4 quickly, open Reports → Acquisition → Traffic acquisition. The default primary dimension is “Session default channel group.” Click that dropdown and switch it to Session campaign, Session source / medium, or Session manual ad content to expose the raw values you passed in your links. That single dropdown swap is the answer to the headline question — but the report is aggregated and last-touch-attributed, so treat it as a summary, not the source of truth for a specific click.
If you need the granular view — one campaign, broken down by medium and creative — you’ll build an exploration instead. Both approaches read the same underlying dimensions; the difference is how much control you get over rows, filters, and scope.
Why GA4 Renames Your UTMs (the mapping nobody warns you about)
Universal Analytics showed you “Campaign,” “Source,” and “Medium” — near-literal echoes of your utm_ tags. GA4 renamed all of them and split each into scoped variants. This is the single biggest reason people think their UTMs “aren’t showing up”: they’re searching for a field name that no longer exists. Here’s the actual mapping:
- utm_source → Session source (or First user source, or plain Source at event scope)
- utm_medium → Session medium
- utm_campaign → Session campaign
- utm_content → Session manual ad content
- utm_term → Session manual term
- utm_id → Session manual campaign ID
- utm_source_platform → Session source platform
Note the pattern: only source, medium, and campaign get clean names. Everything else is prefixed with “manual,” GA4’s word for “you tagged this by hand rather than us auto-detecting it.” If you’re hunting for utm_content and can’t find it, you’re looking for “manual ad content.” That naming trip-up costs more analyst-hours than any genuine tracking bug.
The Three Scopes That Trip Everyone Up
Every UTM dimension in GA4 exists in up to three scopes, and picking the wrong one is how two reports on the same data disagree. Understanding scope is the real answer to how to see UTMs in GA4 accurately:
- First user (user-scoped): the campaign that first acquired this user, frozen forever. Good for “which campaign brings in new people,” useless for “what drove yesterday’s conversions.”
- Session-scoped: the campaign credited for the session, using GA4’s last-non-direct-click model. This is the default in most acquisition reports and the one most people actually want.
- Event-scoped: the campaign present on the specific event. The most literal reading of your tags, but rarely the framing a marketer needs.
The trap: session scope re-attributes. If a user clicks your tagged newsletter link, leaves, then returns the next day by typing your URL directly, GA4 credits that second session’s activity back to the newsletter — because direct traffic doesn’t overwrite a known prior source within the lookback window. Your event-scoped data would say “direct.” Your session-scoped data says “email.” Both are correct; they answer different questions. Decide which question you’re asking before you pick the dimension.
Building a UTM Exploration That Answers Real Questions
Traffic acquisition shows one dimension at a time. To see how a single campaign splits across sources and creatives, go to Explore → Free form and build it yourself. Import these dimensions: Session campaign, Session source / medium, and Session manual ad content. Import metrics like Sessions, Key events (conversions), and Total revenue.
Drag Session campaign into Rows, then nest Session source / medium beneath it, then Session manual ad content below that. You now have a collapsible tree: campaign at the top, each traffic source under it, each ad variant under that. Add a filter (Session campaign exactly matches your campaign name) to strip out noise. This is the view that answers “which creative in the spring promo actually converted,” which no default report gives you cleanly.
A Worked Example: One Tagged Link, Tracked End to End
Say you send this link in a newsletter:
https://site.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=july_launch&utm_content=hero_button
A subscriber clicks it. Here’s exactly where each parameter surfaces. In Traffic acquisition with Session source / medium selected, you’ll see the row newsletter / email. Switch to Session campaign and you’ll find july_launch. In your exploration, drilling into july_launch → newsletter / email reveals a hero_button row under manual ad content. Meanwhile, GA4’s default channel grouping files this whole session under “Email” — because medium “email” matches its Email channel definition. If you’d tagged utm_medium as “e-mail” or “newsletter” instead, that same click would fall into “Unassigned” or “Referral,” and your Email channel would silently under-report. One character in the medium field decides whether a channel report tells the truth.
Verifying a UTM Link Before You Send It
Never trust a tagged link until you’ve watched it fire. Open Reports → Realtime or, better, enable DebugView. Install the Google Analytics Debugger browser extension (or add a debug_mode parameter), click your own tagged link, and watch the event stream in Admin → DebugView. You’ll see the source, medium, and campaign attach to the page_view or session_start event in real time — before it’s smeared by attribution modeling or the standard processing delay. Catching a typo here costs thirty seconds; catching it three weeks later, after a whole campaign ran mistagged, costs the campaign.
Why Your UTMs Show as (not set), (direct), or (organic)
These three phantom values account for most “my UTMs disappeared” tickets, and each has a distinct cause:
- (not set): the dimension had no value for those rows. Common when you tagged source and medium but left campaign blank, or when you’re viewing an event-scoped dimension on events that predate the session’s UTM.
- (direct) / (none): GA4 saw no campaign data at all — the link was untagged, the parameters got stripped by a redirect, or a link shortener dropped the query string. Audit your redirects; many silently discard everything after the “?”.
- (organic): your medium collided with an auto-detected channel. If you tag a paid social post as utm_medium=social, GA4 may still classify it under Organic Social unless the medium contains “cpc,” “paid,” or a recognized paid token.
Two structural culprits sit behind all of these. First, case sensitivity: Email, email, and EMAIL are three separate rows in GA4. Second, data thresholding and cardinality — high-cardinality campaigns can get lumped into an “(other)” row when a report would otherwise expose too many low-volume values, and reports that risk identifying individuals may be withheld entirely. If a campaign vanishes from a standard report but appears in an exploration, cardinality is usually why.
UTM Hygiene That Keeps Reports Readable
GA4 will faithfully store whatever mess you send it, which means clean reports are entirely on you. Enforce four rules and most attribution headaches never happen:
- Lowercase everything. Case sensitivity fragments one campaign into five rows. Pick lowercase and never deviate.
- Standardize your medium vocabulary. Use email, cpc, social, referral, affiliate — the tokens GA4’s channel logic recognizes. Inventing “e-blast” as a medium guarantees an Unassigned row.
- Use one delimiter. Underscores or hyphens, never spaces (which become %20 and read as ugly encoded values in every report).
- Keep a shared spec. A single spreadsheet or a URL builder that your whole team uses beats everyone free-styling tags. Consistency is worth more than cleverness here.
None of this hygiene shows up as a line item in GA4 — it shows up months later as reports you can actually trust. That’s the same reason SEO Rocket runs hard validation gates on the content side: clean inputs are cheaper to enforce up front than dirty data is to untangle after a quarter of campaigns.
Getting UTM Data Out of GA4
The GA4 interface is for looking; getting campaign data into a report, a dashboard, or a rank-tracking workflow means exporting. Every exploration has a share/export control that outputs to Google Sheets, PDF, or CSV. For anything recurring, connect GA4 to Looker Studio and build a campaign table there — it refreshes automatically and formats far better than screenshots. Teams running SEO at scale often pipe GA4 into BigQuery (free to link) so campaign, source, and medium land in raw event tables you can query without GA4’s sampling or thresholding getting in the way.
That export step is where UTM data stops living in isolation. GA4 tells you a session came from july_launch; it can’t tell you which keyword or page earned the organic sessions sitting alongside it. Knowing how to see UTMs in GA4 is only half the job; the other half is connecting that campaign view to organic performance, which is why serious SEO reporting pairs GA4’s traffic view with a rank tracker. In SEO Rocket, rank tracking runs on real Ahrefs index data and cross-checks against GA4 and Search Console as ground truth — the same principle behind a playbook proven across 1,000,000+ ranking pages: index-based rank estimates are directional, and GA4 tells you what those rankings actually did in sessions and conversions. The client dashboard stitches both sides together so a stakeholder sees campaign performance and organic movement in one place, rather than toggling between four tabs.
Frequently Asked Questions
Why don’t my UTMs match between Traffic acquisition and an exploration?
Almost always a scope mismatch. Traffic acquisition defaults to session-scoped, last-non-direct attribution; your exploration may be pulling first-user or event-scoped dimensions, which count differently. Confirm both are using the Session-prefixed version of each dimension before you assume there’s a data bug.
How long until UTMs appear in GA4 reports?
DebugView and Realtime show tagged traffic within seconds. Standard reports run on processed data, which typically lags by a few hours and can take up to 24-48 hours to fully settle. If a link fires correctly in DebugView but is missing from Traffic acquisition, you’re usually just early — check again the next day before troubleshooting.
Can I see UTMs at the individual user level in GA4?
Not by design. GA4 is built around aggregated, privacy-thresholded reporting, so per-user campaign paths aren’t exposed in the standard interface. For row-level campaign data joined to user IDs, link GA4 to BigQuery and query the raw event export, where the traffic_source fields sit on each event untouched by report thresholding.
Do UTMs override GA4’s automatic source detection?
For manual tagging, yes — a UTM-tagged link takes precedence over referrer-based detection for that session. The exception is Google Ads auto-tagging (gclid), which GA4 prioritizes over manual UTMs when both are present, so never manually tag your Google Ads links or you’ll create conflicting attribution.