Skip to content
Back to blog
GA4Mar 5, 2026 · Ludde Nyström · 9 min read

GA4 UTM Parameters Not Showing? Fix Your Campaign Tracking.

Fix broken GA4 UTM parameters showing as Direct/None. Troubleshoot missing campaign tracking in GA4 due to aggressive query parameter dropping.

GA4 UTM Parameters Not Showing? Fix Your Campaign Tracking

You've been meticulously tagging every campaign link with UTM parameters. You open GA4's Traffic Acquisition report and... nothing. Your paid campaigns show as (direct) / (none) or Unassigned. The UTM parameters are right there in the URL, but GA4 pretends they don't exist.

This is one of the most frustrating GA4 issues, and it's almost always caused by one of these 8 problems.

Report and Setup Issues

1. You're Looking at the Wrong Acquisition Report

GA4 has two traffic acquisition reports, and they measure different things. This confuses teams migrating from Universal Analytics where only one report existed. Most of the "my UTMs aren't showing up" complaints we see in audits turn out to be people looking at User Acquisition when they should be looking at Traffic Acquisition. The data is there — it's just in a different place.

  • User Acquisition: Shows the source of the user's first ever visit. If a user first came via organic and later clicked your UTM link, the UTM never shows here.
  • Traffic Acquisition: Shows the source for each session. This is where your UTM parameters should appear.

The fix: Navigate to Reports → Acquisition → Traffic Acquisition and use the "Session source / medium" dimension. If your UTMs are still missing, the issue is one of the other seven below.

2. UTM Parameters Are Case-Sensitive in GA4

This trips up more teams than any other single issue — utm_source=Facebook and utm_source=facebook are treated as completely different sources in GA4. If one team member tags links with "Facebook" and another uses "facebook," your paid social traffic gets fragmented across two line items and your default channel grouping mapping may break for one of them. This compounds fast across multiple campaigns.

The fix: Standardize on lowercase for all UTM values across your entire organization. Three tactics that work:

  • Build a UTM spreadsheet with validated dropdown values for source, medium, and campaign.
  • Use Google's Campaign URL Builder or our free UTM Builder — both lowercase by default.
  • Run a monthly audit that flags any uppercase UTM values in Traffic Acquisition and escalates to the campaign owner.

3. Redirects Are Silently Stripping Your UTM Parameters

This is the most common way campaign attribution breaks without anyone noticing. Your link has the UTMs, but a redirect (301, 302, or JavaScript redirect) between the click and the final landing page strips the query string before GA4 ever sees it. The link tests fine in devtools, but by the time the page_view fires, the parameters are gone. Five common culprits:

  • HTTPS redirects (http → https) that don't preserve the query string.
  • www vs non-www canonical redirects.
  • Trailing-slash normalization (/page → /page/).
  • Short URL services (bit.ly, t.co, link shorteners from email platforms).
  • Marketing platforms with their own redirect chains (HubSpot, Marketo, Salesforce).

The fix: Paste your full UTM URL into an incognito browser and inspect the final address bar. If the query string vanished, fix the redirect rule or tag links with the already-resolved URL.

4. Missing Required UTM Parameters

GA4's attribution engine needs at minimum utm_source and utm_medium to correctly classify a session. If you only set utm_campaign, GA4 may fall back to the referrer for source and medium, which often lands the session in "(direct) / (none)" or gets filed into the wrong channel group. The Default Channel Grouping rules are built on source+medium combinations — without both, the mapping fails.

The fix: Always include these three parameters at minimum:

  • utm_source — where the traffic came from (google, newsletter, facebook).
  • utm_medium — use recognized values: cpc, email, social, referral, affiliate, display. Anything else will land in "Unassigned."
  • utm_campaign — the campaign name (summer_sale, q2_launch). Follow the lowercase rule from #2.

Attribution and Timing Issues

5. Self-Referrals Overwriting UTM Data Mid-Session

