linkutm Logo

Why Your GA4 Source/Medium Report Shows (not set): 7 Causes and How to Fix Each One

Bhargav Dhameliya
Bhargav Dhameliya
April 6, 2026
5 min read
ga4 source medium not set featured

You open your GA4 Traffic Acquisition report expecting clear answers. Instead, a chunk of your traffic sits under “source / medium: (not set) / (not set).”

That’s not just annoying. It means GA4 lost the attribution data for those sessions. You can’t tell if that traffic came from your email campaigns, paid ads, or social posts. And you can’t optimize what you can’t measure.

I deal with UTM tracking and campaign attribution every day at linkutm. The “(not set)” problem is one of the most common GA4 issues I see marketers struggle with. The good news: once you identify the cause, the fix is usually straightforward.

In this guide, I’ll walk you through the 7 most common causes of “(not set)” in your GA4 source/medium report and show you exactly how to fix each one.

GA4 traffic acquisition report showing session source/medium rows including google/organic, direct/none, and a highlighted (not set)/(not set) row indicating missing attribution data

What Does “(not set)” Mean in GA4 Source/Medium?

“(not set)” in GA4 is a placeholder value that appears in your source/medium report when Google Analytics received a hit but could not determine where the user came from. It signals a data collection failure, not just missing information.

Here’s why that distinction matters.

GA4 determines traffic source through a specific hierarchy. First, it checks for UTM parameters in the URL. Then it checks the document referrer (the page the user came from). If neither is available and the session_start event fires correctly, the visit gets classified as “direct / (none).”

But when something breaks in this process (the session_start event is missing, cookies can’t be set, or UTM parameters are malformed) GA4 can’t classify the visit at all. That’s when you see “(not set).”

“(not set)” vs “direct / (none)” vs “Unassigned”: What’s the Difference?

These three values look similar but mean completely different things. Confusing them leads to misdiagnosis.

Attribute (not set) direct / (none) Unassigned
What it means Data collection failure. GA4 couldn’t capture attribution. No referrer detected. User likely typed URL directly or used a bookmark. GA4 has source data but it doesn’t match any channel grouping rule.
Is it a problem? Usually yes Usually no Sometimes
Common cause Missing session_start, consent denial, broken UTMs Direct URL entry, bookmarks, some app traffic Custom campaign parameters that don’t match default channel rules
Can you fix it? Yes (for future data) Rarely needed Yes (update channel groupings)

Key takeaway: If you see “(not set),” something is broken in your tracking setup. If you see “direct / (none),” that’s GA4 working as expected for traffic without a referrer.

Three GA4 traffic classifications compared: (not set) marked as data collection failure, direct/(none) marked as no referrer detected, Unassigned marked as no channel grouping match

Cause 1: Missing or Broken UTM Parameters

This is the most common cause of “(not set)” in GA4, and the easiest to fix.

UTM parameters tell GA4 exactly where your traffic came from. When you share a campaign link without proper UTM tags, GA4 falls back to the document referrer. If that referrer is also unavailable or gets stripped (more on that in Cause 5), the session ends up as “(not set).”

Common UTM mistakes that cause this:

  • Missing utm_source: You included utm_medium and utm_campaign but forgot utm_source. GA4 requires utm_source as the minimum UTM parameter.
  • Spaces in parameter values: Using utm_source=email blast instead of utm_source=email_blast. Spaces break URL parsing.
  • Inconsistent casing: “Newsletter” and “newsletter” create separate entries in GA4. One might match your channel rules. The other might not.
  • Typos: utm_souce instead of utm_source means GA4 ignores the parameter entirely.

How to fix it:

  1. Audit your active campaign URLs. Click every link in your current email campaigns, social posts, and ads.
  2. Check that each URL includes at minimum utm_source and utm_medium.
  3. Validate that parameter values use lowercase, no spaces, and correct spelling.
  4. Use a UTM builder that enforces naming conventions automatically.

With linkutm’s UTM rules feature, you can set naming conventions once and enforce them across your entire team. No more typos. No more inconsistent casing. Every link follows the same structure.

Before and after UTM validation: broken URL with typos, spaces, and wrong casing on left versus correctly formatted lowercase UTM parameters with underscores on right

Cause 2: Google Tag or GTM Misconfiguration

GA4 relies on the session_start event to capture traffic source information. This event fires automatically when a new session begins. But if your Google tag is misconfigured, session_start might not fire at all, or it might fire too late to capture attribution data.

The most common misconfiguration: using the wrong trigger type in Google Tag Manager.

The trigger problem:

If your GA4 configuration tag uses the “All Pages” trigger, it fires when the DOM is ready. But by that time, other tags may have already fired events without a session. Those events get recorded without source/medium attribution.

