Marketing Tool Stackby Amit Gupta
← Learn

Why You Shouldn't Put UTMs on Internal Links

Never put UTMs on internal links. Analytics tools read any UTM as a new campaign, so they overwrite the visitor's original source and start a fresh session, reattributing real acquisition to your own banner. Track internal clicks as events instead, which record the click without touching the source.

What actually breaks

When you tag an internal link (a nav item, a homepage banner, a "read next" button) with UTM parameters, your analytics tool treats the resulting click as a brand-new campaign visit. It overwrites the source and medium that originally brought the visitor in, and in most tools it ends the current session and begins a new one. The damage shows up in three places.

What you seeWhat's really happening
Real channels lose creditA visitor who arrived from organic search or a paid ad gets reattributed to the internal banner they clicked next.
Self-referrals / odd sourcesYour own domain or an internal campaign name shows up in the source/medium and campaign reports.
Inflated, shallow sessionsEach internal UTM click can spawn a new session, raising session counts and dragging down pages-per-session and conversion rate.

The net effect is that the very report you rely on to compare channels, Traffic acquisition, quietly stops telling the truth, and you can't easily see that it's wrong unless you go looking.

Why UTMs reset the session source

UTMs reset the source because that is exactly what they are designed to do for external traffic. A UTM is a signal that says "a campaign sent this visit, here's which one." Analytics tools take that signal at face value: whenever a page loads with UTM parameters in the URL, the tool records a new campaign source and, because a new campaign implies a new visit, starts a fresh session. It has no way to know the click came from inside your own site.

UTMs are an acquisition signal, not a navigation log

UTM parameters answer one question: which outside effort earned this visit? They belong on links that live somewhere a visitor isn't yet: an email, an ad, a social post, a partner site. The moment a UTM rides on an internal link, you are using an acquisition tool to log internal navigation, and the tool dutifully overwrites your real acquisition data to do it.

Last non-direct attribution makes it worse

Many tools, including GA4, attribute a session to the most recent campaign or referral source. An internal UTM is, by definition, the most recent source the moment it is clicked, so it wins, and the genuine first source gets buried. This is why a single banner tagged utm_source=homepage can quietly absorb credit from dozens of real channels.

What to use instead: events

Track internal clicks as events, not UTMs. An event records that a specific element was clicked, with details like its label, page location, and destination, without ever touching the session's source, medium, or campaign. You get the "which internal link did they click?" insight you wanted, and your acquisition reporting stays clean.

In GA4

Send a custom event (for example internal_link_click) with parameters such as link_text, link_location, and link_url. You can fire it with Google Tag Manager on clicks to internal paths, or use GA4's built-in enhanced-measurement and recommended events where they fit. Because it's an event, it appears in Engagement reports and explorations, separate from acquisition entirely.

In other analytics tools

Most platforms have a direct equivalent: click or interaction tracking that attaches properties to an action rather than rewriting the visit's origin. Use that for buttons, banners, and nav. Reserve UTMs strictly for links that originate outside your domain, where the campaign source really does need recording.

If you really do need internal-promo performance

For internal promotions like hero banners and cross-sell modules, use a dedicated internal-promotion or content-grouping feature where your tool offers one, or carry a non-UTM query parameter (such as ?promo=spring_hero) that you read in your event layer but that analytics does not interpret as a campaign. Either approach measures the internal element without resetting the source.

How to find and remove them

Finding stray internal UTMs is straightforward: look for sessions attributed to your own site, then trace them to the tagged links and strip the parameters. Work through it in order.

  1. Spot the symptom in analytics. Open GA4's Traffic acquisition report and scan source / medium for your own domain, a self-referral, or internal-sounding campaign names. Those rows are almost always internal UTMs leaking into acquisition.
  2. Trace them to the page. Add landing page as a secondary dimension, or check the Campaign dimension, to see which internal campaigns are firing and from which pages they originate.
  3. Crawl the site for utm_ in hrefs. Run a site crawler (Screaming Frog, Sitebulb, or similar) and filter internal links whose URL contains utm_. This gives you the exact list of links to fix, including ones buried in templates.
  4. Remove the parameters at the source. Edit the link in your CMS, email template, or component so the internal href is clean: just the path, no ?utm_…. Fix shared templates and nav components once rather than page by page.
  5. Replace the intent with an event. Wherever you actually wanted to measure the internal click, add an event (or internal-promo tracking) in its place so you keep the insight without the side effect.
  6. Re-check after a few days. Once the changes are live, revisit Traffic acquisition. The self-referrals and internal campaign names should stop appearing in new sessions, confirming the leak is closed.

Historical data already corrupted by internal UTMs can't be retroactively reattributed, but stopping the leak ensures every report from here forward reflects real acquisition.

Frequently asked questions

What counts as an internal link?

An internal link points to another page on the same domain a visitor is already on: your nav menu, a homepage banner, a related-post link, or a button between two of your own pages. Tagging those with UTMs is the mistake. External links from other sites or your ads are where UTMs belong.

Why does an internal UTM reset the session source?

Analytics tools treat any inbound UTM as a sign that a new campaign sent the visit, so they overwrite the existing source and start a fresh session. When that UTM is on an internal click, the tool credits the new session to your own banner and discards the real channel that first brought the visitor in.

What should I use instead of internal UTMs?

Track internal clicks as events, not UTMs. In GA4 send a custom event with parameters for the link text, location, and destination; in other tools use click or interaction tracking. Events record which internal element was clicked without touching the session source, so acquisition reporting stays intact.

How do I find internal links that already have UTMs?

In GA4, look at Traffic acquisition for sessions whose source or medium is your own domain or an internal label, then drill into the landing pages. A site crawler can also list every on-site link containing utm_ in its href. Both surface the tagged internal links you need to clean up.

Do internal UTMs hurt anything besides reports?

Yes. Because each internal UTM click can start a new session, they inflate your session count and depress per-session metrics like pages per session and conversion rate. They also pollute the campaign and source dimensions with internal names, making it harder to trust any channel comparison in your analytics.

Last updated: 14 June 2026