How UTM tracking parameters on internal links waste crawl budget and fracture analytics. The fix:

12 min read Original article ↗

Websites using tracking parameters on their internal links will encounter serious crawl budget waste and analytics issues. This internal tracking setup is outdated and dangerous.

On large websites tracking and attribution is essential but you should never use standard UTM parameters (utm_sourceutm_mediumutm_campaign, etc) on internal links on your website.

The goal is always to move the tracking logic from the URLs to the data layer. To do this, web analysts and developers have used CSS class tracking as a modern method to track user behavior (like people clicking internal links) by attaching specific CSS classes to HTML elements, rather than using tracking parameters in the URLs themselves.

That’s smart and much better than using tracking parameters on internal links but the problem with CSS class tracking is that this method is very fragile. If a developer or designer renames a CSS class to update the website’s styling, your tracking silently breaks. 

I’ll explain how data attributes solve this by completely separating presentation (your CSS) from behavior (analytics). Instead of changing the destination URL and adding a UTM parameter to track where a click came from, the modern solution is to use HTML5 custom data attributes like data-track


Silent SEO & AI Search Killer: UTM Parameters on Internal Links

UTM parameters should only be used to track users entering your website from external sources. Frequently, websites still misuse these parameters on internal links. And the larger the website, the higher the probability of those tracking parameters appearing because of a business decision. Beyond just inflating session data, UTM parameters on a website can negatively impact organic search.

Remember: UTM (Urchin Tracking Module) parameters were designed strictly for tracking inbound traffic.

Internal UTM tracking parameters will always confuse search engines and AI crawlers. I’ll explain what’s happening technically and how to track internal user behavior without any side effect.

Internal linking & URL tracking parameters: 2 major threats

You should never use URL parameters in internal links because this causes two major issues crawl budget waste and analytics session resets:

  1. Crawl budget waste: UTM tracking parameters on internal URLs create multiple versions of the same page. For instance, /page and /page?utm_source= are two different URLs.

    Search engines such as Google and Bing will process these URLs as different links. And the same logic applies to AI crawlers such as OAI-SearchBot which is OpenAI’s crawler for Search. That’s because technically, URLs with UTM tracking parameters are different than the original URL.

    And since crawl budget is finite, every millisecond a bot spends on redundant URL variations is a wasted opportunity which could prevent crawlers from discovering your most important URLs.

  2. Analytics breakage: when a website uses UTM parameters on internal links, it overwrites the user’s original acquisition source. For example, if a user finds an e-commerce website via a Google Search, but then clicks an internal link with a UTM tag, the UTM tracking parameter fractures your Google Analytics session attribution and incorrectly overwrites the event-scoped acquisition source. This means that Google Analytics 4 might incorrectly attribute the eventual sale to the internal link rather than organic search! The attribution can be heavily damaged. Most people working in organic search don’t realize how this damages their SEO efforts.

    REMEMBER: Regarding analytics, UTM tracking parameters on internal links can seriously damage attribution, even in Google Analytics 4! Avoid them!

Standard URL Parameters Vs. UTM Tracking Parameters

There are a lot of standard and highly necessary parameters like pagination: think of ?page=2 or internal site search (?q=shoes), or faceted navigation to sort/filter.

While tracking parameters have no place in internal links, functional URL parameters are valid! They simply require proper management to avoid messing the website structure.

Unlike external links, internal links let you control exactly how link equity flows through your site. But you can damage your backlink profile by using tracking parameters on your internal links!

Here’s what’s behind those URL parameters:

• ?utm_source= is the “who” because this URL parameter tells you exactly who sent the traffic (it identifies the specific advertiser, website or publication).

• ?utm_content= is the “which” because it is used to differentiate similar links within the exact same campaign or page (it is heavily used in A/B testing or to see where people clicked).

• ?utm_medium= the “how” because this tells you the marketing channel or method used to get the traffic to you

• ?utm_campaign= the “what” because this parameter identifies the specific promotion or goal behind the link. It groups all of your marketing efforts together under one specific umbrella, regardless of the different sources or mediums you are using to promote it.

You don’t need to know the source, the medium or the campaign when users go from one internal link to another. It is internal traffic.

Internal tracking parameters can damage the backlink profile

