GA4 Troubleshooting

GA4 UTM Not Working? 10 Root Causes and a 5-Minute Triage

GA4 UTM not working? Run a 5-minute triage, then match your symptom to one of 10 root causes — from case drift and missing medium to stripped redirects and the fragment-hash trap.

Jun 30, 2026 9 min readBy The UTM Drift Guard team
GA4 Troubleshooting
EmailEMAILe-mailemail

Your Facebook number drops 40 percent overnight, but spend did not change. Or a chunk of traffic shows up as Unassigned, (not set), or (direct) / (none). When GA4 UTM tracking is not working, the campaign data is almost never gone — it is split, stripped, or mislabeled before GA4 ever sees it. This guide gives you a 5-minute triage and the 10 root causes behind it.

10–20%

of GA4 sessions commonly land in Unassigned

26%

of conversions can be credited to the wrong channel when UTM data is fragmented

3

spellings GA4 treats as separate mediums: email, Email, and EMAIL

Start with the 5-minute triage#

Before you rebuild a single link, find out which failure you have. Open GA4 and work top-down: measure how much traffic is unlabeled, then trace one live link end to end. Most teams find the cause in under five minutes.

  1. 1Open Traffic acquisitionAcquisition report, last 28 days
  2. 2Read your Unassigned %10–20% is normal
  3. 3Switch to source / mediumFind placeholders + duplicates
  4. 4Click one live linkDoes ?utm_* survive?
  5. 5Audit the raw exportGrade every variant at once
The fast path: confirm how much traffic is unlabeled, then follow one live link from click to landing page.
  1. 1

    Open Traffic acquisition

    Go to Reports → Acquisition → Traffic acquisition and set the range to the last 28 days. This is your channel-level view.

  2. 2

    Measure your Unassigned

    10–20% of sessions in Unassigned is common; well above that means parameters are being lost or mismapped. For the deep dive, see recovering Unassigned GA4 traffic.

  3. 3

    Switch to Session source / medium

    Change the dimension to Session source / medium. Scan for (not set), (direct) / (none), and duplicate spellings like Facebook / referral sitting next to facebook / cpc.

  4. 4

    Click one real link

    Take an actual campaign URL, click it, and watch the address bar. If the ?utm_* string disappears after a redirect, you have found a stripping problem.

  5. 5

    Audit the raw export

    Export source/medium to CSV and grade it. One pass surfaces every case split, missing medium, and typo at once, instead of reading reports one at a time.

The 10 root causes (symptom to fix)#

Almost every broken-UTM report traces to one of ten causes. Match your symptom to the row, apply the fix, then re-run the triage to confirm the numbers move.

Ten reasons GA4 UTM tracking breaks, the symptom each one shows, and the fix.
Root causeWhat you see in GA4The fix
Case or spelling driftOne channel split across Facebook, facebook, FBLowercase everything and pick one canonical spelling per channel
Missing utm_mediumSessions in Unassigned; source is set but medium is blankAlways send both utm_source and utm_medium
Auto-tagging overridegoogle / cpc rows you did not build, or your UTMs ignoredPick one method per link: auto-tagging or manual UTMs, not both
# before the ?No campaign data from an otherwise tagged linkPut ?utm_* before any # fragment in the URL
Server-side redirectSource shows (direct) / (none) despite a tagged linkPreserve the query string through every 301/302 hop
Marketing redirect or shortenerShort link works but the UTMs vanish on landingUse a shortener that forwards query params, or tag the final URL
App or email client rewrites the URLEmail and in-app traffic lands in UnassignedTest the live link from the real client; avoid click-wrappers that strip params
(not set) / (direct) / (none)Placeholder values instead of your campaignGA4 received no campaign data — trace which hop dropped it
Channel grouping mismatchTagged sessions still sit in Unassigned or OtherUse mediums GA4 recognizes (cpc, email, social) or edit the grouping rule
Encoding or stray characterssummer sale, summer+sale, summer%20sale as separate campaignsUse lowercase, hyphens or underscores, no spaces or trailing punctuation

Case and spelling drift is the most common cause

GA4 never normalizes your values. Facebook, facebook, and FB are three different sources, and Email and email are two different mediums. When five people build links over a year, one channel quietly becomes four. This is exactly how GA4 case sensitivity splits your channels, and it is the single most common reason a channel looks like it is shrinking when nothing about the spend actually changed.

FacebookfacebookFBfbmeta
facebook
EmailemailEMAILe-mail
email
ppcPPCpaidcpc
cpc
Googlegoogleadwords
google
Each cluster of spellings is more than GA4 can read as one. Collapse them to a single canonical token.

Drift is normal, not a discipline problem

67% of teams use UTMs but only 58% have a documented strategy (SEMrush, 2024), and 30% skip UTM markup in over 30% of campaigns. Free-text fields drift the moment a second person starts building links — the fix is a locked value list, not more reminders.

Auto-tagging vs manual UTMs

