Skip to content
Site Crawler

Heading and Sitemap Hreflang Checks in a Detailed Scan

4 min read · Updated Nov 12, 2026

A detailed scan flags an H1 over 70 characters, skipped heading levels, an image H1 with no alt text, H2 and viewport problems, and hreflang problems in your XML sitemap. It adds no requests to your site and no credits.

A detailed scan now checks two more things it already has the data for: the headings of each page, and the hreflang entries in your XML sitemap. They add no request to your site and no credits to a scan. Each one is an issue you can filter by in Site Pages, read in Page Detail and find in the exports (Starter and up). Two more groups, the H2 checks and the viewport checks, have their own section below.

Headings

Three checks read the outline of headings (H1 to H6) on every page a detailed scan reads.

  • H1 too long: an H1 of more than 70 characters. Google sets no limit for an H1: 70 is PerfBee's own rule, because a long H1 is usually a sentence or a list of keywords instead of the page's one-line subject.
  • Heading levels skipped: a heading more than one level below the one before it, such as an H1 followed by an H3. Going back up (an H4 followed by an H2) is normal. This is also PerfBee's own rule: Google does not ask for sequential levels, but people who use a screen reader move through a page by its headings, and a skipped level looks like a missing section. An empty heading and a copy of a heading inside <noscript> are not counted.
  • H1 is an image with no alt text: the H1 has no text and holds at least one image, and no image in it has alt text (an empty alt="" counts as none). Search engines and screen readers read such an H1 as empty. Alt text, an aria-label or a title on the image, an aria-label on the H1 itself, or text next to the image makes the check pass.

The first two are notices: suggestions you may decide to leave. The third is a warning. None of the three is part of the SEO score, none appears in the dashboard's "Needs your attention" list, and none is offered as a Fix.

Hreflang in the XML sitemap

If your sitemap lists the language versions of a page (<xhtml:link rel="alternate" hreflang="de" href="..."/> inside each <url>), the crawl checks those entries with the sitemap it reads for the scan (the sitemap your robots.txt names, or /sitemap.xml when it names none). Three issues:

  • Sitemap hreflang value not valid (warning): a language or region code outside the ISO lists (en-UK should be en-GB), an address that is not a full URL, or an entry with no address.
  • Sitemap hreflang has no return link (warning): the page's entry does not list the page itself, or it names a version whose own entry in the same sitemap does not list this page back. A version the crawl did not read (in a sitemap file the crawl never opened, or on another site) is never reported: the check says nothing it could not see.
  • Sitemap and page name different hreflang (notice): the page's own hreflang tags (or its Link header) and its sitemap entry are not the same set. Only pages that have both are compared: a page that uses one method is never reported for not using the other.

None of the three is offered as a Fix or appears in "Needs your attention". The Technical tab of the scan report also lists how many pages the sitemap gives alternates for, the languages it uses, and what is wrong with it as a whole.

H2 and viewport checks

A detailed scan also checks the H2 headings of each page and the page's viewport tag. They read what the crawl already has, so they add no request to your site and no credits.

H2

Four checks, all information only. They are PerfBee's own rules: search engines do not ask for exactly one H2 or set a limit on its length. None of the four is part of the SEO score, appears in "Needs your attention" or is offered as a Fix.

  • Missing H2: the page has no H2 with text. An empty H2 and an H2 inside <noscript> are not counted.
  • Multiple H2: the page has two or more H2s with text. Several H2s are normal on a page with sections, so use this list to find pages whose H2s are not sections, such as a menu or a widget title.
  • H2 too long: the page's first H2 is over 70 characters.
  • Duplicate H2: the page's first H2 is the same, apart from case and spacing, as the first H2 of at least one other page of the scan. A heading your template adds to every page, such as "Related products", makes a group of its own, so read the list before you act on it.

H2s that a script adds after the page loads are seen only when the scan rendered the page; otherwise the page reads as having no H2.

Viewport

Three checks on the <meta name="viewport"> tag of each page. None of them is part of the SEO score, appears in "Needs your attention" or is offered as a Fix.

  • No viewport meta tag (warning): the page has no viewport tag with content, so a phone shows it as a shrunken desktop page. A tag that JavaScript adds is seen only when the scan rendered the page.
  • Viewport does not follow the device width (notice): the tag gives a fixed width in pixels, such as width=320, or sets neither width=device-width nor an initial-scale.
  • Viewport stops visitors zooming (warning): the tag sets user-scalable=no (or 0), or a maximum-scale below 2. This follows WCAG 1.4.4 (Resize text), which asks that a page can be zoomed to 200%. Some browsers, Safari on iPhone among them, ignore these settings.

Like the other checks here, they need a detailed scan: a fast scan reads no headings or viewport tags, so it leaves a page's earlier result as it was.

HTML structure

A detailed scan also reads the structure of each page's HTML source: the <html>, <head> and <body> tags as the server sent them, before any browser repairs them. It adds no request to your site and no credits. All six checks are notices. None of them is part of the SEO score, appears in "Needs your attention" or is offered as a Fix.

  • No head tag: the page has an <html> tag and a <body> tag but no <head> tag.
  • More than one head tag: a browser reads the first one and ignores the others, so a title or meta tag that follows a second one ends up in the page body.
  • No body tag: the page has <html> and <head> tags but no <body> tag.
  • More than one body tag: usually two documents pasted together.
  • Element in head that closes it: something that does not belong in <head> (an image, a div, an iframe or plain text) comes before your title or meta tags, so a browser ends the head there and the tags after it are ignored by search engines.
  • Something before head: a tag such as <meta>, <div> or <body>, or text, comes before <head>, between <html> and <head> or even before <html>. A PHP warning printed above the page is the usual cause. A browser then opens a head of its own and ignores yours, so your title and meta tags end up in the page body.

The HTML standard allows a page to leave out <head> and <body>, so the first and third checks are worth a look rather than proof of a fault. PerfBee judges only pages that answered 200 as HTML and that it read without rendering: a rendered page is the browser's repaired version, which always has both tags. A page whose source ends in the middle of a comment, tag or script, or that uses frames, is not judged. A page that a later scan renders keeps its last result until a scan reads it as plain HTML again. To keep a crawl fast, the check stops once it has used a small share of the crawl's time, and the pages after that point are not judged.

What you need for them

  • A detailed scan. A fast scan reads no headings, hreflang or viewport tags, so it leaves a page's earlier result as it was.
  • In Page Detail, every check above is listed under Issues on the SEO tab. The three sitemap checks are explained on the Hreflang tab too.
  • A scan of a list of URLs checks headings, but it does not run the sitemap checks.
  • The Use sitemap option switched on (Advanced settings, under Limits). It is on by default. With it off, the crawl does not read the sitemap, so the three sitemap checks do not run and pages keep their earlier sitemap result.
  • The part of the sitemap a scan reads is limited to one and a half times its Max pages setting, but never below 200 URLs and never above 100,000 (with no Max pages set: 100,000). When your sitemap holds more than that, the pages the scan did not find in the part it read keep their earlier sitemap result.