H1 Tag Checker: How to Find Missing and Duplicate H1s
An H1 tag checker reads a page's HTML, finds the main <h1> heading, and reports whether it is missing, duplicated, too long, or out of step with what the page is about. Run across a whole site and repeated over time, the same check also tells you when a theme update or an editor has changed an H1 that used to be fine.
The H1 feels like a solved problem, which is exactly why it drifts. Themes get updated, page builders add their own headings, and editors paste content into templates. Nobody looks at the rendered HTML again until someone investigates a ranking drop.
What the H1 is doing for the page
The H1 is the visible headline at the top of the document. For a reader it confirms they landed in the right place. For a search engine it is one of the clearest on-page hints about the page's topic, next to the <title> tag, and it is a signal you control completely. When it is empty, generic or duplicated, you lose a piece of relevance you did not need to give away.
The H1 problems a checker should flag
| Problem | Where it usually comes from | What to look for |
|---|---|---|
| No H1 | A landing page built in a page builder where every heading was left at H2, or a template refactor | Zero <h1> elements in the rendered DOM |
| More than one H1 | The logo or site name wrapped in <h1> in the header, plus the post title in another |
Two or more matches, often one identical on every page |
| Generic H1 | "Welcome", "Shop", "Blog" left over from a template | Same short text across many URLs |
| Very long H1 | A keyword list pasted in by the client | Headings running well past a single line on desktop |
| H1 contradicts the title | Title updated in the SEO plugin, H1 left alone, or the reverse | Title and H1 about visibly different things |
| Same H1 on different URLs | Product variants, location pages, paginated archives | Duplicate H1 text across URLs in a crawl |
On multiple H1s, a fair note: Google has said it copes with more than one H1 on a page, and HTML permits it. It is still worth fixing, because a second H1 is almost always an accident (the header logo being the classic case) and it muddles the one heading you meant to use.
Checking a single page
There are three ways, and they do not always agree.
View source (view-source: in front of the URL, then search for <h1) shows the HTML the server sent. That is what a simple crawler sees first.
DevTools shows the rendered DOM after JavaScript has run. Open the console and run document.querySelectorAll('h1').length to count headings, or [...document.querySelectorAll('h1')].map(h => h.textContent.trim()) to print them. If the count differs from view source, a script is adding or replacing the heading, which is common on React or Vue front ends.
Browser SEO extensions display the H1 in a panel, which is quick but only as reliable as whichever version of the HTML the extension reads.
In WordPress page builders, the heading level is a setting on the widget or block. Elementor's Heading widget has an "HTML Tag" dropdown and the block editor's Heading block has a level selector, so an H1 that "disappeared" is often just a heading switched to H2 during a redesign.
Why this breaks down across client sites
All of the above is fine for one URL. It does not work for twenty client sites with a few hundred pages each, deployed by developers who will not tell you when they update a theme. A header template change can add a second H1 to every page at once, and nothing in the browser looks different. A crawler run once a quarter catches it eventually, but by then the change has been live for weeks.
What helps is a check that runs on its own and compares against the previous result, so the question becomes "which H1s changed since yesterday" instead of "which H1s are wrong today".
Monitoring H1s with Deltio
Deltio checks the H1 on the pages it monitors as part of its daily cycle, alongside the title and meta description, canonical, noindex and the sitemap. It flags H1s that are missing, multiple, too short or too long, and because it compares each check with the one before, it also alerts you when the text of an H1 changes. The alert goes to Slack and email for that site and names the URL. After a deploy you can also trigger a manual SEO scan rather than waiting for the next cycle.
If you are checking the other head elements too, the same approach applies to the title tag checker and the canonical tag checker. For multilingual sites, the hreflang checker guide covers the extra checks worth doing by hand.
Frequently asked questions
- Should the H1 be the same as the title tag?
- They should be about the same thing, but they do not need to match word for word. The title is written for the search results and is truncated around 60 characters, so it often carries the brand or a modifier. The H1 is written for someone already on the page and can be more natural.
- Does an H1 hidden with CSS still count?
- It is in the HTML, so a checker will find it, but hiding the main heading from visitors while showing it to crawlers is a pattern search engines treat with suspicion. If a design has no visible headline, it is better to make a visible heading the H1 than to hide one.
- My checker finds no H1 but I can see a big heading on the page. Why?
- The visible headline is probably styled text in a div or span, or a heading set to H2 or lower in the page builder. Inspect the element in DevTools to see its actual tag.
- Can a manual SEO scan replace scheduled H1 checks?
- A manual scan is useful right after a release you know about. Scheduled checks are what catch the releases you did not know about, which on client sites are most of them.
- How much does Deltio cost?
- Starter is £24 a month, or £20 a month billed annually, for up to 50 sites and 5,000 URLs. Professional is £49 a month (£41 annually) for up to 200 sites, and Enterprise £119 a month (£99 annually) for up to 500. Every plan includes a 14-day free trial, and CSV export is available from Professional up.