Title Tag and H1 Mismatch Causes Google Rewrites

Your `<title>` and `<h1>` say different things, so Google trusts neither and rewrites your SERP title. Align them and re-request indexing to get your title back.

Your page sets <title>Best Wireless Headphones 2026 | Acme Reviews</title> but the visible <h1> reads “We tested 47 pairs of headphones so you don’t have to.” Google sees two competing signals about what the page is about and rewrites your SERP title — usually to your H1 or a clipped fragment of body copy. Click-through drops.

Fastest fix: make the <title> and <h1> describe the same thing using the same head words (the <title> may add a short clarifier or brand suffix), confirm there is exactly one <h1> whose text ships in the server HTML, then re-request indexing for the affected URLs. Rewrites typically stop within 2-3 crawls.

This matters more than it used to. Google rewrote about 76% of title tags it sampled in Q1 2025, and in modified titles it removed the brand name roughly 63% of the time and dropped about 2.71 words on average (SerpClix study data, still the most-cited figure as of June 2026). Titles Google left alone clustered in the 30-60 character range. So a clean, aligned, sub-60-character title is your best defense.

Google’s own Influencing title links doc lists what it pulls from when building the SERP title: the <title> element, the main visual title on the page, <h1> and other headings, og:title, large/prominent styled text, anchor text in links pointing to the page, and WebSite structured data. When these disagree, Google picks for itself — and it almost always trusts the visible H1 over the <title> because the H1 reflects what users actually see.

Which bucket are you in

Google’s doc names six conditions that trigger a rewrite. Match your symptom to the cause and jump to the fix.

Symptom you see in the SERPLikely causeGo to
Google shows your H1 instead of your title<title> and <h1> disagree; Google trusts H1Steps 2-3
Brand suffix dropped, rest keptTitle too long; Google trims ” | Brand”Step 4
SERP title is a sentence from your body copyNo clear main title / H1 missing or emptySteps 5-6
Same generic title across many pagesMicro-boilerplate (templated title)Step 2
Title shows but H1 area is blank in curlH1 set by JavaScript after first renderStep 6
SERP title in a different language than the pageWriting-system / language mismatchStep 6 note

Common causes

Ordered by frequency.

1. CMS title field and H1 source are different fields

The CMS has a “SEO Title” and a separate “Headline” field. Editors fill in “Headline” but the template uses “SEO Title” for <title> and “Headline” for <h1>. They drift apart from day one. This also produces Google’s “micro-boilerplate” trigger when the “SEO Title” field is left to a templated default like “Article | Acme.”

How to spot it: Check three articles. If <title> and <h1> rarely match, the field design is the root cause.

2. Template appends a brand suffix only to <title>

<title> becomes “How to Bake Sourdough | Acme Cooking” while <h1> stays “How to Bake Sourdough.” Minor mismatch, but if the full string runs long Google strips the brand — and brand removal is the single most common edit Google makes (about 63% of rewritten titles, per the same 2025 study).

How to spot it: <title> ends with ” | Brand” or ” - Brand”; <h1> does not, and the rewritten SERP title has no brand.

3. H1 is creative / clickbait, <title> is SEO-optimized

The editorial team writes a punchy H1 (“Why my sourdough finally stopped collapsing”). The SEO team rewrites the title tag to be keyword-dense (“Sourdough Bread Recipe — Step-by-Step Guide”). Both are intentional and opposed. This is Google’s “inaccurate title” trigger: the <title> reads like a category label that doesn’t match the page’s real, visible topic.

How to spot it: H1 reads like a blog headline, <title> reads like a category page. Both can be good copy independently; together they confuse search engines.

4. Multiple H1s on the page

Page has <h1>Category Name</h1> in a hero region and <h1>Article Title</h1> in the main content. This is Google’s literal “no clear main title” trigger — multiple headings of equal prominence, so Google cannot tell which is the page’s H1.

How to spot it: run document.querySelectorAll('h1').length in DevTools; anything greater than 1 is a problem.

5. H1 is an image with no alt text

<h1><img src="/heading.svg"></h1> — the visible heading is an SVG with no alt. Google has no text for the H1 at all and falls back to <title> and body text, which can then be rewritten if the title lacks context.

How to spot it: View source, search for <h1> and confirm it contains no text content other than empty <img> tags.

