squirrelscan
GitHub

H1 and title that share no word: two topics for one page

A page whose title and H1 share no meaningful word sends two different signals about its subject. squirrel compares the content words of both.

What H1 and title alignment is

The <title> is what a search result shows. The H1 is the first thing a visitor reads once they land. They do different jobs and should not be copies of each other, but they should be about the same thing. When they share no meaningful word, search engines get two different signals for the page’s topic, and a reader who clicked a result for one phrase lands under a heading about something else.

A real example: the title targets “Reddit Visibility Services, SEO & AI Search” while the H1 reads “Be recommended by AI and showed on Google”. Nothing in the heading matches the phrase the title targets.

What squirrel checks

The rule runs on every crawled page that has exactly one non-empty H1 and a title. It emits a single check named h1-title-alignment:

  • Info when the title and the H1 share no content word, and both sides have at least two. Message: The H1 and the title share no meaningful word, with both strings shown as items. Severity info, weight 3: it never lowers the score. details.confident is true for the stricter case, a page at least two segments below the root (/blog/post, /de/products/shoe) that is not a homepage or generic marketing page, with at least three topic words on each side.
  • Info when the H1 and the title are identical, character for character, on a page whose title carries more than the brand. Message: The H1 and the title are identical: the title could target a second phrase. That is a missed chance, not an error.
  • Pass when at least one content word is shared. Message: The H1 and the title share a meaningful word.
  • Skipped, with the reason as the message, when there is no H1, several H1s or an empty one (core/h1 reports those), no title (core/meta-title does), the title is only the brand, either side has too few content words to compare, the page language has no stopword list, the title or H1 is mostly non-Latin text, the H1 text looks like code, or the words of the H1 run together without a space (voorBedrijven, forFree: a word that starts in lower case and has a lower-to-upper hump splitting off a stopword, usually a <br> or <span> with no whitespace around it; a capitalised word such as YouTube is a brand, not a glue). A skipped page is never counted as a pass.

Why info and not a warning: on 115,556 stored pages only a minority of the mismatches were real by hand judgement (roughly 10 to 20 percent): a homepage title copied onto a privacy, login or terms page, or a blog whose H1 is the site name. The rest are headlines that pitch where the title describes (“Workflows that run the business for you” under “Use cases | Adoment”), and synonym pairs, so a default warning would mostly be noise. The rule tells you where to look.

Pages kept out of search (noindex) are skipped by the runner, on a site that is itself indexed; see pages kept out of search.

The homepage and marketing pages

A creative headline is deliberate on a homepage, so the finding carries details.pageKind and is never confident there. The homepage here means the root path (/), a localized root (/de/, /pt-br/, /en_gb) and an index file (/index.html, /de/index.php). The same goes for a generic marketing page, a single path segment of about, about-us, features, pricing, plans, contact, faq, services, company, team, support or help (and their German, French, Spanish, Portuguese, Italian and Dutch forms, such as preise, tarifs, precios), with or without a locale prefix. A subpage such as /pricing/enterprise is not one.

How the words are compared

Both strings are NFKC-normalised, lower-cased and stripped of diacritics, then split into words. Dropped: pure numbers, words under three letters (an all-caps pair such as AI, UX or EA is kept, because it usually names the subject), the stopwords of the page language, and generic words that say nothing about a topic (free, online, best, new, guide, tool, and page-kind words such as about, contact, pricing, features and blog, with their equivalents), which cannot make a match on their own. The title and H1 are read up to 500 characters and each word up to 40. A camel-case word (CustomerSuccess) also offers its parts. At most 64 words are read per side.

Two words match when their stems are equal, or share a prefix of at least five letters that covers at least 80% of the shorter stem, or, in German and Dutch, when one stem of at least five letters sits inside the other (Damenschuhe contains Schuhe). The stemmer is light: English plurals, -ing, -ed, a silent final e (service and services, price and pricing, make and making) and a few irregular plurals (women and woman, men and man); a plural or a final vowel for the other languages. It is not a full stemmer, so unrelated forms such as run and ran do not match. A word shared with any part of the title, the brand included, counts as shared.

Stopword lists exist for English, Spanish, French, German, Portuguese, Italian and Dutch, chosen from the primary subtag of <html lang>. Every other language, and a page with no lang, is skipped: squirrel does not guess where the words are in Japanese, Chinese or Korean text, and it will not judge words it cannot read.

The brand affix

The title may carry the site name (Running Shoes for Women | Acme). A segment counts as the brand when it names the site (the og:site_name or the host’s name, such as squirrelscan for squirrelscan.com), or, in a title with several segments separated by |, -, –, —, ·, •, » or ::, when it is a short (three words or fewer) last or first segment. The brand is left out when counting the title’s content words, so a title that is only the brand is skipped and a one-word title plus the brand is too short to judge. A brand word the H1 repeats still counts as shared.

How to fix it

Reword the H1 so it carries the phrase the title targets. The H1 can be longer and more natural than the title:

<title>Reddit Visibility Services, SEO & AI Search | Acme</title>
<h1>Reddit visibility services that get you recommended by AI</h1>

Or change the title to name what the H1 promises. If the headline is deliberately creative, make sure the first paragraph names the topic and leave the finding: it is information, not a failure.

Rule IDcontent/h1-title-alignment
CategoryContent
ScopePer-page
Severityinfo
Weight3/10

Enable / disable

Disable this rule

[rules]
disable = ["content/h1-title-alignment"]

Disable all Content rules

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

Enable only this rule

[rules]
enable = ["content/h1-title-alignment"]

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.

Content findings ship in every audit next to the SEO, performance 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 Content section of the report. Each affected page shows its title and its H1 side by side. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close