Heading hierarchy: what H1, H2 and H3 actually do
Heading tags are not a ranking factor in themselves. They do something more consequential: they describe the logical structure of the page, and that structure drives passage extraction, section links and screen reader navigation.
What each level does
| Tag | Role | Count per page |
|---|---|---|
h1 | The page subject, in one line | 1 |
h2 | Main sections, self-contained units of meaning | 4–9 |
h3 | Subdivisions within a section | 0–4 per h2 |
h4+ | Rare; usually signals an over-deep outline | Avoid |
An H2 should read standalone and still make sense. That is the most reliable test: if a section heading only means something after reading the previous section, it is not an H2.
The H1: one rule that matters
One H1 per page, distinct from the <title> but consistent with it. The title addresses the SERP — short, clickable, constrained by display width. The H1 addresses the reader who has already arrived and can be longer and more explicit.
title : Heading hierarchy: what H1, H2 and H3 actually do
h1 : Heading hierarchy: what H1, H2 and H3 actually do
Where the rendering template emits the H1 itself — as server-side rendered blog architectures typically do — the stored body HTML must not contain a second one. Duplicate H1s are among the most common defects in generated batches, and they come from exactly this mismatch.
Five hierarchy mistakes in generated batches
- Skipping a level. An
h4directly after anh2breaks the document outline and screen reader navigation. - Using a heading for styling. Choosing
h3because the font size looks right. Styling belongs in CSS. - Generic H2s. "Introduction", "Conclusion", "Final thoughts" say nothing about the content beneath them.
- The same outline on 500 pages. If every H2 is identical across the batch, the structure becomes a detectable repeating pattern — see the scaled content policy.
- Headings with no id. Without an
id, no section links and no generated table of contents.
A heading template for a generated batch
h1 {primary intent, in natural language}
h2 {definition or framing} — fixed
h2 {main decision criterion} — varies by entity
h3 {sub-criterion A} — varies
h3 {sub-criterion B} — varies
h2 {implementation} — semi-fixed
h2 {edge cases} — varies, drawn from data
h2 {frequently asked questions} — fixed shell, variable content
Two fixed sections and three variable ones is enough for no two pages to share an outline while keeping the template maintainable.
Ids and deep links
Every h2 gets a stable id derived from its text, without spaces or accents. That enables three things: auto-generating a table of contents, deep-linking from other pages in the silo, and allowing search engines to link directly to a section in results.
<h2 id="heading-hierarchy">Heading hierarchy</h2>
On a generated batch these ids become a linking resource: a contextual link to /blog/page#section is more precise than one to the whole page. The method is in internal linking at scale, and the corresponding markup in structured data on generated pages.
Frequently asked questions
Can a page have more than one H1?
HTML5 technically allows it inside sectioning elements, but one H1 per page remains the safest rule for document clarity and assistive technology.
Should the H1 match the title tag exactly?
They can differ slightly, and often should. The title is constrained by SERP display width; the H1 speaks to a reader already on the page.
Does the target keyword need to appear in every H2?
No. Repeating the query in every subheading reads artificially with no benefit. Covering the semantic field and related questions works better.