6. Dynamic H1 set by JavaScript after first render

The HTML response has <h1>Loading...</h1> and JS replaces it post-mount. Googlebot renders most pages, but it batches rendering and may index the pre-render HTML first; a placeholder H1 looks broken in the meantime.

How to spot it: curl the page and look at <h1>. If it says “Loading…” or is empty, the dynamic title pattern is at fault. See also Dynamic Title Set by JavaScript Not Indexed.

7. Title and page in different writing systems

The <title> is in English but the page body and H1 are in another language (or vice versa). Google flags this as a writing-system mismatch and substitutes a title that matches the page’s primary language.

How to spot it: compare the script of the <title> against the dominant script of the rendered body text.

Before you start

  • Pull a list of 10-20 pages where Google rewrote the title in the last 30 days (Search Console, Performance report, filter by impressions, then check the rendered SERP for those URLs).
  • Note whether the rewrites are consistent (same pattern every time) or random.
  • Capture the current <title> and <h1> for each affected URL.
  • Decide your policy: should H1 and <title> match exactly, or should <title> extend H1 with a brand suffix?

Information to collect

  • The CMS field names that drive <title> and <h1>.
  • The template code that emits each, plus your og:title source (Google reads it too).
  • Whether your site has a global brand-suffix transform on <title>.
  • Any pages with multiple <h1> elements (run a crawl with structural extraction).
  • Server-rendered HTML for affected URLs (do not rely on DevTools, which shows post-hydration state).

Step-by-step fix

Ordered cheapest first.

Step 1: Audit current state

for url in $(cat affected-urls.txt); do
  html=$(curl -s "$url")
  title=$(echo "$html" | grep -oE '<title>[^<]+</title>' | head -1)
  h1=$(echo "$html" | grep -oE '<h1[^>]*>[^<]+</h1>' | head -1)
  echo "$url | $title | $h1"
done

Pipe the output into a spreadsheet so you can quickly see where mismatches concentrate. Because Googlebot also reads og:title, grep for it too and confirm it agrees with the <title>.

Step 2: Unify the CMS field

Collapse “SEO Title” and “Headline” into a single source field for content where they should always agree:

// content schema
title: z.string().min(20).max(60),  // single source, kept under the 60-char sweet spot

// template
<title>{article.title}{brandSuffix(article.section)}</title>
<h1>{article.title}</h1>

For content types where they should differ intentionally (e.g., listicles), keep both fields but enforce a similarity check in CI (Step 3).

Step 3: Add a similarity check in CI

function tokenJaccard(a: string, b: string): number {
  const toks = (s: string) => new Set(s.toLowerCase().match(/\w+/g) ?? []);
  const A = toks(a), B = toks(b);
  const inter = [...A].filter(x => B.has(x)).length;
  return inter / (A.size + B.size - inter);
}

for (const article of allArticles) {
  const score = tokenJaccard(article.title, article.h1);
  if (score < 0.5) {
    console.warn(`Low similarity: ${article.slug}: ${score.toFixed(2)}`);
  }
}

Fail the build (or warn) when title and H1 share less than half their content words. A score of 1.0 means identical word sets; “Sourdough Bread Recipe” vs “Sourdough Bread Recipe — Step-by-Step Guide” scores about 0.6, which is healthy.

Step 4: Strip the brand suffix from <title> for long titles

Google trims the brand first when a title runs long, so do it yourself before Google does. If <title> exceeds ~60 characters with the brand suffix, drop the suffix:

const FULL = `${article.title} | ${BRAND}`;
const titleTag = FULL.length > 60 ? article.title : FULL;

Or unify by keeping the brand in the <title> only and out of the <h1>:

<title>{article.title} | {BRAND}</title>
<h1>{article.title}</h1>  // brand omitted from H1, kept in template chrome only

Either policy is fine — just be consistent.

Step 5: Enforce one <h1> per page

This directly clears Google’s “no clear main title” trigger. In your template:

{article && <h1>{article.title}</h1>}
{!article && pageType === 'category' && <h1>{categoryName}</h1>}
{/* no h1 in hero block — switch to h2 */}

Crawl the site post-fix and assert exactly one <h1> per page. Note that HTML5 allows multiple <h1> elements as valid markup, but for predictable SERP titles you still want one dominant heading.

