Why You Should Never Put UTM Params on Internal Links
UTM parameters are meant as a tag that says "where did this visitor come from." Put that tag on a link inside your own site, though, and a visit that was already being tracked correctly gets split in two, erasing the real original traffic source. This guide walks through why that happens, based on how Google Analytics (GA) decides when a new session starts.
1. What UTM parameters were actually built for
UTM (Urchin Tracking Module) parameters are query strings appended to a URL — utm_source (where from), utm_medium (which channel), utm_campaign (which campaign). Their purpose is exactly one thing: to explicitly tell GA the path a visitor took when they land on your site from outside it for the first time. A link in an email newsletter, a link in an Instagram ad, a banner link on a partner's affiliate site — these "outside the site, into the site" entry points are the correct, intended use.
2. GA starts a new session whenever the UTM values change
This is the crux of it. Google Analytics (from the old Universal Analytics through today's GA4) is designed to interpret a visitor landing on a URL with newly attached campaign parameters as a signal that "a new acquisition event has begun." In the normal scenario (click an ad → arrive at the site), that's the correct behavior. The problem is that this logic doesn't distinguish whether the URL was reached from outside the site or from inside it. Even a link clicked inside the site, if it carries UTM parameters, can make GA conclude the same way: "a new visit from a new campaign has started."
utm_source=google&utm_medium=cpc). While browsing, they click an internal banner. That banner link, by mistake, carries utm_source=newsletter&utm_medium=email. That single click is enough for GA to newly decide "this visitor actually came from the newsletter," ending the original session and logging a new one attributed to the newsletter source. The result: session counts get inflated (one visit counted as two), and credit that rightfully belonged to the Google ad is erased.
3. Why this isn't just a "rounding error" but a serious problem
Marketing budgets are typically allocated based on channel-by-channel performance — how many conversions a given ad actually drove. Misapplying UTM tags to internal links distorts the data in two directions. First, inflated session counts — session counts run higher than actual visitor counts, making traffic look better than it is. Second, attribution theft — credit for a conversion that should have gone to a paid ad or an email campaign gets reassigned to the (meaningless) UTM value on whatever internal banner the visitor happened to click. When these two distortions compound, decisions like "which marketing channel deserves more budget" end up being made on bad data.
4. The correct usage pattern
- UTM parameters belong only on entry points from outside the site into it: links from email, social posts, paid ads, affiliate banners, QR codes, and other off-site sources.
- Never attach them to internal navigation, banners, or CTA buttons. Movement within the same domain should be handled with plain UTM-free links, so GA correctly counts it as one continuous visit (session).
- If you want to measure click-through on internal content specifically, GA4's event tracking (custom events, or attaching parameters to
clickevents) is the right tool for that — not UTM. Manipulating the session itself via UTM is not a substitute.
5. Is GA4 any different?
Unlike the session-centric Universal Analytics, GA4 uses an event-based model. That makes how UTM values get recorded as event parameters somewhat more flexible, but landing on a page with newly attached campaign parameters can still trigger session recalculation. In other words, the model change doesn't mean "it's now safe to put UTM on internal links." The same principle still applies in GA4.
Frequently Asked Questions
Q. How do I check if I've accidentally put UTM on an internal link?
A. If the Source/Medium report in GA shows unnaturally high session counts, or a source appears that shouldn't exist as a traffic source (e.g., the name of an internal banner), that's worth investigating. The most reliable approach is to trace exactly which link on which page path is generating that UTM value.
Q. Is it okay to use UTM on QR codes?
A. Yes — a QR code is a genuine external entry point (from a flyer, poster, etc.) into the site, so UTM is the correct use there. A format like utm_source=qr_code&utm_medium=offline works fine.
Q. What about a link that moves between different subdomains of the same site?
A. Movement between subdomains (e.g., blog.example.com → shop.example.com) often needs to be handled separately as cross-domain tracking, depending on your GA setup. Here too, GA's cross-domain measurement configuration is the proper solution rather than UTM — using UTM as a stopgap just reintroduces the same problem.
Q. If a live site already has a lot of internal links with UTM attached, do I need to fix them all right now?
A. It's best to fix them as soon as possible. As long as they remain, sessions keep getting contaminated and the data keeps getting inflated, so we recommend prioritizing the removal of UTM parameters from internal links.