Heading Structure Checker
Paste HTML to visualise the heading hierarchy (H1–H6) and spot structural SEO issues.
How to Use
- Paste your page HTML (or just the <body> section) into the input.
- Click Analyze to extract the heading tree.
- Review the visual hierarchy and any flagged issues.
- Fix skipped levels, missing H1s, or duplicate H1s before publishing.
When to Use This
- Auditing a long article a writer handed over, where headings were styled visually and the levels underneath do not match the appearance.
- Finding the stray h1 a template injects into the sidebar, which nobody notices until the outline is laid out flat.
- Checking an accessibility complaint about heading navigation before escalating it, using the markup the person actually received.
- Reviewing a page built from reusable blocks, where each block starts at h2 and the nesting breaks when blocks are reordered.
Frequently Asked Questions
About This Tool
Heading elements h1 through h6 each carry a level, and together they form the outline of a document. Screen reader users navigate by that outline, jumping from heading to heading, so a jump from h2 to h4 reads as a missing section. The HTML5 sectioning algorithm that was meant to compute levels from nesting was never implemented by browsers or assistive technology and has since been dropped, which leaves the numbers on the tags as the only outline there is.
Paste markup here and the browser's DOMParser extracts every h1 to h6 in document order. The result is an indented tree, one row per heading, colored by level, alongside a list of issues: no h1, more than one h1, each skipped level with the heading that caused it, and a count of empty headings.
Notes & Limits
- Every heading in the markup counts, including ones hidden with CSS, because the parser never loads or applies a stylesheet.
- Text styled to look like a heading without a heading tag, and ARIA headings using role=heading with aria-level, are invisible to this check.
- The checks are structural only. Duplicate heading text, headings that do not describe their section, and headings far too long are not flagged.
- Headings injected by JavaScript are absent unless you copy the rendered DOM rather than View Source, and headings inside a template element are not counted.