squirrelscan
GitHub

URL parameters: how many is too many, and what to do

Every parameter combination is a separate URL to a crawler. squirrel counts the query parameters on each page and names the tracking ones.

What URL parameters cost

A query parameter creates a new URL. Three filters with five values each produce well over a hundred addresses for one listing, and a crawler has no way to know in advance that most of them return near-identical content.

The cost is crawl budget spent on combinations nobody searches for, and index entries competing with each other. Tracking parameters are the simplest case: utm_source and gclid change nothing about the page, so a URL carrying one is a duplicate of the same URL without it, and pointing its canonical at the clean URL is the signal that says so. Canonical selection is still the search engine’s decision, not an instruction it has to follow.

What squirrel checks

The rule runs on every crawled page and reads the query string. It emits up to two checks:

  • url-parameters passes when there is no query string. Message: URL has no query parameters. No further checks run.
  • url-parameters warns above three parameters. Message: URL has 5 parameters (excessive), with each parameter name listed.
  • url-parameters reports info at one to three parameters. Message: URL has 2 parameter(s), with the names listed.
  • tracking-parameters reports info when any parameter name matches utm_source, utm_medium, utm_campaign, utm_term, utm_content, fbclid, gclid, ref or source, compared lowercased. Message: URL contains tracking parameters, with Use canonical tags to prevent duplicate content as the value.

Severity for the rule is info and the weight is 3. The threshold of three is fixed and not configurable.

How to fix it

<link rel="canonical" href="https://example.com/shoes" />

Point a tracking or otherwise equivalent variant at the clean URL. Parameters that select different content are different pages: ?page=2 gets its own self-referencing canonical, not one pointing at page one.

For faceted navigation, decide which combinations deserve to be indexable. Not linking the rest with crawlable hrefs limits discovery but does not keep them out of the index, because a URL can be found elsewhere. Keeping a URL out of the index takes a noindex the crawler is allowed to fetch and read.

Move content-defining values into the path where they matter: /shoes/running reads better and behaves better than /products?category=shoes&type=running.

Rule IDurl/parameters
CategoryURL Structure
ScopePer-page
Severityinfo
Weight3/10

Enable / disable

Disable this rule

[rules]
disable = ["url/parameters"]

Disable all URL Structure rules

[rules]
disable = ["url/*"]

Enable only this rule

[rules]
enable = ["url/parameters"]

enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.

URL Structure findings ship in every audit next to the SEO, performance and agent experience rules. See Fix SEO issues with AI for how an agent works through a report.

References

Check your site

Run squirrel audit https://example.com and open the URL Structure section of the report. Each URL is listed with its parameter names and count. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close