Skip to content
GETIXGROUP
Blog
4 min read

How Tagging Your Own Internal Links Wipes Out Your Best Traffic Sources in GA4

A utm_medium of "internal" on a nav link can turn your Google organic traffic into Unassigned.

Yes, putting UTM tags on internal links breaks GA4 attribution. When a visitor clicks an internal link carrying utm_source and utm_medium, GA4 reads those parameters as a new campaign touch. Within an active session it can reassign campaign credit to the internal tag. Whenever the tagged URL becomes the first hit of a session (a return visit, a bookmark, a shared link, or a click after the session timeout), the internal UTM becomes that session's source and overwrites the real one.

UTM parameters have one job: telling GA4 where external traffic came from before it reached your site. The moment you reuse them on links that move people between your own pages, you feed GA4 false origin data about visitors who already arrived. If the internal utm_medium is also a value GA4 does not recognize, like "internal" or "nav," the traffic maps to no channel rule and lands in Unassigned. Your Google organic, your paid campaigns, and your referrals quietly lose the credit they earned.

Do UTMs on internal links break attribution in GA4?

They do, because GA4 ranks UTM parameters above the referrer and above gclid when it decides a session's source and medium. GA4 recognizes a fixed set of campaign parameters (utm_id, utm_source, utm_medium, utm_campaign, utm_source_platform, utm_term, utm_content, utm_creative_format, utm_marketing_tactic), and Google's guidance is to always include at least utm_source, utm_medium, and utm_campaign. Those parameters are meant to describe external campaigns that drive traffic to the site. When they appear on an internal link, GA4 has no way to know the tag is fake. It trusts the highest-priority signal it sees.

🎯 Bottom line

UTM parameters outrank the referrer and gclid. Once a tagged internal URL is the first hit of a session, that internal tag becomes the session source and replaces the real one.

Why is my GA4 traffic showing as Unassigned?

Almost always because a utm_medium value matches no channel rule. GA4's default channel group classifies traffic by exact medium matches. Organic Search requires the medium "organic." Paid Search and Paid Social require a medium matching the pattern ^(.*cp.*|ppc|retargeting|paid.*)$ alongside a matching source. Email matches email, e-mail, e_mail, or e mail. Affiliates requires "affiliate." Referral matches "referral," "app," or "link." Display matches "display," "banner," "expandable," "interstitial," or "cpm." Any event that matches no rule becomes Unassigned. A medium of "internal," "nav," or the classic "newsletter" fits none of these, so it falls through.

Keep Unassigned separate from (not set). Unassigned means GA4 has source and medium data but cannot map it to a channel group. (not set) means the data is missing entirely, for example when a redirect strips the parameters or when a required UTM value never arrived. Both look like a problem in reports. They have different causes and different fixes.

How does a tagged internal link overwrite your best source?

The mechanism runs through the session_start event. Whatever campaign data (UTM parameters, gclid, referrer) is present on the first hit of a session sets that session's source and medium. GA4's default session timeout is 30 minutes of inactivity, configurable up to 7 hours and 55 minutes. After a timeout, a returning user begins a new session, and a new session does not inherit the prior session's channel data: source defaults to (direct) and medium to (not set) unless a new signal is present. A leftover internal UTM sitting in the URL at that moment supplies the new signal and hijacks the fresh session.

The exact failure path depends on session state, and both patterns are real. Mid-session, the source GA4 already set usually holds, so changing UTMs on the current page may not rewrite the active session. The damage lands on the next session instead. The next session can inherit the stale internal UTM values, and if that visit would otherwise have been Direct, the internal tag is applied in place of the true origin. A user who found you through google/organic can, one bookmark or one timeout later, be recorded as yoursite/internal. The safe rule holds under either reading: never tag internal links.

🎯 Bottom line

A new GA4 session does not inherit the prior session's channel data. A leftover internal UTM in the URL becomes the new signal that sets the wrong source.

How do I find internal links that are leaking attribution?

Start in the browser. Open the page and run a quick scan in the console for internal anchor tags carrying campaign parameters, for example document.querySelectorAll('a[href*="utm_"]'), then read the list of offending links. Next, confirm your reports show the symptom: build an exploration and look for odd source/medium pairs like yoursite/internal or yoursite/nav, which should never exist for legitimately attributed traffic.

To separate this from redirect-based (not set) issues, open a full campaign URL in an incognito window and check that the utm_ parameters survive in the address bar after the page finishes loading. Redirects (301, 302, HTTP to HTTPS, desktop to mobile) can strip parameters and produce (not set) even on real external campaigns. Then open Admin, DebugView, and inspect an incoming page_view event to read the source, medium, and campaign parameters GA4 actually received.

How do I stop internal UTMs from corrupting GA4?

Strip UTM parameters from every internal link. That is the fix. To track how people move through your site, use GA4 events for internal click tracking, since events record interactions without touching source and medium. Reserve UTMs for external campaigns that bring people to the site. When you tag external links, use only Google's recognized utm_medium values so the traffic maps to a channel instead of Unassigned.

Two related settings protect the same data. For journeys that leave and return, such as sending a visitor to a payment host, GA4 treats moves between a domain and its own subdomains as self-referrals and does not count them as new referrals. For outside domains, add them under List unwanted referrals in Admin, Data Streams, Configure tag settings, so GA4 looks past that touchpoint and keeps the original source. Extending the session timeout only reduces how often sessions restart and re-attribute, so treat it as a partial mitigation.

Common questions

Why is my GA4 traffic suddenly showing as Unassigned?

Almost always a utm_medium value GA4 does not recognize. GA4 maps traffic to channels by exact medium matches like "organic," "email," "cpc," and "affiliate," so a value like "internal," "nav," or "newsletter" matches no rule and falls into Unassigned. Correct the medium values to Google's recognized list.

Do UTMs on internal links really break attribution?

Yes. UTM parameters outrank the referrer and gclid in GA4's source logic, so once a tagged internal URL becomes the first hit of a session (a return visit, a shared link, or a click after the timeout), that internal tag becomes the session source and replaces the real one. Reserve UTMs for external campaigns.

Will extending the session timeout fix the problem?

It only reduces how often sessions restart and re-attribute, so it is a partial mitigation. The real fix is removing UTM parameters from every internal link and tracking internal clicks with GA4 events.

A UTM parameter is a claim about where a visitor came from. Attach that claim to a link inside your own site and you tell GA4 something false, and GA4's source priority means it believes you over the evidence it collected. Keep campaign tags on the front door, where traffic actually enters, and let events handle everything that happens once people are inside.

Building something in one of these spaces? Let us help you grow it.

Book a free consultation