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.
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 #1 silent killer of campaign attribution. 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. We see this in roughly 30% of campaign tracking audits. 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.
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:
- Open Admin → Data Streams → [your web stream] → Configure tag settings.
- Click List unwanted referrals.
- Add your apex domain, subdomains, payment processors, and SSO providers.
- 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.
Run a free GA4 audit on your property
Connect your Google Analytics 4 property. Our auditor runs 58 checks and gives you an instant health score with a plain-English action plan.