If your own domain appears as a referral source mid-session, it can overwrite the original UTM attribution. This happens whenever users pass through subdomains, payment processors (Stripe Checkout, Shopify checkout), or authentication flows that trigger a brand-new session. The user lands with your UTMs, bounces to checkout.stripe.com to pay, returns to your thank-you page — and the thank-you page gets credited to stripe.com / referral instead of your original campaign.

The fix: Add every domain you legitimately redirect through to the unwanted referrals list:

  1. Open Admin → Data Streams → [your web stream] → Configure tag settings.
  2. Click List unwanted referrals.
  3. Add your apex domain, subdomains, payment processors, and SSO providers.
  4. Changes take effect immediately for new sessions.

6. Data Processing Delay in Standard Reports

GA4 standard reports can take 24-48 hours to fully process, even though Google's own documentation sometimes says "4-8 hours." If you sent the first UTM-tagged email this morning and you're checking Traffic Acquisition this afternoon, the data won't be there yet — not because your tagging is broken, but because the batch processing hasn't finished. Teams waste hours debugging working setups because of this delay.

The fix: Use the Realtime report (Reports → Realtime) to verify UTMs are being captured right now. Click into a user's event stream and confirm source, medium, and campaign are populating. If realtime looks right, the standard report will catch up within 48 hours.

7. Google Ads Auto-Tagging Conflicts with Manual UTMs

If Google Ads auto-tagging is on (the gclid parameter) and you're also adding manual UTM parameters to the same Google Ads URL, GA4 resolves the conflict in favor of gclid. Your manual UTM values get silently ignored. This produces the confusing pattern where your Google Ads dashboard shows the campaign name correctly but GA4 shows it under "google / cpc" without your custom UTM values.

The fix: For Google Ads, rely exclusively on auto-tagging paired with the native GA4 ↔ Google Ads account link — it captures far more data than UTMs ever could (keyword, match type, ad group, etc.). Reserve manual UTM parameters for non-Google paid channels: Meta, LinkedIn, TikTok, email, newsletters, affiliates.

8. UTM Parameters in Hash Fragments Instead of Query String

If your UTMs appear after a # in the URL (like page.html#utm_source=email), GA4 cannot read them. The hash fragment is never sent to the server and is not parsed by the gtag.js snippet — it exists only in the browser. Single-page applications that route via hash URLs are especially prone to this issue, and so are email platforms that accidentally construct links with a hash instead of a question mark.

