Heading Structure Checker
See your H1 to H6 outline laid out as it really is, with missing, duplicated, skipped and empty headings flagged, from a live page, pasted HTML or plain text.
Your headings
We read the live page and take the headings in the order they appear in the source, which is the order a screen reader meets them.
Paste a whole page or just the part you are working on. Everything that is not a heading is ignored.
Mark the level with hashes, the way Markdown does: one for an H1, two for an H2, and so on. Useful for planning an article before you write it.
The verdict
What to fix
Your outline
Headings are doing two jobs at once
An H2 is not a font size. It is a claim about structure, and two different audiences act on that claim. A search engine reads the outline to work out what a page covers and which part answers which question. A screen reader user navigates by it, jumping from heading to heading the way a sighted reader skims with their eyes.
Both break in the same ways, which is why this checks the running order rather than counting tags. Knowing you have nine H2s tells you nothing. Knowing that the fourth one is followed by an H4 tells you the outline is broken.
What gets flagged, and why each one matters
- No H1. The page has no stated subject, and both the search engine and the screen reader have to infer one.
- More than one H1. HTML5 allows it and Google says it will not hurt rankings, which is true and beside the point. The H1 is the one landmark that should be unique, and a page with four of them has none.
- An H1 that is not first. Something above it is being announced as outranking the page title, which is nearly always a site name or a navigation label marked up as a heading when it should not be.
- A skipped level. An H2 followed by an H4 says a section exists that does not. This is a WCAG 1.3.1 failure, not a matter of taste, and it almost always happens because a level was chosen for how big it looked.
- An empty heading. Announced as a level and then silence. Usually a heading tag used for spacing, or wrapped around an image with no alt text, and completely invisible until somebody listens to the page.
- Duplicate text at the same level. Someone navigating by heading sees the same label twice and cannot tell the sections apart.
- Very long headings. Past about seventy characters a heading is a sentence, and it stops working as a signpost.
Check the plan, not just the page
The plain-text mode takes Markdown hashes, so one hash is an H1 and two is an H2, and it also accepts lines written as “H2: Something”, which is how outlines actually arrive in a content brief. That means you can check a structure before the article exists.
This is the cheap moment to notice that three of your H2s say roughly the same thing, or that the piece has no logical order, or that what you have planned as a single article is really two. Fixing an outline takes a minute. Restructuring a finished draft takes an afternoon.
How many headings, and what should they say?
There is no correct number, and anyone offering one is guessing. A more useful test: read only your headings, in order, and see whether they summarise the page. If they do, the structure is sound. If they read as a list of vague labels such as “Introduction”, “Background” and “Conclusion”, the problem is the wording rather than the quantity.
Headings also are not keyword slots. Repeating your target phrase in every H2 does nothing for ranking and a great deal against readability. Google draws on heading text when building featured snippets and jump links, which is a reason to make them genuinely descriptive, not a reason to stuff them.
Related tools
- The Keyword Density Checker reports whether your target term reaches the headings at all, along with the title, address and alt text.
- The Text Case Converter puts your headings into a consistent capitalisation style once the structure is right.
- The Paragraph Length Checker and the Sentence Length Checker deal with the writing between the headings.
Is anything stored?
No. Pasted HTML and pasted outlines are parsed in your browser and never leave the page. Checking a live URL sends only that address to our server, which fetches the page and returns its headings. Nothing is written to a database or a log.
What it checks
Headings are two things at once: the outline a search engine reads, and the map a screen reader user navigates by. They break in the same ways.
The real running order
Not a count of how many H2s you have, but the outline in the order the tags actually appear, indented by level. That order is the only thing that shows whether the hierarchy holds together.
Skipped levels
An H2 followed by an H4 tells assistive technology that a section exists which does not. That is a WCAG 1.3.1 failure, not untidiness, so it is reported as an error and the gap is named.
Empty headings
A heading tag with no text is announced as "heading level two" and then silence. They are usually tags used for spacing, or wrapped around an image with no alt text, and they are invisible until someone listens to the page.
Missing, extra and misplaced H1s
No H1, several H1s, or an H1 that is not the first heading on the page. The last one usually means a site name or a navigation label has been marked up as a heading when it should not be.
A page, HTML, or a plan
Check a live URL, paste a block of HTML, or sketch an outline with hashes the way Markdown does and check the structure before you have written a word of the article.
Take it away
Filter down to only the headings with a problem, copy the whole outline as indented text for a brief, or export the lot with its faults as a CSV.
Questions about heading structure
Can a page have more than one H1?
The HTML5 specification permits it and Google has said repeatedly that several H1s will not hurt your rankings. That is not the same as it being a good idea. The H1 is the one landmark a screen reader user can rely on to mean "this is what the page is", and a page with four of them has no such landmark. It also usually signals that the template is marking up things that are not the page title. One H1 costs nothing and removes the argument.
Why does skipping a level matter?
Because heading levels are a claim about structure, not a choice of font size. Jumping from an H2 to an H4 says there is an H3-level section in between, and someone navigating by heading hears that section announced and then finds it does not exist. It is a recognised failure under WCAG 1.3.1, Info and Relationships. In practice it almost always happens because a level was picked for how big it looked, which is what CSS is for.
Do headings help SEO?
They help, modestly and indirectly. Google uses them to understand what a page covers and which part answers which question, and heading text is one of the things it draws on when building a featured snippet or jumping a searcher to a section. What they are not is a keyword slot. Stuffing a term into every H2 does nothing except make the page unpleasant. Write headings that would help a reader skim, and the search benefit follows.
How many headings should a page have?
As many as the content has sections, which is a deliberately unhelpful answer because there is no correct number. A useful rule of thumb is that a reader should be able to understand roughly what the page covers by reading only the headings. If your outline reads as a sensible summary, the count is right. If it reads as a list of vague labels, the problem is the wording rather than the quantity.
What does the plain-text mode accept?
Markdown hashes, so one hash is an H1, two is an H2 and so on up to six. It also accepts lines written as "H2: Something", which is how outlines usually arrive in a content brief. That makes it possible to check a structure before the article exists, which is a much cheaper moment to find that you have three H2s all saying roughly the same thing.
Is anything sent anywhere?
Pasted HTML and pasted outlines are parsed entirely in your browser and never leave the page. Checking a live URL sends only that address to our server, which fetches the page and returns its headings, because a browser is not allowed to read another site directly. Nothing is stored either way.