squirrelscan
GitHub

Duplicate page titles: the site-wide uniqueness check

Two or more pages sharing a title after case and whitespace are normalised. squirrel groups them and lists every URL.

Why titles should be unique

A title that appears on twenty pages tells a reader choosing between twenty search results nothing. It also removes one of the clearer signals a search engine has for telling those pages apart, leaving it to work from content alone.

Duplicates are almost never written by hand. They come from a template that falls back to the site name when a page has no title of its own, from paginated listings that repeat page one’s title, and from filter or sort parameters that produce many URLs for one page of content.

What squirrel checks

The rule runs once per crawl. It normalises every non-empty page title by lowercasing it and collapsing runs of whitespace to a single space, groups pages by the result, and emits one check named title-unique:

  • Skipped with the message Need multiple pages to check uniqueness when the crawl has fewer than two pages.
  • Passing with the message All page titles are unique when no normalised title appears more than once.
  • Warning with the message N duplicate title(s) affecting M pages. Each item is one group, identified by the first 60 characters of the title, labelled with the first 40 characters and the page count, and carrying every URL in the group.

Pages with no title are skipped rather than grouped together, so a site where fifty pages have no title at all passes this check with All page titles are unique. That case belongs to core/meta-title, which reports each of them individually.

The normalisation here is stricter than content/duplicate-title, which lowercases but does not collapse whitespace. Two titles differing only by a double space are duplicates to this rule and distinct to that one.

Pages kept out of the search index are left out of the grouping. A page whose <meta name="robots"> tag or X-Robots-Tag header contains noindex (a header scoped to one crawler, such as googlebot: noindex, counts too) is not counted, because its title never competes with the others in search results. Pages are left out only on a site that is itself being indexed, judged by its homepage, or by the page the audit started from when the homepage was not fetched. When that page is noindex, as on a staging site or a preview deployment (Vercel, Netlify and Cloudflare Pages previews send X-Robots-Tag: noindex by default), every page is counted: the whole host is out of search and the audit is most likely checking it before launch. When neither page was fetched, every page is counted as well. See pages kept out of search for the full list of rules that do this.

Regional versions of one page count as one page. Two pages with the same normalised title are not reported as duplicates when all of these hold: each lists the other as a <link rel="alternate" hreflang> alternate, the hreflang values they give each other share a language (en-gb and en-us, or de-de, de-at and de-ch), and neither has a canonical URL pointing to a different page. A page with no canonical tag counts as canonical to itself, as it does for Google, so a pair with no canonical tags is merged and a pair where one page canonicalises to the other is not. A pair across languages, such as de and en, is still reported, because one title on both usually means the page was not translated. A one-way reference or an x-default entry does not merge two pages either, and a group that also holds an unrelated page is still reported with every URL in it. Only hreflang tags in the page’s HTML are read, up to 100 per page: annotations sent in an HTTP Link header or listed in a sitemap are not.

How to fix it

Give the template a title that varies with the page, and a distinct one for paginated pages:

<title>Configuring the build cache | Acme Docs</title>
<title>Guides, page 2 | Acme Docs</title>

Where the duplicates come from URL parameters serving the same content, the fix is a canonical URL rather than a new title, because those are one page rather than several.

The common false positive is a set of pages that genuinely are near-identical, such as location pages for the same service. Those still need distinct titles, and the duplicate title is a symptom of the page not being distinct either.

Rule IDcore/title-unique
CategoryCore SEO
ScopeSite-wide
Severitywarning
Weight5/10

Enable / disable

Disable this rule

[rules]
disable = ["core/title-unique"]

Disable all Core SEO rules

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

Enable only this rule

[rules]
enable = ["core/title-unique"]

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.

Core SEO findings ship in every audit next to the performance, security 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 Core SEO section of the report. Each duplicated title is listed with every page that uses it. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close