Step 6: Render H1 text server-side, always

Never set H1 from JavaScript after first render. Ship the final H1 text in the HTML response, and keep your <title> and og:title server-rendered too. If a heading is shown as an image, use a real <h1> with text and style it with CSS — do not rely on alt alone. For multilingual sites, make sure the <title> is in the same language as the page body to avoid Google’s writing-system-mismatch rewrite.

Step 7: Re-request indexing on the fixed URLs

Send your top URLs through URL Inspection, then “Request indexing.” As of June 2026, Search Console caps this at roughly 10-12 URLs per day per property, and the request is a hint, not a command — Google recrawls on its own schedule. For larger batches, resubmit the affected sitemap and let normal crawling pick up the change. Track SERP titles weekly; rewrites typically stop within 2-3 crawls of the fix.

How to confirm it’s fixed

  • curl any affected URL and confirm the final <h1> text appears directly in the response (not “Loading…”).
  • Title and H1 for sampled URLs match or are clearly the same idea; og:title agrees too.
  • No URL has more than one <h1> (re-run the DevTools count).
  • In URL Inspection, the rendered HTML shows your intended title and a single H1.
  • Over the following weeks, Search Console’s Performance report shows the previously-rewritten URLs recovering impressions/CTR, and a spot-check of the live SERP shows your title (not a body-copy fragment).

Long-term prevention

  • Pick one editorial policy: either H1 and <title> match, or <title> is H1 plus a controlled, short suffix. Document it.
  • Use a single source field for the headline in the CMS; derive <title> and <h1> (and og:title) from it.
  • Keep titles in the 30-60 character range — the band Google leaves alone most often.
  • Add CI assertions for title/H1 similarity and a single H1.
  • Avoid dynamic H1 patterns; if you must, ship the final text server-side.
  • Audit Google-rewrite incidents monthly to catch regressions before they affect rankings.

Common pitfalls

  • Adding a session ID or A/B variant to <title> only. Editors do not see it; Google does.
  • Treating “Google rewrote my title” as random and giving up. It is highly deterministic — the trigger is usually one of the six causes above.
  • Setting <h1> invisible via CSS display:none thinking Google ignores hidden text. Google still parses it as the H1 and the cloaking pattern is risky.
  • Wrapping the heading in a <div> with role="heading" instead of an actual <h1> element. Use the real tag.
  • Keeping a five-word H1 and a sixteen-word <title>. The length and content gap is itself a mismatch signal.
  • Forgetting og:title. If it contradicts your <title>, you have re-created the same mismatch one layer down.

FAQ

Q: Should <title> and <h1> be identical?

They can differ but should share the bulk of meaningful words. A common pattern: H1 = “Sourdough Bread Recipe,” <title> = “Sourdough Bread Recipe — Step-by-Step Guide | Acme.” The added clarifier is fine; a completely unrelated <title> is what gets rewritten.

Q: Google is showing my H1 as the title instead of my <title>. Why?

Because Google decided the H1 describes the page better. When the two disagree, Google almost always trusts the visible heading. Align the <title> to the H1’s head words and it will usually go back to using your <title>.

Q: Can I have zero H1?

It is technically valid HTML, but Google uses the H1 as one of several signals for what the page is about. Zero H1 forces a fallback to <title>, og:title, and body text, which makes rewrites more likely.

Q: Does Google always rewrite mismatched titles?

No, but it is common — roughly three in four sampled titles were rewritten in 2025. Mismatch with H1 is one of six named triggers (half-empty, obsolete, inaccurate, micro-boilerplate, no clear main title, language mismatch). Fixing the mismatch lowers the odds; it does not guarantee Google keeps your title forever.

Q: How long until my real title comes back after I fix it?

Usually within 2-3 crawls of the changed page. You can nudge it with URL Inspection’s “Request indexing” (capped around 10-12 URLs/day per property as of June 2026), but it is a hint — Google recrawls on its own cadence.

Q: My H1 is a logo image. Is that bad for SEO?

Yes — Google needs text. Use a real <h1> with text content, then style it with CSS to show the logo, or move the logo to a sibling element and keep the H1 textual.

Tags: #SEO #Troubleshooting #title-tag #h1 #google-rewrite