How this check works
Scanaris counts the <h1> tags in your page's HTML. The correct result is exactly one. If there is none, it opens a medium-severity finding: neither Google nor a screen reader knows what the main topic is. If there are two or more, it opens a low-severity one with the count: several main headlines dilute what the page is about. Only the served HTML is examined, without running JavaScript, and only the scanned page.
Why it matters
The <h1> is the page's headline, the first thing a screen reader announces and one of the clearest signals Google has to understand the topic. A page without an h1 is like an article without a title: the search engine has to infer it from the rest. Several h1s are not an HTML error, but they spread that signal: if your product page has the product name, the tagline and "Reviews" all as h1, none of the three is the topic. And it is the base of the rest of the hierarchy: h2s divide the content into sections, h3s subdivide, and that is how keyboard and screen-reader users navigate and how AI assistants chunk your text to cite it.
Why it happens
The most common case of zero h1s is design: the big text in the hero is a div with size classes, or a p, because whoever built it thought about looks rather than structure. In single-page apps, JavaScript renders the h1 and it is not in the initial HTML. The multiple-h1 case usually comes from components: every card, every section or every widget brings its own h1, or the logo is wrapped in one "for SEO", which is advice from 2008.
How to fix it
- One
h1per page with the main topic, visible and near the start of the content. On the home page, what you do; on an article, its title; on a product, its name. - The logo is not an
h1. It is a link to the home page with the brand name as text or asalt. - The rest in
h2andh3, without skipping levels: anh3goes inside a section with anh2. If a tag only interests you for its size, use a CSS class, not a heading level. - In components, accept the level as a prop (
<Heading :level="2">) instead of fixing it inside, so the same card can beh2on one page andh3on another. - In SPAs, server-render at least the page structure or use prerendering; otherwise Google sees an empty page before running your JavaScript.
Check it is fixed
curl -s https://yourdomain.com | grep -oiE '<h[1-6][^>]*>[^<]{0,80}' | sed 's/<\(h[1-6]\)[^>]*>/\1: /'
Exactly one line should start with h1:, followed by the h2 and h3 hierarchy in logical order. If nothing comes out, JavaScript renders the content and Google does not see it at first either.
Frequently asked questions
HTML5 allows one h1 per section. Why is it flagged?
The specification allowed it with the per-section "outline" algorithm, but no browser or screen reader ever implemented it, and the specification dropped it in 2022. In practice, one h1 per page remains the recommendation of Google and of the accessibility guidelines.
My h1 is hidden with CSS so the design stays clean.
An h1 hidden with display: none is read by neither Google nor screen readers. If you need it unseen but read, use a visually-hidden text class (sr-only); but consider whether the page's main headline really should be hidden.
Are the other levels reviewed?
This check only counts h1s. Empty headings are detected by accessibility, and the tab title, which is not the same as the h1 although they usually look alike, is reviewed by SEO metadata.