If a user decides to share one of your pages on a forum or social platform, they will likely copy the URL exactly as it appears in their browser. If your internal links use UTM parameters, the user might inadvertently share that tracked link. Now, that external backlink contains your internal UTM code, which permanently fractures session attribution and wastes crawl budget.

Crawl budget waste and crawl depth damage

I’ve worked on a lot of enterprise SEO projects where the average crawling datasets can be in the hundreds of gigabytes (that’s quite large for a set of URLs).

Weeks ago I noticed that the internal URLs of website had exploded between the last crawling cycles. No major change occurred. This was abnormal.

To show how tracking parameters on internal links created a major issue, let’s start with this graph showing the distribution of each different URL status at each crawl depth before adding UTM tracking parameters to a fraction of the internal links:


Here’s the second crawling cycle after UTM tracking parameters were added to a few internal links:


On the left side of this problematic “after” graph, we notice the usual bump in URLs with a crawl depth of 2, 3 and 4. But at the extreme right, the abnormal surge in URLs with a crawl depth of 10+ is as spectacular as it is negative.

In an ideal world, no URL should require more than 3 clicks for users. This means a crawl depth of 3 for crawlers.

On the problematic graph above, we can see over 860,000 URLs with a crawl depth of 10 or more. Among those URLs, over 670,000 URLs were internal URLs with UTM parameters!

Anatomy of a UTM Tracking Parameter Crawl Trap

Take a look at the crawl path below: it illustrates how search engine bots get trapped digging through 10 levels of UTM tracking parameters on internal URLs.


Some developers and SEOs looking at the screenshot below might think, “If these URLs are canonicalized, Google knows they are duplicates, so what’s the big deal?

Crawling always precedes indexing: while canonical tags might prevent these UTM URLs from being indexed, crawlers still have to crawl them to discover the canonical tag in the first place. Therefore, the crawl budget allocated to your website is still being aggressively wasted!

Observe the increase in internal URLs between the two technical SEO audits. This brand had 381.1k internal URLs during the first crawling cycle but 1.2 million internal URLs during the second crawling cycle! Those internal URLs might not all be indexed but many will be crawled. What a waste of time!


CSS Class Tracking: too fragile to be a good fix

Instead of changing the destination URL and adding a UTM parameter to track where a click came from, most technical SEO experts would add an invisible label such as a CSS class to the link’s HTML code. In theory, that’s great, but in practice I’ll explain why that’s too fragile to be the optimal method.

Analytics tools like Google Tag Manager silently listen for clicks on these specific data attributes in the background without modifying the URL.

Therefore, to track a “Buy Now” button in the website header, we have 3 options, from the worst to the best:

  • The Outdated Way: UTM Parameter Tracking 
    <a href="brand.com/checkout?clicked=header_buy_button">Buy Now</a> 
    ❌ Creates ugly, SEO-unfriendly URLs
  • The Fragile Way: CSS Class Tracking 
    <a href="brand.com/checkout" class="header-btn track-buy-button">Buy Now</a> 
    ❌ Clean URLs but easily broken by design updates
  • The Ideal Way: Data Attribute Tracking
    <a href="brand.com/checkout" class="header-btn" data-track="header-buy-button">Buy Now</a> 
    ✅ Clean URLs and unbreakable tracking, even when CSS is modified!


Tracking method showdown! UTM Parameters vs. CSS Classes vs. Data Attributes

Tracking MethodClean URLs?RobustnessSEO & AnalyticsBest Use Case
UTM ParametersNo! Creates ugly URLs that might be shared externally.NoCauses crawl budget waste and breaks analytics attribution.Strictly for inbound traffic from external sources.
CSS Class TrackingYes. URLs remain clean.No. Very fragile and easily broken by design updates.Preserves crawl budget, but tracking silently breaks if a developer renames the styling class!Sub-optimal method. Too fragile in practice.
Data AttributesYes. Users and crawlers only see clean URLs.Yes, robust! Unbreakable tracking, even when CSS is modified.Separates presentation from analytics. Keeps sessions intact and protects crawl budget!The ideal solution for internal tracking!

So, what is a Data Attribute?

In HTML5, any attribute that starts with data- is a custom data attribute.

Data attributes are great because they allow developers to embed extra structured data directly onto an HTML element. 