The fix is to use the “Initialization” trigger type instead. Initialization triggers fire before all other triggers, ensuring the GA4 config tag (and session_start) runs first.

How to fix it:

  1. Open Google Tag Manager.
  2. Go to Tags and find your GA4 configuration tag (Google tag).
  3. Click the Triggering section.
  4. Remove “All Pages” and replace it with “Initialization – All Pages.”
  5. Save and publish.

How to verify:

After publishing, use GA4’s DebugView (Admin > DebugView) to confirm:

  • The session_start event fires on the first page load.
  • The session_start event contains source, medium, and campaign parameters.

If session_start is missing from DebugView, your tag configuration is the problem.

GTM trigger firing order comparison: correct flow with Initialization trigger ensuring session_start captures source/medium first versus wrong flow with All Pages trigger causing late GA4 config load

If you serve users in the EU, UK, or other regions with privacy regulations, Consent Mode is likely contributing to your “(not set)” traffic. Possibly a lot of it.

Here’s what happens. When a user denies analytics consent, Consent Mode v2 prevents GA4 from setting the _ga cookie. Without this cookie, GA4 can’t identify the user’s session or associate it with a traffic source.

GA4 still receives a cookieless ping (so the page_view event fires), but without session context. The result: source/medium appears as “(not set).”

How big is the impact?

Consent Mode can push your (not set) traffic above 30% for properties with significant EU traffic. The exact percentage depends on your consent banner design, your audience geography, and your industry. Healthcare and finance sites often see higher denial rates.

Google uses behavioral modeling to fill some of this gap. If you have enough data (typically 1,000+ daily users per country), Google can estimate attribution for consented and unconsented traffic alike. But the modeled data isn’t always visible in standard reports.

How to fix it:

  1. Verify your Consent Mode implementation is correct. Check that analytics_storage is set to “denied” when users decline, not that tracking is completely blocked.
  2. Enable Google’s consent mode behavioral modeling (Admin > Data Collection > turn on “Consent Mode Modeling” if available).
  3. Consider server-side tagging through Google Tag Manager Server Container, which can preserve some attribution without client-side cookies.

Important: You can’t eliminate consent-related (not set) entirely without violating privacy regulations. The goal is to minimize it through correct implementation and modeling.

Consent Mode v2 impact on GA4: Accept path sets _ga cookie and captures source/medium correctly, Decline path sends cookieless ping resulting in (not set) attribution

Cause 4: Referral Exclusion Misconfiguration

GA4’s referral exclusion list (called “List unwanted referrals” in GA4) tells the platform to ignore referrals from specific domains. It’s meant for payment gateways, authentication providers, and your own cross-domain properties.

But when you exclude a domain that actually sends you legitimate traffic, those visits lose their source attribution and often appear as “(not set).”

Common mistakes:

  • Excluding your payment provider’s domain before they redirect back. The referral from the payment page gets suppressed, but the session restart after redirect has no other source to fall back on.
  • Excluding partner or affiliate domains that genuinely refer traffic to you.
  • Using overly broad exclusion patterns that match unintended domains.

How to fix it:

  1. Go to GA4 Admin > Data Streams > your web stream > Configure tag settings > List unwanted referrals.
  2. Review every domain on the list.
  3. Ask: “Does this domain legitimately send us traffic that I want to track?” If yes, remove it.
  4. For payment gateways, ensure cross-domain tracking is set up correctly instead of relying on referral exclusions.

Quick test:

If your “(not set)” traffic spikes after adding a referral exclusion, that exclusion is likely the cause. Remove it and monitor for 48 hours.

Cause 5: In-App Browsers Stripping UTM Parameters

This is a growing problem that many marketers don’t know about.

When users click links inside Meta (Facebook/Instagram), TikTok, LinkedIn, and other social media apps, those clicks open in the app’s built-in browser. These in-app browsers often strip or modify UTM parameters from the URL before loading the page.

The result: your carefully tagged campaign link arrives at your site without its UTM parameters. GA4 has no attribution data to work with.

Platforms that commonly strip UTMs:

  • Meta (Facebook and Instagram): The in-app browser frequently drops UTM parameters, especially on iOS.
  • TikTok: Similar behavior to Meta’s in-app browser.
  • LinkedIn: Inconsistent UTM handling in the mobile app.
  • iOS Safari with ITP: Intelligent Tracking Prevention can limit cross-site tracking, affecting some referrer data.
  • Apple Private Relay: Masks user IP and can affect geographic attribution.

How to fix it:

