DevDockTools

Duplicate Title Tags: How to Find and Fix Them at Scale

A practical workflow for finding every duplicate title tag on a large site and fixing the templates that cause them, not just the symptoms.

By Daniel Agrici6 min read
title tagstechnical seoduplicate contentsite auditseo

On a small site, duplicate title tags are usually a content problem — two people wrote about the same thing and used the same title. On a large site, they're almost always a templating problem, and that distinction matters because it changes where you fix it. Editing five hundred individual pages to give them unique titles is a losing strategy if the template generating page five hundred and one will produce the exact same duplicate tomorrow.

Finding Every Duplicate, Not Just the Obvious Ones

Crawl the site and group by title

A full crawl (via a crawler tool, or your own script hitting the sitemap) that extracts every <title> and groups pages by exact title text is the fastest way to see the real scope. Cross-reference against your Sitemap Generator output to make sure the crawl actually covers every URL you intend to have indexed — duplicates hiding in URLs missing from the sitemap are easy to miss if you only crawl from internal links.

// Minimal grouping logic once you have {url, title} pairs
function findDuplicateTitles(pages) {
  const byTitle = new Map();
  for (const { url, title } of pages) {
    const key = title.trim().toLowerCase();
    if (!byTitle.has(key)) byTitle.set(key, []);
    byTitle.get(key).push(url);
  }
  return [...byTitle.entries()].filter(([, urls]) => urls.length > 1);
}

Google Search Console as a secondary source

Search Console's Pages report doesn't list duplicate titles directly, but pages Google has chosen to rewrite the title for are a strong hint — if the "how Google sees" a page's title differs from what you shipped, duplication or a low-signal title is a common cause. It's not a substitute for a full crawl, but it's a free cross-check against real indexing behavior.

The Templates That Actually Cause This

Pagination without a page indicator

<!-- Page 1 -->
<title>Running Shoes | Example Store</title>
<!-- Page 2, 3, 4... — same title, different products -->
<title>Running Shoes | Example Store</title>

Fix: include the page number once you're past page 1.

<title>Running Shoes (Page 2) | Example Store</title>

Faceted navigation / filters

Filtered views (?color=red, ?size=large) frequently inherit the parent category's title verbatim. If the filtered page is meant to be indexed as a distinct landing page, the title needs to reflect the filter. If it isn't meant to be indexed independently, the better fix is usually a canonical to the unfiltered page (see the pagination and canonical discussion in a related decision) rather than trying to hand-write unique titles for every filter combination.

Empty fallback fields

A CMS field for "custom title" that falls back to a generic default when empty is one of the most common large-scale causes — every page where an editor skipped that field silently collapses onto the same fallback title.

// This looks reasonable and quietly produces thousands of duplicates
const title = page.customTitle || "Products | Example Store";

Fix: generate a fallback from page-specific data instead of a static string.

const title = page.customTitle || `${page.name} | Example Store`;

Boilerplate suffixes swallowing the unique part

If your title format is {Page Title} — {30-character brand tagline}, and the page title field itself is short or gets truncated in display, two genuinely different pages can end up looking identical in a title tag that's mostly boilerplate. Keep the unique, page-specific portion first and the boilerplate short.

International sites: hreflang without locale-specific titles

Multi-locale sites add a variant of the fallback problem: an /en/, /en-gb/, and /en-au/ version of the same page frequently reuse the exact same English title because only the content (currency, spelling, regional examples) actually changed. hreflang tells search engines these are alternate versions of the same page for different regions, which is a different signal than a title duplicate on unrelated pages — a search engine may treat the shared title as expected rather than a quality issue, since it already knows the pages are linked variants. That said, if the underlying content is genuinely identical across locales (not just localized), the title collision is a symptom of a bigger issue: thin, low-differentiation regional pages that may not deserve to be indexed separately at all.

Canonical tags and duplicate titles aren't the same fix

It's tempting to treat a rel="canonical" tag as the fix for a duplicate title, but they solve different problems. A canonical tells search engines "index this URL instead of this one" — appropriate when the filtered/paginated page shouldn't rank independently at all. A unique title is appropriate when the page should be indexed on its own merits but currently looks identical to another page. Applying canonical to a page that legitimately deserves its own ranking (like a real page-2 of a paginated list someone might search for directly) suppresses it from search entirely, which is a worse outcome than a duplicate title would have been. Decide indexability first, then decide whether the title needs to be unique.

Fixing at Scale: Template, Not Page-by-Page

| Cause | Where to fix | | --- | --- | | Pagination reuses category title | Pagination template — inject page number conditionally | | Faceted URLs inherit parent title | Filter template — either generate distinct titles or canonicalize away instead | | Empty CMS field falls back to static string | Fallback logic — derive from page data instead of a constant | | Legitimate one-off duplicate content (rare) | Individual page — merge the pages or differentiate content, not just the title |

Once the template is fixed, the fix applies retroactively across every page using it — that's the leverage a page-by-page edit doesn't have. Re-run the crawl afterward to confirm the duplicate count actually collapsed rather than assuming the template fix worked.

Writing Titles That Won't Collide

A title format built from real per-page variables is inherently harder to duplicate than one built mostly from static text:

<title>{Product Name} – {Category} | {Brand}</title>
<title>{Article Title} | {Brand} Blog</title>

Validate the rendered output for a representative sample of pages — not just the template source — with the Meta Tags Generator before rolling a title template change out sitewide, since template logic that looks correct in isolation can still produce unexpected duplicates when combined with real, messy production data (empty fields, truncated strings, unicode edge cases).

Decision Point

If duplicates are concentrated in one template family (pagination, a specific filter type, a specific content type with a shared fallback), fix the template — it's a single change with sitewide leverage. If duplicates are scattered and don't correlate with any one template, they're more likely genuine content overlap, and the fix is editorial: merge the pages, or differentiate the content enough that unique titles reflect a real difference rather than papering over one.

Frequently Asked Questions

Do duplicate title tags actually hurt SEO?
They don't trigger a penalty, but they make it harder for search engines to tell which of your pages is the best match for a given query, and Google may rewrite a duplicated or unclear title in search results rather than using the one you wrote. Practically, duplicates suppress differentiation between pages that should be ranking for different queries.
What's the most common cause of duplicate title tags on large sites?
A shared template that doesn't inject a unique variable — pagination pages that reuse the category title with no page number, faceted/filtered URLs that render the same title as the unfiltered page, or a fallback title used whenever a page-specific field is empty.
How many duplicate titles is 'normal' on a large site?
There's no universal threshold, but any duplicate count that scales with your URL count rather than staying flat points to a templating issue, not isolated content gaps. A handful of true one-off duplicates (near-identical variant pages) is common and low-priority; thousands from one template is a structural bug worth fixing at the source.