The fix: Always place UTM parameters in the query string (after ?), not the fragment (after #). For SPA routing, use the History API pushState pattern and ensure your analytics layer reads location.search, not location.hash.

Campaign Health Check

NiceLookingData audits your GA4 campaign tracking setup, identifies self-referral issues, and checks for UTM configuration problems. Run a free audit to see if your campaign data is reliable.

Key Takeaways

  • Always use the Traffic Acquisition report (not User Acquisition) to see UTM data per session.
  • Test your UTM URLs in incognito to verify parameters survive redirects.
  • Standardize on lowercase UTM values across your organization.
  • Add your own domains to the unwanted referrals list to prevent self-referral attribution.
  • Allow 24-48 hours for data to appear in standard reports; use Realtime for immediate verification.

Frequently Asked Questions

Why are UTM parameters not showing in GA4?

The most common reasons are: looking at the User Acquisition report instead of Traffic Acquisition (which shows first-visit attribution, not per-session UTMs), redirects that strip the query string before the page loads, or missing required parameters — GA4 needs at least utm_source and utm_medium to attribute a session correctly. Less obvious causes include self-referrals overwriting the original attribution mid-session, Google Ads gclid auto-tagging taking precedence over manual UTMs, and UTM values placed after the # hash symbol where GA4 cannot read them. Use the Realtime report to verify whether parameters are arriving at all before debugging the standard reports.

How long do UTM parameters take to appear in GA4?

UTM-tagged sessions appear in the GA4 Realtime report within seconds of the page_view event firing. In standard reports — Traffic Acquisition, Acquisition overview — the same data takes between 24 and 48 hours to fully process. Google's documentation states 24 hours, but actual processing times are frequently longer for larger properties. If you're checking standard reports on the same day you launched a campaign, the absence of UTM data doesn't mean your tagging is broken. Confirm with the Realtime report first, then wait the full 48-hour window before troubleshooting further.

What UTM parameters does GA4 support?

GA4 natively recognizes five standard UTM parameters: utm_source, utm_medium, utm_campaign, utm_content, and utm_term. GA4 also adds support for two parameters that Universal Analytics didn't have: utm_id for a campaign identifier and utm_source_platform for the advertising platform name. All seven are automatically captured as event parameters when present in the URL. Custom UTM-style parameters you invent (e.g., utm_audience or utm_creative) are not automatically captured — you'd need to register them as custom dimensions and configure collection explicitly.

Does GA4 automatically capture UTM parameters?

Yes, when you use the standard Google tag (gtag.js) or a GA4 Configuration tag in GTM, GA4 automatically reads UTM parameters from the page URL when a session starts and stores them as event parameters on the session_start and page_view events. No additional configuration is required for the five standard parameters. The captured values populate the source, medium, campaign, content, and term dimensions in the Traffic Acquisition report. This automatic collection does not apply to hash fragments — parameters after # are not read — and it only fires on the page_view event, so UTMs on URLs that don't generate a page_view will be ignored.

What is the difference between utm_source and utm_medium in GA4?

utm_source identifies the specific origin of the traffic — the website, newsletter name, or platform that sent the visitor (for example: google, facebook, weekly_newsletter). utm_medium identifies the marketing channel or traffic type — the broad category of how the traffic arrived (for example: cpc, email, social, referral, display). Together, source and medium form the "source / medium" dimension that appears throughout GA4 reports. GA4's Default Channel Grouping uses medium primarily to assign sessions to channels like Paid Search, Email, or Social — which is why using recognized medium values matters. Source is used for more granular breakdowns within each channel.

Why does GA4 show (direct) for traffic with UTMs?

Traffic with UTMs appearing as (direct) / (none) usually means the UTM parameters were stripped before GA4 processed the session. The most common culprit is a redirect — the UTM-tagged URL redirects to a final destination URL that doesn't carry the query string. Check by pasting the full UTM URL in an incognito browser and confirming the parameters survive in the final address bar. A second cause is self-referral: if a user with UTMs navigates to another page on your domain that starts a new session, the new session may be attributed to (direct) rather than carrying the original UTM forward. The unwanted referrals list prevents this from happening.

How do I debug UTM parameter tracking in GA4?

The most reliable method is GA4's DebugView combined with the Google Analytics Debugger Chrome extension. Enable the extension, navigate to your UTM-tagged URL, then open GA4 → Admin → DebugView. Find the session_start or page_view event and expand its parameters. You should see source, medium, campaign, and any other UTM values you set. If those parameters are absent in DebugView, the UTMs are being stripped before the tag fires — investigate the redirect chain. If they appear in DebugView but not in standard reports after 48 hours, there may be a data sampling or processing issue. The Realtime report is a faster alternative to DebugView for a quick sanity check.

What is the difference between manual and auto-tagged traffic in GA4?

Manual tagging means you add UTM parameters to your destination URLs yourself — writing ?utm_source=newsletter&utm_medium=email&utm_campaign=june_promo onto each link. Auto-tagging refers specifically to Google Ads' mechanism: when auto-tagging is enabled in Google Ads, Google automatically appends a gclid parameter to every ad click. GA4 reads gclid and uses it to pull richer attribution data from the linked Google Ads account — including keyword, match type, ad group, and bid strategy — data that plain UTMs cannot carry. When both gclid and UTMs are present on the same URL, GA4 gives priority to gclid. The practical rule: use auto-tagging for all Google Ads traffic and manual UTMs for everything else.

Written by
Ludde Nyström — Founder, NiceLookingData

Analytics consultant turned founder. After years running the same GA4 and GTM audits across client engagements, Ludde built the audit into a product — so the pattern-matching takes a minute, not a meeting. More about Ludde →

Free tool

Run a free GA4 audit.

Connect your Google Analytics 4 property. Our auditor runs 61 checks and gives you an instant health score with a plain-English action plan.

Thanks for reading.