Heading structure: accessibility and SEO best practice
Good heading structure means one h1 that names the page, h2 to h6 headings in order without skipped levels, and real heading elements instead of bold text. Most screen reader users WebAIM surveyed start with headings on a long page. Google says heading order does not matter to Search, so the case for getting it right is mainly accessibility.
Published . Last reviewed .
Headings are the outline of a page. Sighted visitors scan them, and assistive technology can list them and jump between them. This guide covers what a good outline looks like, which rules come from standards and which are best practice, the usual mistakes and their fixes, how screen reader users use headings, what Google's documentation says, and how to check your own pages.
What a good heading outline looks like
The heading level is the depth of a section. An h1 names the page, each h2 is a main section, and each h3 is a subsection of the h2 above it. The HTML Standard puts it this way: the h1 is for a top-level section, h2 for a subsection, h3 for a sub-subsection, and so on. Here is the outline of an invented category page:
h1 Trail running shoes
h2 Shop by terrain
h3 Mud and soft ground
h3 Rock and hard pack
h2 How to choose a pair
h3 Cushioning
h3 Grip
h2 Delivery and returns
Two checks make an outline useful. First, read only the headings: do they tell the story of the page, in order? Second, look at the levels: a heading never sits more than one level deeper than the heading before it. Jumping back up is fine. Going from the last h3 under "How to choose a pair" to the h2 "Delivery and returns" is how sections close, and the HTML Standard allows it: each heading must have a level less than, equal to, or one greater than the heading before it.
What the standards require and what is best practice
Heading rules come from several places, and they do not carry the same weight. The table separates them.
| Practice | What the sources say | How we treat it |
|---|---|---|
| Use real heading markup | WCAG 1.3.1 Info and Relationships (Level A) needs structure shown visually to be available in code. Its sufficient techniques for HTML headings are H42 (h1 to h6) and ARIA12 (role="heading"). | Required |
| Make headings descriptive | WCAG 2.4.6 Headings and Labels (Level AA) requires headings that exist to be descriptive. It does not require headings. | Required for the headings you have; a judgment call |
| Have a level-1 heading | The HTML Standard says that if a document has headings, at least one heading in the outline should be level 1. A page without one is conforming but not encouraged. | Best practice; the heading checker, the bookmarklet and the free scan flag a missing h1 |
| Have only one h1 | The HTML Standard does not prohibit more than one; its own example has three. No WCAG criterion sets a number. | Best practice; our heading checker flags more than one |
| Start with an h1 | The HTML Standard calls a document whose first heading is not level 1 conforming but not encouraged. | Best practice |
| Do not skip levels | The HTML Standard marks a jump from h1 to h3 as non-conforming for authors. W3C's headings tutorial says skipping ranks can be confusing and should be avoided where possible, and that it is fine when closing subsections. The Understanding pages for 1.3.1 and 2.4.6 do not mention skipped levels. | Best practice, mapped to 1.3.1 on our methodology page and weighted minor |
We found no W3C text that makes a skipped level a failure of its own: the Understanding page for 1.3.1 lists no failure specific to heading levels. In our reading, a skipped level can still point to a real 1.3.1 problem, for example a section that looks top-level on screen but is marked up as an h4. Fix skips as a matter of course, and do not report one as a WCAG failure unless the markup misstates the structure. The criteria reference lists 1.3.1 and 2.4.6 with the tools that help, and our 1.3.1 page goes deeper.
Common heading mistakes and how to fix them
| Mistake | Why it matters | Fix |
|---|---|---|
| A skipped level, such as h2 straight to h4 | The outline has a hole, and someone moving by level can wonder what they missed. | Use the correct level and set the size with CSS. |
| A level chosen for its size | An h4 used because it looks small, or an h2 because it looks big, turns depth into decoration. | Choose the level from the structure and style it with CSS. |
| Bold text that only looks like a heading | Text that is not marked up as a heading does not appear in a list of headings. | Use an h1 to h6 element. |
| An empty heading | It becomes a blank entry in the heading list. The WAI-ARIA 1.2 heading role requires an accessible name. | Add text, or delete the element. Page builders often leave empty spacer headings. |
| A second h1 for each section | The page has several competing titles. | Keep one h1 for the page and use h2 for its sections. |
| The site name as the h1 on every page | Every page's outline starts with the same title. Google's title link documentation lists the h1 among the sources for a title link and suggests putting the title text in the first visible h1. | Our advice: make the page's own title the h1, and treat the logo as a link. |
| Vague wording, such as "Overview" or "Section 4" | 2.4.6 asks for descriptive headings, and a list of vague ones tells a reader nothing. | Write each heading so it still makes sense in a list. |
These problems are common. The February 2026 WebAIM Million, an analysis of one million home pages, reports that skipped heading levels were present on 41.8% of all pages, that 18.1% of home pages had more than one h1, and that 7.5% of pages had no headings. We repeat WebAIM's wording for each figure, because it switches between "all pages", "home pages" and "pages".
The same logic applies outside web pages. PDFs carry headings as tags, and W3C lists a PDF technique (PDF9) for 1.3.1; see our guide to accessible PDFs and the PDF accessibility checker.
Headings in components and templates
Most outline errors start in a shared component, not in page copy. These cases come up often. The advice is ours, built on the HTML Standard rule quoted above that a heading's level is less than, equal to or one greater than the heading before it.
- Card titles and repeated blocks. Give the title the level that fits where the block sits: h3 for a card grid under an h2 section, h4 for the same grid under an h3. A component with its level hard-coded breaks the outline when someone moves it, so let the template set the level.
- Taglines and subtitles. A line under a title that is not the start of a new section does not need a heading level of its own. The HTML Standard's hgroup element is for content representing a subheading, alternative title or tagline, with the text in
pelements next to the heading. - Styled labels that are not sections. A price, a date or a badge set in large type is not a heading. Style a paragraph or a span instead, so the heading list stays a table of contents.
- Builder blocks. Some page builders and themes let an editor pick the tag for a heading block. Check the finished page, because the tag the block outputs is what counts, not how large it looks. Our WordPress and Shopify guides cover theme-level changes.
ARIA headings
Native elements come first. The WAI-ARIA 1.2 specification says it is better to use an h1 element in HTML than to put the heading role on a div. When you cannot change the element, role="heading" needs an aria-level (the heading role lists it as required) and an accessible name. W3C documents the approach as technique ARIA12.
<div role="heading" aria-level="2">Delivery and returns</div>
<h2>Delivery and returns</h2>
Both lines expose a level-2 heading. The second is simpler, needs no ARIA, and is the one to use. Tools differ in what they see: the free scan and the heading checker read h1 to h6 tags, while the bookmarklet also reads role="heading" with aria-level.
How screen reader users use headings
The WebAIM Screen Reader User Survey #11 ran in July and August 2026 and received 1,780 valid responses. WebAIM notes that the sample was not controlled and may not represent all screen reader users. It asked what people do first when looking for information on a lengthy web page:
| First action | Respondents | Share reported by WebAIM |
|---|---|---|
| Navigate through the headings on the page | 1,191 | 67.8% |
| Use the Find feature | 219 | 12.5% |
| Read through the page | 170 | 9.7% |
| Navigate through the links of the page | 118 | 6.7% |
| Navigate through the landmarks/regions of the page | 59 | 3.4% |
The five counts add to 1,757, so WebAIM's shares for this question are of the respondents who answered it, not of all 1,780 valid responses.
Headings remain the most common first move, although the share fell from 71.6% in the 2024 survey. The same survey asked how useful heading levels are when navigating by headings: 51.9% said very useful and 36.4% somewhat useful, which is 88.3% together by our sum.
To hear it for yourself, open your screen reader's list of headings. In NVDA, WebAIM's guide lists the H key to move from heading to heading and NVDA plus F7 to open the Elements List. Read the list as a table of contents. If it does not make sense without the page around it, the headings or their levels need work. Our guide to testing website accessibility puts this in a wider routine.
Heading structure and SEO
We make no ranking promises, and the sources do not support one. What Google's own documentation says:
- Google's SEO Starter Guide lists "Number and order of headings" under things Google believes you should not focus on. It says semantic order is fantastic for screen readers, that Google Search does not mind headings used out of order, and that there is no ideal number of headings for a page.
- Google's title link documentation lists heading elements such as h1 among the sources Google may use to create a title link, and suggests putting the title text in the first visible h1 element as one way to make the main title clear.
That leaves two practical points. Write headings for readers, not for crawlers, and keep the h1 matched to the page's real subject. The case for a clean outline is that people use it, and a page that is easier to navigate is better whatever a search engine does with it.
How to check your headings
| Check | What it reads | What it flags | What it does not do |
|---|---|---|---|
| Heading checker | A page address (the HTML the server sends) or HTML you paste | No h1, more than one h1, skipped levels and empty headings, with the outline drawn out | It does not judge wording or see headings added by script, unless you paste the HTML from your browser's Elements panel. |
| Bookmarklet | The rendered page in your own browser, including staging and logged-in pages | No h1, skipped levels and empty headings, including role="heading" | It does not flag a second h1 or judge wording. |
| Free scan | The HTML the server sends, for up to three pages | A missing h1 and skipped levels, among 16 rule-based checks | It does not flag a second h1 or an empty heading, or judge wording. |
| Deep audit | The heading outline of the page, up to the first 30 headings | Headings that do not describe the content that follows (2.4.6), or an outline that would be confusing to navigate by | It does not flag a heading for its level number; the rule checks cover structure. |
A five-minute review: run the heading checker, read the outline aloud, fix the levels, rewrite vague wording, and delete empty headings. Then repeat it on each template, because a skipped level in a shared template appears on every page that uses it. Our guide to making a website accessible and the WCAG 2.2 checklist show where this fits among the other fixes, and the platform guides for WordPress and Shopify cover theme-level changes.
Heading structure questions
How many h1 elements should a page have?
We recommend one, naming the page. The HTML Standard allows more than one but wants at least one level-1 heading, and no WCAG criterion sets a number. A single h1 gives the page one clear title.
Do skipped heading levels fail WCAG?
W3C's Understanding pages for 1.3.1 and 2.4.6 do not mention skipped levels. The HTML Standard calls a skipped level non-conforming for authors, and W3C's headings tutorial says to avoid skipping where possible. Treat it as best practice and fix it.
Do headings help SEO?
We cannot promise a ranking effect. Google's SEO Starter Guide says the order of headings does not matter to Search and that there is no ideal number of them, and its title link documentation says it may use headings such as the h1 when it creates a title link. Write them for readers.
Can the first heading on a page be an h2?
It is allowed, but the HTML Standard calls a document whose first heading is not level 1 conforming but not encouraged. Start with the h1 so the outline has one clear top.
Should my logo or site name be the h1?
Our advice is to prefer the page's own title as the h1 and make the logo a link to the home page. Google's title link documentation lists the h1 among the sources for a title link and suggests putting the title text in the first visible h1, and a site name repeated as the h1 gives every page the same title.
How do I check the headings on a page built with JavaScript?
The heading checker and the free scan read the HTML the server sends, so headings added later by script are missing. Run the bookmarklet on the rendered page, or paste the HTML from your browser's Elements panel into the heading checker.
Headings are two of sixteen checks
The free scan flags a missing h1 and skipped heading levels, and also checks alt text, form labels, link text, page language and more: 16 rule-based checks across up to three pages. No signup.
Scan my site for free