UTM Parameters Not Showing in GA4? 9 Causes and How to Fix Each
You tagged the link, launched the campaign, and GA4 shows the traffic as direct or (not set). This troubleshooting guide walks through the nine causes in the order to check them, from redirects and typos to auto-tagging conflicts and consent banners.
In short
UTM parameters usually go missing in GA4 for one of nine reasons: a redirect stripping the query string, a typo in the parameter name, a cross-domain hop, Google Ads auto-tagging overriding manual tags, a consent banner delaying the first hit, a single-page app firing early, a missing utm_source, the wrong report scope, or the normal 24 to 48 hour processing delay.
The campaign is live, the link was tagged, and the GA4 traffic acquisition report shows the visits as (direct) / (none) or campaign (not set). This is one of the most common analytics questions there is, and the frustrating part is that there are a dozen possible causes that all produce the same symptom. This guide lists the nine we see most often, in the order worth checking them, with the fix for each. If you want the fundamentals first, start with what UTM parameters are.
First: is it a collection problem or a reporting problem?
Before changing anything, open GA4's Realtime report, click your tagged link in a fresh private window, and watch the source, medium, and campaign cards. If your values appear, the parameters are being collected and the issue is on the reporting side (causes 7 to 9 below). If Realtime shows direct or nothing at all, the parameters are not reaching GA4 and you are looking at causes 1 to 6. DebugView, enabled with the GA Debugger extension or the debug_mode parameter, shows the same thing at the event level and is the fastest way to see exactly which parameters arrived.
1. A redirect is stripping the query string
The single most common cause. Your tagged link points to example.com/sale, the server redirects to example.com/sale/ or to www.example.com/sale or to a localized version, and the redirect rule rebuilds the URL without the parameters. Link shorteners, vanity domains, and marketing automation click trackers can do the same. Test it by pasting the tagged link in a browser and checking whether the parameters are still in the address bar after the page settles. The fix is to tag the final URL exactly as it resolves, or to configure the redirect to preserve query strings.
2. A typo in a parameter name
GA4 only reads the exact names utm_source, utm_medium, utm_campaign, utm_term, utm_content, utm_id, utm_source_platform, utm_creative_format, and utm_marketing_tactic. utm-source, utmsource, utm_Source, or UTM_SOURCE are ignored. Capitalised values are fine (though they create duplicates); capitalised names are not. Hand-built links are where this happens, which is why a UTM builder that lints the link before it ships pays for itself in the first week.
3. The link crosses domains
If the tagged link lands on a page that then sends the user to a different domain (a checkout on shop.example.com, a booking tool on a vendor's domain, a login on auth.example.com), GA4 on the second domain starts a new session attributed to the first domain as a referrer unless cross-domain measurement is configured. Configure the domain list under Admin, Data streams, Configure tag settings, Configure your domains. For subdomains of the same root this is usually automatic; for separate root domains it is not.
4. Google Ads auto-tagging is overriding your UTMs
When a Google Ads click carries a gclid and also manual UTM parameters, GA4 uses the auto-tagging data and discards your manual campaign, term, and content values by default. The traffic appears as google / cpc with campaign names pulled from the Google Ads account, not your utm_campaign. If the Google Ads account is not linked to the GA4 property, the campaign shows as (not set). Either link the accounts and let auto-tagging do its job, or enable the manual tagging override in the Google Ads link settings if you need your own values to win. Our comparison of auto-tagging and manual UTM tagging covers the trade-offs.
5. The consent banner is blocking the first hit
With a consent management platform in place, the GA4 tag may be held until the visitor accepts. If a visitor lands with UTM parameters, clicks through to another page, and only then accepts, the first hit GA4 sees is on the second page, where the parameters are gone. GA4's Consent Mode in advanced mode sends cookieless pings that preserve campaign attribution for modelling, and Google's documentation recommends it for exactly this reason. Without it, the session's source is whatever the second page's URL says, which is nothing.
6. A single-page app fires before the URL is read
React, Vue, and Next.js apps sometimes initialise the analytics tag before the router has processed the landing URL, or they rewrite the URL to strip parameters as part of hydration. Both result in a page_view event with no campaign data. Check the page_view in DebugView: the page_location parameter should include the query string. If it does not, move the tag initialisation after the router or pass the original landing URL explicitly.
7. utm_source is missing
GA4 requires utm_source to recognise a tagged visit as a campaign. A link with utm_medium and utm_campaign but no utm_source is treated as untagged, and the session falls back to the referrer or direct. Always set source, medium, and campaign together.
8. You are looking at the wrong dimension
GA4 has three scopes for traffic source: user (the first campaign that acquired the user, in the User acquisition report), session (the campaign that started this session, in Traffic acquisition), and event (the campaign attributed to a conversion under the property's attribution model). A returning visitor who first arrived from Google six months ago and clicked your email today shows email in Session campaign but google in First user campaign. If your campaign appears in one report and not another, the parameters are working and you are reading a different scope. Switch the primary dimension to Session source / medium and Session campaign to see what the tag did.
9. The data has not processed yet
Standard GA4 reports lag by up to 24 hours, sometimes 48 for larger properties. Realtime and DebugView are the only places to verify a launch on the day. Build the check into your launch routine: tag the link, click it, confirm it in Realtime, then move on and look at the standard reports tomorrow.
A checklist to run before every launch
- 1Generate the link with a builder, never by hand, so names and encoding are correct.
- 2Paste it into a private window and confirm the parameters survive any redirects.
- 3Click it and confirm source, medium, and campaign in GA4 Realtime.
- 4If it is Google Ads traffic, decide once whether auto-tagging or manual tags win, and set the link accordingly.
- 5If the journey crosses domains, confirm the cross-domain list covers every one of them.
When GA4 is not the only thing that needs the parameters
Everything above assumes GA4 is the destination. In practice the same UTM values also need to reach your CRM, your attribution tool, and the conversions APIs of the ad platforms you buy from. Each of those has its own version of these nine failure modes, and a UTM that reaches GA4 but never makes it onto the lead record is just as lost. A first-party tracker that captures the landing URL on arrival and stores the campaign fields against the visitor, before any redirect, consent delay, or domain hop, removes most of the list in one step. That is how EndFrame handles it, and it is the reason our tracking audit checks parameter survival across the whole journey rather than only on the landing page. For the broader cleanup, see fixing UTM parameters that break campaign tracking.
Frequently asked questions
How long does it take for UTM data to show in GA4?
Realtime and DebugView show it within seconds. Standard reports take up to 24 hours, and occasionally 48, to process. If Realtime shows the correct source and medium while you click the link yourself, collection works and you only need to wait.
Why does GA4 show (not set) for campaign?
Session campaign is (not set) when the session had a source or medium but no utm_campaign value, or when the session's traffic source came from a referrer rather than a tagged link. Google Ads auto-tagged clicks on an unlinked account also show as (not set) for campaign. Add utm_campaign to every tagged link and link your Google Ads account.
Why is my campaign traffic showing as direct in GA4?
Direct means GA4 received the hit with no referrer and no UTM parameters. The usual causes are a redirect that dropped the query string, an app or email client that opened the link in an in-app browser without parameters, or a tagged link clicked within your own site after the original session expired.
Do UTM parameters override Google Ads auto-tagging in GA4?
By default, no. When a click carries both a gclid and manual UTMs, GA4 uses the auto-tagging data and ignores the manual values unless you enable manual tagging override in the Google Ads link settings. If your Google Ads traffic shows google / cpc with your UTM campaign names missing, that default is the reason.
Sources
- 1.Collect campaign data with custom URLs - Analytics Help
- 2.Monitor events in DebugView - Analytics Help
- 3.Set up cross-domain measurement - Analytics Help
- 4.Connect Google Ads to Google Analytics - Analytics Help
- 5.Introduction to user consent management - Analytics Help
- 6.Campaigns and traffic sources - Analytics Help
Try EndFrame
Recover the conversions your ad pixels miss.
EndFrame collects events first-party and forwards conversions server-side to Meta, GA4, TikTok, and webhooks with event-ID deduplication — then credits each conversion to its campaign, with the visit-to-conversion path you can audit.
No credit card required