Google Ads auto-tagging adds a gclid to every ad click. If you also hand-build utm_* on the same link, GA4 can either ignore your manual tags or surface google / cpc rows you never created. Pick one method per destination and stay consistent. The trade-offs are laid out in Google Ads auto-tagging vs manual UTMs.

Click the link, do not just read the report

A live click tells you in two seconds what a report hides. If the ?utm_* string survives every redirect and the values are lowercase and complete, the link is fine — the problem is grouping or date range, not the tag.

Broken vs fixed: a worked example#

Here is one link that fails three different ways at once. The parameters are trapped in the fragment, the values are capitalized, and the campaign has a raw space — so GA4 records nothing from a link that looks tagged.

Broken: the `#` traps the query in the fragment, values are capitalized, and the campaign has a space.
https://example.com/summer-sale#?utm_source=Newsletter&utm_medium=Email&utm_campaign=Summer Sale 2026
Fixed: query first, lowercase values, hyphens instead of spaces, medium present.
https://example.com/summer-sale?utm_source=newsletter&utm_medium=email&utm_campaign=summer-sale-2026

Three changes rescue this link. Move ?utm_* ahead of any # so the browser sends it as a real query. Lowercase every value so GA4 does not split the channel into Newsletter and newsletter. Replace the space with a hyphen so summer sale does not fork into summer+sale and summer%20sale across different clients.

As sent (breaks)

#?utm_source=Newsletterutm_medium=Emailutm_campaign=Summer Sale 2026

As fixed (one clean row)

?utm_source=newsletterutm_medium=emailutm_campaign=summer-sale-2026
The same campaign, before and after the three fixes — one row in GA4 instead of several.

Common mistakes that keep UTMs broken#

Once you have fixed the obvious failures, these are the habits that quietly reintroduce them. Each one sends real traffic toward Unassigned or splits a channel you thought was clean.

Mistakes that quietly break tracking

  • Tagging internal links with UTMs — they overwrite the original campaign on the next click, so never put UTMs on links within your own site.
  • Using mediums GA4 does not recognize, like ppc instead of cpc or newsletter in the medium field instead of email.
  • Adding UTMs to a link that redirects without confirming the parameters survive every hop.
  • Letting each person invent a spelling because there is no documented, locked value list.
  • Trusting a single report instead of auditing the full source/medium export.

Even a clean cleanup drifts again the moment new links go out. Automated UTM drift detection re-checks your data on a schedule, so a fresh typo does not sit in your reports for a full quarter before anyone notices.

Internal links are a silent attribution killer

A UTM on a link inside your own site overwrites the source that brought the visitor in. The original campaign gets credited to your homepage instead of the ad or email that earned the click. Keep UTMs on inbound links only.

Stop hunting broken UTMs by eye#

You do not have to find these one report at a time. Paste or upload your GA4 source/medium export and UTM Drift Guard returns an A–F health grade in about a minute, clusters every variant with the Claude API, and ranks issues by traffic impact so you fix the costly ones first. A human approves the suggested canonical taxonomy in one click, and nothing is ever written back to GA4 automatically. Teams that standardize see a 29% improvement in attribution accuracy (Cometly, 2026).

A
B
C
D
F
C71 / 100First-audit example, not a benchmark
A first audit usually lands around a C: a few channels split by case and a batch of links missing `utm_medium`.

Why are my UTM parameters not showing in GA4?

The most common reasons are a missing utm_medium (GA4 needs both source and medium to assign a channel), a # placed before the ? so the parameters sit in the URL fragment, or a redirect that strips the query string. Click your live link and watch the address bar: if ?utm_* survives every hop and you still see nothing, confirm you are looking at Session source / medium for the right date range, since campaign data can take 24–48 hours to fully process.

Why does GA4 show (not set) or (direct) / (none) for tagged links?

Those are placeholders GA4 uses when a session arrives with no campaign data. The link may be tagged, but a redirect, link shortener, email click-wrapper, or in-app browser dropped the parameters before the landing page loaded. Trace each hop from click to page and confirm the query string is still attached at the end.

Why is one channel split into several rows in GA4?

GA4 is case-sensitive and does no normalization. Facebook, facebook, and FB are three separate sources, and Email and EMAIL are two separate mediums. Standardize on one lowercase spelling per channel and re-tag going forward. An audit groups the existing variants so you can see how much traffic each spelling captured before you merge them.

Why do my Google Ads show up wrong in GA4 even with UTMs?

Google Ads auto-tagging adds a gclid and can either override your manual UTMs or create google / cpc rows you did not build. Choose one method per link — auto-tagging or manual UTMs — and never run both on the same destination. See Google Ads auto-tagging vs manual UTMs for the full comparison.

How do I figure out which root cause is hitting my data?

Run the 5-minute triage above: read your Unassigned share, switch to Session source / medium, look for placeholders and duplicate spellings, then click one live link to see if the parameters survive. To catch everything in one pass, export source/medium and grade the raw data instead of reading reports one at a time.

Find which root cause is hitting your data

Paste or upload your GA4 source/medium export and get an A–F UTM health grade in about a minute — every broken variant, ranked by traffic impact. No signup for the first scan.

Run a free audit