Duplicate Titles Across Many Pages

Audit flags 80 pages sharing the same `<title>`. Usually template fallback, pagination, or bilingual collision. Make per-page title required and CI-enforced.

A crawl audit reports “80 pages share the exact same <title>.” You investigate — they’re all “MySite Blog” or all “MySite — Tag Page” or all “Article on MySite.” Google can’t distinguish them in SERPs, your CTR is awful for these pages, and the audit tool’s score keeps your site flagged red.

Duplicate titles dilute ranking signals and signal lazy SEO to Google. Most duplicates come from one of six patterns: template fallback when per-page title is missing, paginated lists (“Posts — Page 2”), bilingual pages without locale markers, machine-generated tag pages, content-management mistakes, or syndicated re-prints. Fix is per-page title required + CI assertion no two indexable pages share one.

Common causes

Ordered by hit rate, highest first.

1. Template fallback applies when per-page title is missing

You wrote title: in frontmatter for the article body, but the template falls back to “MySite Blog” when the field is empty. Several articles you didn’t fill the title for now share the fallback.

How to spot it: Pages with the fallback all also have empty title: in frontmatter. grep -L "^title:" src/content/articles/**/*.mdx lists them.

2. Paginated lists (“Page 2,” “Page 3”) share their parent’s title

Your /blog/ page is “MySite Blog.” /blog/page/2/ is also “MySite Blog.” /blog/page/3/ same. Pagination wasn’t reflected in title.

How to spot it: URL patterns /page/N/ or ?page=N with identical <title>. Pagination is differentiating URL but not title.

3. Bilingual pages without locale markers

/en/articles/topic/ and /zh/articles/topic/ both have <title>Topic</title>. Google deduplicates them despite distinct URLs.

How to spot it: Same translationKey pair, identical title. The ZH version should at least have ZH chars; both having “Topic” means template didn’t localize.

4. Auto-generated tag/archive pages

50 tag pages all titled “Tagged: ${tagName}” — but the template only emitted “Tagged: ” without the tag substitution. They’re all literally <title>Tagged: </title>.

How to spot it: Pattern of pages with format-string artifacts in <title>. Template variable substitution failed.

5. CMS / bulk-edit collapsed multiple titles into one

A “find and replace” or normalize script overwrote title: across many files. Now they share a template-derived title.

How to spot it: git log --all -p -S "title:" -- src/content/articles/ near a recent bulk-edit. Look for an edit that set many title: lines to the same value.

6. Syndicated / imported content kept the original site’s title

Articles imported from a partner blog kept their original <title> — which is now your <title> for 50 pages. All identical to the partner’s old format.

How to spot it: The shared title is suspiciously branded for a different site or contains a date format your site doesn’t use.

Shortest path to fix

Ordered by ROI. Step 1 audits; Step 2 + 5 prevent recurrence.

Step 1: Crawl and export, group duplicates

# Use Screaming Frog, Sitebulb, or your own crawler
# Export URL + <title> as CSV
# Group by title; sort by count descending

You’ll see the top duplicate clusters. Focus on the largest first — fixing 80 pages with the same title beats fixing 5 small duplications.

Step 2: For each duplicate group, decide differentiation

Cluster typeFix
Template fallbackMake title: required; fail build if missing
PaginationAppend ” — Page 2” / ” — Page 3”
Bilingual collisionAdd a locale suffix to disambiguate each language’s title (e.g., ” — English” / ” — Chinese”)
Tag page format-string bugFix template variable substitution
Bulk-edit overwriteRestore from git log or rewrite per page
Imported syndicated contentRewrite titles to match your style

Step 3: Rewrite titles to be search-distinct

A unique title isn’t enough — it should also be searchable. Add specifics:

Bad: "Article" (unique but useless)
Good: "Claude API streaming responses — step-by-step (2026)"

Differentiation through specificity, not just adding numbers.

Step 4: Re-submit sitemap and request re-indexing

After fixing titles:

# Astro / static-site generators usually rebuild sitemap on build
pnpm build

# In GSC: Sitemaps → resubmit the URL
# For specific high-traffic pages: URL Inspection → Request Indexing

Google won’t see the new titles until it recrawls. Submit explicitly to speed it up.

Step 5: Add CI assertion: no duplicate titles

// scripts/check-unique-titles.mjs
import fs from "node:fs";
import path from "node:path";
import matter from "gray-matter";

const seen = new Map();
const issues = [];

function walk(dir) {
  for (const name of fs.readdirSync(dir)) {
    const p = path.join(dir, name);
    if (fs.statSync(p).isDirectory()) walk(p);
    else if (p.endsWith(".mdx") || p.endsWith(".md")) {
      const { data } = matter(fs.readFileSync(p, "utf8"));
      if (data.draft) continue;
      const title = (data.title || "").trim();
      if (!title) { issues.push(`MISSING TITLE: ${p}`); continue; }
      if (seen.has(title)) issues.push(`DUPLICATE: ${p} == ${seen.get(title)}`);
      else seen.set(title, p);
    }
  }
}

walk("src/content/articles");
if (issues.length) {
  console.error(issues.join("\n"));
  process.exit(1);
}

Wire into prebuild. Now duplicates and missing titles fail CI.

Step 6: For unavoidable duplicates, noindex

Some duplicates are legitimate (e.g., /login, /404, /about cousins). For those, add noindex rather than fighting to differentiate. Focus the unique-title rule on indexable, organic-traffic-eligible pages.

Prevention

  • Per-page title is required; build fails without it (no template fallback)
  • CI assertion: no two indexable pages share a <title>
  • Pagination, language, and tag templates emit distinct titles by construction
  • Quarterly: crawl + audit for new duplicates from imported / migrated content
  • Bulk-edit scripts must preserve per-page titles; if they need to rewrite, log + review
  • Differentiation by specificity (descriptive titles), not just append ” v2”

Tags: #Content ops #Site quality #Site audit #Troubleshooting #Duplicate title