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.