There’s no complete fix for in-app browser behavior since you can’t control how Meta or TikTok handle URLs. But you can mitigate the impact:

  1. Use server-side tracking. Server-side Google Tag Manager can capture attribution data before the client-side browser modifies it.
  2. Test your links. Open your campaign links in each platform’s in-app browser to see which UTMs survive.
  3. Use first-party data strategies. Capture source information through your own forms and landing page parameters.
  4. Monitor platform-specific (not set) rates. If you see high (not set) from mobile devices, in-app browsers are likely the cause.
In-app browser UTM stripping flow: user clicks UTM-tagged Instagram link, in-app browser opens, UTM parameters stripped from URL, page loads without tracking, GA4 records (not set)

Cause 6: Session Timeout Gaps

GA4 uses a 30-minute session timeout by default. If a user is inactive for more than 30 minutes and then interacts with your site again, GA4 starts a new session.

Here’s the problem: if that new session starts without a fresh page load (for example, the user switches back to a tab they left open), GA4 may not have referrer or UTM data to assign. The new session gets “(not set)” for source/medium.

When this happens most:

  • Users who open your site in a tab, leave for hours, then come back.
  • Single-page applications (SPAs) where navigation doesn’t trigger full page reloads.
  • Content-heavy sites where users read for long periods, exceeding the timeout.
  • Sessions that span midnight (a known GA4 quirk that can split sessions).

How to fix it:

  1. Go to Admin > Data Streams > your web stream > Configure tag settings > Adjust session timeout.
  2. If your site has long average session durations, consider increasing the timeout (up to 7 hours and 55 minutes).
  3. For SPAs, ensure your router triggers GA4 page_view events on navigation changes.

Trade-off to consider: Increasing session timeout means fewer total sessions and potentially longer average session durations. This affects your engagement rate calculations. Only adjust if session timeout (not set) is a significant portion of your traffic.

Cause 7: Measurement Protocol and Audience Triggers

These two causes are less common but can create persistent “(not set)” values that are hard to diagnose.

Measurement Protocol issues:

The Measurement Protocol lets you send events to GA4 from servers, IoT devices, or offline systems. But if the implementation is incorrect, those events can pollute your source/medium reports.

Common mistakes:

  • Sending events without a valid session_id parameter.
  • Missing or incorrect timestamp_micros value.
  • Not including engagement_time_msec (which GA4 uses to validate sessions).
  • Sending events more than 72 hours after they occurred (GA4 rejects historical data beyond this window).

Audience trigger issues:

GA4 audience triggers fire events when users enter an audience. But if the trigger fires after the user’s session has ended, the resulting event has no session context and no source/medium data.

How to fix it:

  1. Measurement Protocol: Audit your server-side events. Verify that every event includes session_id, timestamp_micros, and engagement_time_msec parameters. Test with GA4 DebugView before going live.
  2. Audience triggers: Minimize the use of audience triggers. If you must use them, tie them to in-session events rather than user properties that might trigger outside active sessions.
Two GA4 attribution gaps: Measurement Protocol sends events without session_id creating orphaned data, Audience Trigger fires after session ends creating events with no source/medium context

How to Diagnose Which Cause Applies to You

If you’re not sure which of the 7 causes is responsible, follow this diagnostic process.

Step 1: Check the timing

When did “(not set)” start appearing or increase? A sudden spike points to a recent change (tag modification, consent mode implementation, or a new referral exclusion). A gradual increase suggests ongoing issues like UTM decay or growing in-app browser traffic.

Step 2: Check the device breakdown

In your GA4 Traffic Acquisition report, add a secondary dimension for “Device category.” If “(not set)” is predominantly mobile, in-app browsers (Cause 5) are likely the culprit. If it’s evenly distributed, look at tag configuration (Cause 2) or consent mode (Cause 3).

Step 3: Check the geography

Add “Country” as a secondary dimension. If “(not set)” is concentrated in EU countries, Consent Mode (Cause 3) is the primary driver.

Step 4: Use DebugView

Open GA4 DebugView and browse your site through various channels:

  • Click a UTM-tagged link. Does session_start show the correct source/medium?
  • Visit directly. Does session_start show direct/(none)?
  • If session_start is missing entirely, your tag configuration (Cause 2) is the issue.

Step 5: Audit your UTM links

Check your active campaign URLs. Are UTM parameters present, correctly formatted, and consistent? Use linkutm’s free UTM builder to validate your parameters.

GA4 (not set) diagnostic flowchart: check timing spike, device breakdown, EU geography, DebugView session_start, and UTM correctness to identify which of the 7 causes applies

How to Prevent “(not set)” Going Forward

Fixing the immediate cause is step one. Preventing it from coming back is step two.

1. Enforce UTM naming conventions

