On-page SEO · Heading structure
H1 Tag Check
The <h1> tag tells search engines and screen readers: this is the primary topic of this page. Missing or muddled H1s cost you rankings and accessibility score. Paste your URL and we check for missing, empty, or problematic H1 tags, then stamp CLEARED / HOLD / DENIED.
When to inspect H1 before title or canonical
This check answers one question: does the first HTML response contain a readable primary heading? It does not rank titles, Open Graph, or duplicate URLs.
Use this checker
The page is a JS shell, a logo-as-heading template, or a CMS layout that sometimes renders an empty H1. You want evidence from the fetched HTML, not from a hydrated screenshot.
Problem → aftermath → next step
Problem: crawlers and screen readers lack a topic anchor. Aftermath: the page is harder to interpret and may lose heading-based snippet context. Next step: put one text H1 in the server HTML, then re-scan the live URL.
Adjacent checks
Title and H1 should describe the same topic in different words — use the title tag checker for the document title. Canonical is for URL variants, not headings. After App Router launch, confirm the heading still exists in production HTML with the Next.js checklist.
H1 issues we catch
These are common on JS-heavy SPA shells, template-based sites, and pages where the logo image replaced the heading.
No <h1> found on the page
Without a clear H1, crawlers and users lack a primary topic anchor. Common on React/Vue shells that render headings client-side, or templates that use a logo image instead of text.
Empty <h1></h1> tags
The tag exists but has no text content — often a hydration bug or a template variable that resolves to an empty string. Same SEO impact as missing entirely.
H1 rendered as an image
Some templates use <h1><img src='logo.png'></h1>. Search engines can't read the image text. Use a text H1 and visually style it instead.
Client-side rendered H1 not in initial HTML
If the H1 only appears after JavaScript hydration, crawlers that don't execute JS see an empty page. SSR or SSG solves this.
Multiple H1 tags with competing topics
Modern HTML permits more than one H1, but repeated page-level headings often signal a template problem. Keep one unambiguous primary topic unless the document structure genuinely requires otherwise.
Copy-paste H1 fixes
One clear, descriptive H1 per page — rendered in the initial HTML, not injected by JS.
Next.js page component
export default function Page() {
return (
<main>
<h1>Your product does X for Y</h1>
</main>
)
}Plain HTML
<main>
<h1>Your product does X for Y</h1>
<p>Supporting content goes here.</p>
</main>Server-rendered template (Thymeleaf)
<main>
<h1 th:text="${heroHeadline}">Your product does X for Y</h1>
</main>
Provide heroHeadline from the homepage controller.Still check by hand
- □Exactly one <h1> per page — not zero, not multiple
- □H1 must contain visible text (not just an image)
- □H1 should appear in the initial server-rendered HTML
- □Use H2-H6 for sub-sections, don't skip heading levels
Related
- Canonical checker — duplicate URLs are a different failure than missing headings
- Next.js production checklist — SSR/SSG so the H1 is in the first HTML
- Title tag checker — title and H1 should differ slightly
- Meta description checker
- Open Graph checker
- Website launch checklist
- Methodology
- Go-Live Clearance home