A data attribute doesn’t affect how the element looks, and it doesn’t break HTML validation. It just sits there quietly waiting for a script (like Google Tag Manager) to read it! 🙂

Here are a few practical examples of how they are used in the wild.

Tracking e-commerce user behaviour via Data Attributes

Data attributes are the absolute gold standard for e-commerce tracking. If a user clicks on a promotional homepage banner, the analytics platform needs to know exactly what they added, how much it costs, and its ID.

<a href="brand.com/product/headphones" 
   class="promo-banner-btn" 
   data-track="homepage-promo-click"
   data-product-id="SKU-98765"
   data-product-name="Wireless Noise-Canceling Headphones"
   data-price="299.99"
   data-category="electronics">
   Buy Now
</a>

With data attributes, your tracking script simply reads the clean structured data hidden inside the button they clicked! This applies to everything: banners, footer links, navigational menus, etc.

Remember: CSS classes (like class=”button-large”) are instructions for the design, and data attributes (like data-click-type=”purchase”) are reliable data for the analyst’s tools. 

Always keep your analytics tracking logic isolated from your website’s visual styling!

Technical SEO notes: data-* attributes do not provide any structural or semantic meaning to the browser, search engines, or screen readers. They are completely invisible to them. Their only job is to act as a hidden storage locker for data that your JavaScript (or Google Tag Manager) can easily grab when an action occurs.

My 5-Step Optimal Tracking Strategy

Here is how your development and marketing teams should collaborate to implement my optimal strategy:

  1. Assign the attribute: A developer adds a descriptive data attribute to the links you want to track ( data-track="nav-link"data-track="footer-promo"data-track="hero-cta").
  2. Set up a “Listener”: In a Tag Management System like Google Tag Manager, you set up a “Trigger” that listens for any clicks happening on the website.
  3. Fire the tag: You tell the trigger: “If a user clicks an HTML element containing the attribute data-track="hero-cta", fire an analytics event”.
  4. Send to Google Analytics: GTM sends a clean event to Google Analytics 4 or your analytics tool of choice. The event could be called internal_link_click with a parameter of link_location = hero.
  5. Map the Custom Dimension (Crucial): developers or analysts must map this new parameter (link_location) to a Custom Dimension within the GA4 interface. If you skip this step, the parameter data is technically collected by Google Analytics, but it will remain completely invisible in standard reports!

Organic Search Benefits of Data Attribute Tracking (Vs. CSS Class Tracking Vs. UTM parameters)

  • Clean URLs: users, search engines and AI crawlers only see clean, readable URLs. And only one version.
  • Accurate attribution: your analytics sessions stay intact. You know exactly where your users originally came from. If a user comes from Google Search, the Google Analytics session won’t be reset because of an internal URL parameter.
  • Scalability: you can apply a single data attribute like data-track='sidebar-link' to dozens of links at once, and your tag manager will automatically track all of them without needing to modify every single URL!

How to instantly stop crawling via robots.txt

When a website has an abnormal crawl depth because of UTM tracking parameters on internal links, immediate action is needed. The objective is simple: you must move the tracking logic out of the href links.

Correcting and implementing “event tracking” takes time, but you can stop the crawl budget waste today by adding the following crawling directives. This will immediately stop search engine spiders from falling into these infinite crawling dead ends.

Here are the directives to add to your robots.txt file to block the crawling of UTM parameters:

User-agent: *
Disallow: /*utm_source=
Disallow: /*utm_medium=
Disallow: /*utm_campaign=
Disallow: /*utm_content=
Disallow: /*utm_term=

This will prevent crawling and save crawl budget instantly! But this does not remove currently indexed URLs. And this does not solve the root issue: you should still get rid of any UTM tracking parameters on internal links.

WARNING: If you block a URL in robots.txt, search engines cannot crawl it to read the canonical tag. If those UTM links are heavily linked internally, Google might still index them as URL-only results.

While robots.txt stops crawl waste instantly, the long-term fix is removing the links. That’s the only way to allow consolidation of link equity.


If you need to push back against using UTM tracking parameters on internal links, let this article be your evidence! Share my optimized tracking strategy with your development and analytics teams and once you swap those messy URLs for clean data attributes you’ll be well on your way to better analytics data and a healthier crawl budget!

Elie Berreby – March, 19 2026