How common are internal links with UTM parameters?
A modest minority of sites do it. In a random sample of 40 Tranco hosts crawled on 15 September 2026, 6 of 40 (15.0%) emitted at least one link to their own site carrying UTM parameters. 34 of 40 emitted none at all.
The share is not the useful part. The shape is. The affected hosts split in two: some carried such links on a handful of pages, and some carried them on every page we looked at. We measured where the links are, not how they got there — but the two shapes point at different work. A handful of pages is consistent with links tagged one at a time; every page is consistent with something in a template, and a template would be one fix rather than many.
We did not measure any consequence. This counts what the HTML emits. What an analytics tool then does with it is documented behaviour, not something this survey observed — the mechanism is explained on the marketing tag audit.
Everyone asserts it. Nobody counted it.
Search for the SEO problem with UTM parameters on internal links and page one is unanimous: it overwrites the original source of the session, it multiplies URLs, stop doing it. Re-checked on 15 September 2026, every result on page one made the argument. Not one of them stated how often it happens. There was no vendor documentation on the page and no study of any size — no sample, no denominator, no rate. Nine pages agreeing on a mechanism is not evidence about a prevalence, and after a while an unmeasured claim starts to sound measured simply from repetition.
So the mechanism is not our finding and this page does not re-argue it. It is well documented, and the marketing tag audit already explains in a paragraph what a tagged internal link does to a session. What follows is the missing half: how often, and in what shape.
What we counted, exactly
On 15 September 2026, Docket crawled 40 hosts drawn with a recorded seed
(20260915) from the Tranco top 10,000 — at most 25 pages
each, with its own identified user-agent and its own backoff. Ordinary crawling at the scale a
customer runs, not a special-purpose scrape.
A host counts as affected when any indexable page it served emitted a link to the same site whose
URL carries a utm_ parameter. That definition is narrower in several places than the
phrase "internal links with UTM parameters" suggests, and the differences are worth having in front of
you before the numbers:
- Same site means the same host, with
www.treated as equivalent to the apex. A link from a blog subdomain to the main domain is not counted as internal here. If you tag links across your own subdomains, this survey did not see it. - Indexable pages only. A tagged link sitting on a
noindexpage does not make its host count. - Links, not destinations. The same tagged navigation item appearing on three pages is three links. The totals below are counts of anchors, not of distinct URLs.
- The match is on the
utm_prefix appearing in the link, not on a list of five approved parameter names. Anything namedutm_-something counts, and so, in principle, would autm_that turned up somewhere in a URL that was not a parameter at all. We did not find a case of the latter, but we also did not go looking for one.
All 40 of 40 hosts crawled successfully. That is worth stating rather than assuming. In a survey where unreachable hosts drop out — a robots.txt survey, say — the denominator quietly thins and every share computed from it is a share of whoever answered. Here the denominator is the sample.
The number
6 of the 40 hosts (15.0%) emitted at least one internal link carrying UTM parameters. Across those hosts, 177 such links in total, with a median of 17.5 per affected host and a maximum of 91 on a single host.
40 hosts is a small sample and we are not going to dress it up as more. It supports "this is a real minority practice, not a myth and not a majority"; it does not support a confident rate to the decimal place, and it says nothing about sites outside the top of the Tranco list. Every share on this page is quoted with its denominator for that reason.
The distribution, which is the actual finding
Read the page-count column with its ceiling in mind. We crawled at most 25 pages per host, so the number of affected pages cannot exceed 25. A host showing 25 means every page we looked at carried such a link — not that the site has 25 pages. For those hosts the count is a lower bound and the share of the site affected is unmeasured. 2 of the affected hosts sit at that ceiling.
| Host (withheld) | Pages carrying such a link, of up to 25 crawled | What that shape is consistent with |
|---|---|---|
| Host A | 1 | Isolated. Consistent with links tagged one at a time, by hand. |
| Host B | 1 | Isolated. Consistent with links tagged one at a time, by hand. |
| Host C | 4 | Isolated. Consistent with links tagged one at a time, by hand. |
| Host D | 24 | Nearly every page we crawled. Consistent with a template. |
| Host E | 25 (at the crawl limit) | Every page we crawled. A lower bound — the true figure is however many pages the site has. |
| Host F | 25 (at the crawl limit) | Every page we crawled. A lower bound — the true figure is however many pages the site has. |
The affected hosts do not sit on a smooth curve from "a bit" to "a lot". They sit at the two ends: 3 hosts had it on four pages or fewer, and the rest had it on nearly or exactly every page crawled, with nothing in between. Say that carefully, though. 6 hosts is far too few to establish the shape of a distribution — a split this clean in a group this small could be chance, and we are not going to call it bimodal on this evidence. What it does do is show you the two cases exist, and they are worth telling apart when you look at your own site.
Those two clusters are different problems that happen to trip the same check:
- The handful. Somebody built a link by hand — a banner, a promo, an email landing page reused as an internal CTA — and pasted the tagged URL rather than the clean one. The fix is to edit those links. Finding them is the whole job.
- The whole site. A header, footer, nav or card component is emitting the parameter on every render. This looks like the worse problem and is usually the cheaper one: it is one template, and changing it changes every page at once. The page count is not a measure of how much work it is.
A per-page count without this split is close to useless, which may be why nobody publishes one. A tool that reports "91 internal links carrying UTM parameters" and stops has told you the size of the number and nothing about the size of the job.
A tagged internal link is not automatically a mistake
Some teams tag their own links deliberately. If you want to know how many people clicked the specific banner in the middle of your homepage, tagging that link is one way to find out, and a team that does it knowingly has accepted the cost in exchange for the measurement. That is a decision, not an error.
Nothing in this survey can tell those apart. The check reports the links; it does not read intent, and neither do we. When you look at your own results you are the only person who knows which of your tagged links were chosen and which were pasted. What the numbers here support is narrow and worth stating plainly: this happens on a minority of sites, and where it happens it is usually either a few links or all of them.
How to find them on your own site
You do not need a tool for the first pass. Look at the rendered HTML of a page and search it for
utm_ appearing inside an href that points at your own domain. In a browser,
view source and search for utm_; from a terminal, fetch the page and grep for anchors:
curl -s https://example.com/ | grep -o 'href="[^"]*utm_[^"]*"'
Two things to keep straight while you read the output. A tagged link pointing somewhere else is not this problem — tagging outbound links to a partner or to your own campaign landing pages on another domain is what UTMs are for. And check the header, footer and any repeated card component first, because that is where the whole-site pattern lives; if you find it there, you have found every page at once.
Whether a parameterised URL is then treated as a duplicate of the clean one is a canonical question, and not one this survey measured — that is canonical tags, and when the signals disagree, fixing conflicting canonicals. Docket runs the internal-UTM check as part of its tracking lane, alongside the rest of the conversion checks; the full catalogue is what Docket checks, and the lane-by-lane walkthrough is the SEO audit.
What this page does and does not claim
Every count above, the sampling frame, the seed, what the check actually treats as an internal link, and the two things we decline to claim from it are published as utm-internal-2026-09.json. Host names are not in it, by policy.
- No consequence was measured. We counted what the HTML emits. This survey did not open an analytics account, did not watch a session, and did not observe a single re-attributed visit. Any sentence you read elsewhere that moves from "this link is tagged" to "you lost this attribution" has crossed from documentation into assumption, and this page does not cross it.
- The sample is small and stated. 40 hosts, seed
20260915, crawled 15 September 2026. Every share above carries its denominator. - Nothing dropped out. 40 of 40 hosts crawled successfully, so the denominator is the sample rather than the subset that answered.
- The page counts have a ceiling. At most 25 pages per host, so 2 hosts are lower bounds and the affected share of those sites is unknown.
- Intent is unread. A tagged internal link may be deliberate. The check reports it either way.
- The mechanism is not ours. It is documented and widely explained; our contribution is the count and the shape.
Common questions
How many sites put UTM parameters on their own internal links?
In a random sample of 40 Tranco hosts crawled on 15 September 2026, 6 (15.0%) emitted at least one link to their own site carrying UTM parameters, and 34 emitted none. All 40 hosts crawled successfully, so that share is out of the whole sample rather than out of whoever answered. 40 hosts is a small sample: it supports 'a real minority practice', not a precise rate.
Is it a few links or the whole site?
Both, and that is the finding. Among the 6 affected hosts the counts sit at two ends with nothing between: 3 had such links on four pages or fewer, and the rest had them on nearly or exactly every page crawled — though 6 hosts is too few to call that a distribution shape rather than chance. A handful of pages is usually hand-pasted links; every page is a template emitting the parameter on every render, which is one fix rather than many. Across affected hosts there were 177 such links in total, median 17.5 per host, maximum 91.
Does a host showing the maximum page count mean the site has that many pages?
No, and this is the easiest number on the page to misread. We crawled at most 25 pages per host, so the page count cannot exceed 25. A host showing 25 means every page we looked at carried such a link — the true number is however many pages that site has. 2 of the 6 affected hosts sit at that ceiling, and the share of those sites affected is unmeasured.
Did you measure the damage to analytics attribution?
No. The survey counted what 40 hosts emit in their HTML. It did not observe a single session, a single re-attribution, or a single lost conversion. What an analytics tool does with a tagged internal link is documented behaviour, not something this survey measured, and the mechanism is explained on the marketing tag audit page rather than here.
Is tagging an internal link always a mistake?
No. Some teams tag a specific internal link on purpose — an on-site banner, say — and accept the attribution cost to get the click count. That is a decision. Nothing in a crawl distinguishes it from a pasted URL, so the check reports the links and does not read intent; across 40 hosts we can say how often it appears and in what shape, and nothing about why.