When UTM parameters go missing in GA4, they are lost in one of five places: the URL that actually loads, the first hit GA4 receives, the moment the tag fires, the values themselves, or the report you are reading. Check them in that order. Each step either finds the cause or rules out everything before it, so you never debug a report for a problem that happened at the redirect.
Three symptoms that look the same
“Missing UTMs” shows up in GA4 in three ways, and each points somewhere slightly different:
| What you see | What it usually means | Where to start |
|---|---|---|
| Campaign visits counted as Direct or Referral | The UTMs never reached GA4 | Steps 1 to 3 |
(not set) in source, medium, or campaign | Some parameters arrived, others didn’t | Step 4 |
| Sessions in Unassigned | The values arrived but match no channel rule | Step 4 |
Google is explicit about the second one: “Missing UTM parameters will result in (not set) values being present in reporting.” And about the third: Unassigned “is the value Analytics uses when there are no other channel rules that match the event data.” Both come from its documentation on URL builders and the default channel group. If your problem is (not set) beyond campaigns, the (not set) guide covers the rest; for Unassigned in general, see unassigned traffic.
Step 1: check the URL that actually loads
Click the real ad, email, or social link, not the URL in your spreadsheet, and look at the address bar once the page has loaded. Then open the browser’s Network panel, reload, and read the redirect chain.
The query string is dropped most often by:
- A redirect from
httptohttps, from the bare domain towww, or from an old path to a new one, written without passing the query string along. - A link shortener, an email click tracker, or an app link that rebuilds the URL.
- A malformed link: a
#before the?, a second?instead of&, or spaces and characters that were never encoded.
If the UTMs are gone from the final URL, nothing in GA4 can recover them. Fix the redirect or the link and stop here.
Step 2: check what GA4 received
If the final URL has the UTMs, check the hit. Open DebugView, or filter the Network panel by collect, and find the first page_view of the session. Its page_location parameter should carry the full URL, utm_ parameters included.
That is also where Google stores them: UTM parameters are left out of the landing page and page path dimensions and populated in the Page location dimension, per the same URL builders documentation. If page_location has the UTMs, the collection is fine and the cause is in step 4 or 5.
Step 3: check that the tag fires on the landing page
If the URL had the UTMs but the first hit doesn’t, the GA4 tag fired too late. The first hit GA4 sees comes from a later page, whose URL has no campaign parameters, so the session starts without them.
Three common reasons:
- Consent. With basic Consent Mode, Google tags wait for the visitor’s choice. If the visitor accepts on the second page, the first hit carries the second page’s URL. Test the landing page in each consent state you support.
- Triggers. A GA4 tag on a trigger that doesn’t fire on that template, or fires only after an interaction.
- Single-page apps. A route change before the tag loads, or a router that rewrites the URL and drops the query string.
The GTM debugging guide walks through Preview Mode and the Network panel for this check.
Step 4: check the values GA4 got
If the hit carries the UTMs, read the values as GA4 reads them:
- Case. Google’s documentation says “Parameter values are case sensitive, e.g.
utm_source=googleis different fromutm_source=Google.” Two spellings become two rows. - The three that matter. Google says you “should always use
utm_source,utm_medium, andutm_campaign.” A link with a campaign but no medium arrives with a(not set)medium. - Medium against the channel rules. Channels are assigned by rules on source and medium. Paid Search, for example, needs a search source and a medium that matches
^(.*cp.*|ppc|retargeting|paid.*)$. A made-up medium such asnewsletter-blastorinfluencermatches no rule and lands in Unassigned. The channel rules themselves “aren’t case sensitive and can’t be edited.”
A shared naming convention prevents most of this; the UTM tracking audit is the clean-up when it has already happened.
Step 5: check the report you are reading
Sometimes nothing is missing and the report answers a different question:
- Scope. The Traffic acquisition report groups sessions by session source and medium; User acquisition groups users by their first source. A returning visitor who first came from organic search shows as organic in User acquisition even when today’s session came from your campaign.
- Processing time. Google lists a daily processing time of 12 hours for standard properties and says processing can take 24 to 48 hours. Yesterday’s campaign can look empty in standard reports while DebugView and Realtime already show it.
Catch it before the report does
Every step above is a manual check you run after someone notices a gap. By then the campaign has been running for days, and the bidding has been learning from the wrong data.
Trackingplan reads the hits your site sends to GA4 and to your ad platforms on real traffic. It flags UTMs that break your campaign naming rules, sources and mediums with duplicate or badly formatted names, and the drop in campaign traffic when a redirect or a tag change starts losing them. The issue arrives with the hits behind it, so you start at the step that failed, not at step 1.
The order is the fix: URL, hit, tag, values, report. Most missing UTMs are found in the first three, before GA4 ever had a chance to report them.