The biggest prevention measure is consistent, validated UTM parameters across all campaigns. Set rules for:

  • Always lowercase
  • Underscores instead of spaces
  • Required fields (utm_source and utm_medium at minimum)
  • Standardized values (e. g., always “email” not “Email” or “e-mail”)

With linkutm, you can create UTM templates and enforce naming rules across your entire team. Every link follows the same conventions automatically.

2. Test links before launching campaigns

Before sending any campaign, click your UTM-tagged links and verify in GA4 DebugView that:

  • session_start fires correctly.
  • Source, medium, and campaign values appear as expected.

3. Run monthly UTM audits

Set a recurring calendar reminder to:

  • Check your GA4 Traffic Acquisition report for (not set) trends.
  • Review your referral exclusion list.
  • Validate UTM parameters on active campaigns.
  • Test links in major in-app browsers.

4. Document your UTM naming conventions

Create a shared document (or use linkutm’s UTM templates) that defines:

  • Accepted values for utm_source (newsletter, facebook, google, linkedin, etc.)
  • Accepted values for utm_medium (email, social, cpc, affiliate, etc.)
  • Naming format for utm_campaign (lowercase, underscores, date format)

This is especially important if you need to keep your UTM naming conventions consistent across teams.

GA4 (not set) prevention checklist with four items: enforce UTM naming conventions, test links in DebugView before launch, run monthly UTM audits, document conventions for team

GA4 Source/Medium “(not set)” FAQ

Can I fix historical “(not set)” data in GA4?

No. All fixes for “(not set)” in GA4 apply to future data only. Once a session is recorded as (not set), GA4 cannot retroactively reclassify it. This is why prevention through consistent UTM tracking and proper tag configuration is critical.

What percentage of “(not set)” is normal in GA4?

A (not set) rate below 5% is generally acceptable for most GA4 properties. Between 5% and 10% warrants investigation. Above 10% indicates a configuration problem that’s actively hurting your attribution accuracy. Properties with significant EU traffic may see higher rates due to Consent Mode.

Does “(not set)” affect my SEO rankings?

No. “(not set)” is a GA4 reporting issue only. It does not affect how search engines crawl, index, or rank your pages. However, it makes it harder to accurately measure which channels (including organic search) drive results, which can indirectly hurt your marketing decisions.

Is “(not set)” the same as “(other)” in GA4?

No. “(not set)” means GA4 could not collect attribution data at all. It’s a data collection failure. “(other)” means GA4 received attribution data but could not match it to a standard channel grouping. You fix (not set) by fixing your tracking setup. You fix (other) by updating your channel grouping definitions.

Why did my “(not set)” traffic spike suddenly?

A sudden spike in (not set) traffic usually indicates a recent change in your tracking setup. Check for: GTM tag modifications published recently, a new consent mode implementation, a referral exclusion that was added incorrectly, or a high-traffic campaign launched with broken UTM parameters. Review your GTM version history and GA4 admin change log.

Does Consent Mode always cause “(not set)” in GA4?

Not always, but often. When users deny analytics consent, Consent Mode sends cookieless pings that lack session attribution. Google’s behavioral modeling can fill some of this gap if you have enough traffic (typically 1,000+ daily users per country). But for most properties, Consent Mode contributes some level of (not set) traffic.

How do I check if my UTM parameters are working correctly?

Use GA4’s DebugView (Admin > DebugView) to see events in real-time. Click a UTM-tagged link, then verify that the session_start event shows the correct source, medium, and campaign values. You can also use linkutm’s UTM builder which validates parameters automatically before you create links.

What’s the difference between session source/medium and first user source/medium showing “(not set)”?

Session source/medium reflects the traffic source for each individual session. First user source/medium reflects the traffic source of the user’s very first visit ever. If first user source/medium is (not set), the user’s initial session had attribution problems. If only session source/medium is (not set), the current session has the issue but the user’s first visit was tracked correctly.

Start Fixing Your GA4 Attribution Today

“(not set)” in your GA4 source/medium report isn’t something you should ignore. Every session labeled (not set) is a marketing decision made without complete data.

Start with the most common fix: validate your UTM parameters. Check that every campaign link has utm_source and utm_medium, uses lowercase values, and avoids spaces or typos. This single step resolves the majority of (not set) issues.

Then work through the diagnostic steps above to identify and fix any remaining causes specific to your setup.

Want to prevent (not set) from coming back? linkutm makes UTM management effortless with automatic naming enforcement, reusable templates, and validation that catches errors before they break your analytics. Start building clean UTM links for free.

Bhargav Dhameliya

About Bhargav Dhameliya

Share this article

Ready to track your campaigns better?

Join thousands of marketers who use linkutm to build, track, and manage their marketing campaigns with ease.

Get Started for Free