Rules reference
Every rule Loomaly checks, with its severity, score dimension and ID, what it means and how to fix it.
Every issue Loomaly reports comes from one of the 81 rules on this page, and each rule is raised by exactly one part of a scan. Explanations and fix prompts come from fixed templates, so the same problem gets the same rule ID and the same wording on every scan. That is how Loomaly can tell whether an issue is new, still there, or fixed. To work through issues, see Issues.
How rules affect your health score
Each rule has a severity (Error, Warning or Notice) and a dimension: the part of search health it measures. On a page, an error fails its dimension, a warning costs 25 points and a notice 5 (at most 10 from notices). The site score is a weighted average of the five dimensions. How the health score works has the details and a worked example.
How rules are checked
The last column of each table says which part of a scan can report the rule. See How a scan works for when each part runs.
| Checked by | What it means | Finding group |
|---|---|---|
| Rule check | Code checks the page's HTML, the same way every time, on every page Loomaly finds. | Structural |
| AI judgment | An AI model answers a fixed question about the page (for example, does it give a clear next step?), on every page. Only answers it is confident about become issues, and code decides which questions apply to which kind of page. | Semantic |
| Performance test | Measured with Google PageSpeed Insights on mobile, using real-user Chrome data where available, on the representative pages of each template. | Performance |
| Page judgment | AI judges pages that code picked as suspicious (near-duplicates, pages that look empty or gone) after a site scan. | Page judgments |
| Site check | Code checks robots.txt and the sitemap once per scan, and compares the sitemap with what the pages declare. Shown as one issue for the whole site and scored once, not per page. | Structural |
When a page is set to noindex, only the noindex itself is reported for it, and pages that redirect to another site are not checked at all.
Meta tags
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
Missing <title> tag | Error | Page basics | Rule check |
| Title is too short | Warning | Page basics | Rule check |
| Title is too long | Warning | Page basics | Rule check |
| Missing meta description | Warning | Page basics | Rule check |
| Title shared with other pages | Warning | Page basics | Page judgment |
| Meta description shared with other pages | Notice | Page basics | Page judgment |
| Meta description is too short | Notice | Page basics | Rule check |
| Meta description is too long | Notice | Page basics | Rule check |
| Missing canonical link | Notice | Indexability | Rule check |
| Canonical points to a different URL | Warning | Indexability | Rule check |
| Missing viewport meta | Warning | Page basics | Rule check |
| Sign-in or app page can be indexed | Warning | Indexability | Rule check |
| Page is set to noindex | Error | Indexability | Rule check |
| Page is set to nofollow | Warning | Indexability | Rule check |
| Title does not match the page | Warning | Content & AI readability | AI judgment |
| Missing Open Graph tags | Notice | Page basics | Rule check |
| Missing Open Graph image | Notice | Page basics | Rule check |
Missing <title> tag
Severity: Error · Dimension: Page basics · Rule ID: missing-title · Checked by: Rule check · Effort: small
What it means: The page has no <title>, or it is empty. The title is the headline search engines show for your result and the strongest on-page hint about what the page covers.
How to fix: Add a unique, descriptive <title> in the page's <head>: the page's topic first, your brand last, 20 to 70 characters.
Official guidance: developers.google.com/search/docs/appearance/title-link
Title is too short
Severity: Warning · Dimension: Page basics · Rule ID: title-too-short · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The title is shorter than 20 characters, too short to tell searchers what the page offers. A Chinese, Japanese or Korean character counts as two, because it takes twice the width.
How to fix: Expand it with the page's main topic or product plus one distinguishing detail. Aim for 20 to 70 characters.
Official guidance: developers.google.com/search/docs/appearance/title-link
Title is too long
Severity: Warning · Dimension: Page basics · Rule ID: title-too-long · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The title is longer than 70 characters, so search results cut it off. A Chinese, Japanese or Korean character counts as two, because it takes twice the width.
How to fix: Put the most important words first and trim filler or repeated brand names until it fits in 70 characters.
Official guidance: developers.google.com/search/docs/appearance/title-link
Missing meta description
Severity: Warning · Dimension: Page basics · Rule ID: missing-meta-description · Checked by: Rule check · Effort: small
What it means: The page has no meta description, or it is empty. Search engines then write their own snippet from the page text, and you lose control over what searchers read before they click.
How to fix: Add <meta name="description" content="..."> with a 70 to 160 character summary that says what the visitor gets and why to click.
Official guidance: developers.google.com/search/docs/appearance/snippet
Title shared with other pages
Severity: Warning · Dimension: Page basics · Rule ID: duplicate-title · Checked by: Page judgment · Effort: medium
What it means: Other pages of the site use exactly the same <title>; the issue says how many and names one. Search engines have to choose one page for the query, and a searcher can't tell the results apart.
How to fix: Give each page a title that says what that page is about: the product, the article's topic or the category name first, the brand last. If the pages really are the same, keep one and point the others at it with a canonical or a redirect.
Official guidance: developers.google.com/search/docs/appearance/title-link
Meta description shared with other pages
Severity: Notice · Dimension: Page basics · Rule ID: duplicate-meta-description · Checked by: Page judgment · Effort: medium
What it means: Other pages of the site use the same meta description, so their search snippets read the same.
How to fix: Write a description for each page from its own content, or leave it empty on pages where you have nothing specific to say: Google will write one from the page.
Official guidance: developers.google.com/search/docs/appearance/snippet
Meta description is too short
Severity: Notice · Dimension: Page basics · Rule ID: meta-description-too-short · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The meta description is shorter than 70 characters, which leaves most of the snippet space unused. A Chinese, Japanese or Korean character counts as two, because it takes twice the width.
How to fix: Expand it to 70 to 160 characters with a concrete benefit, detail or call to action.
Official guidance: developers.google.com/search/docs/appearance/snippet
Meta description is too long
Severity: Notice · Dimension: Page basics · Rule ID: meta-description-too-long · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The meta description is longer than 160 characters, so search results cut it off. A Chinese, Japanese or Korean character counts as two, because it takes twice the width.
How to fix: Keep the key message in the first 160 characters and drop the rest.
Official guidance: developers.google.com/search/docs/appearance/snippet
Missing canonical link
Severity: Notice · Dimension: Indexability · Rule ID: missing-canonical · Checked by: Rule check · Effort: small
What it means: The page declares no <link rel="canonical">. Search engines then decide on their own which variant of the URL (with parameters, with or without a trailing slash) is the main one.
How to fix: Add a canonical link that points to the page's own preferred URL. Most frameworks and SEO plugins can output a self-referencing canonical on every page.
Official guidance: developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
Canonical points to a different URL
Severity: Warning · Dimension: Indexability · Rule ID: canonical-mismatch · Checked by: Rule check · Effort: medium
What it means: The canonical link points to a different URL than the page itself (compared after redirects; a trailing slash or upper-case host does not count as different). Search engines may index that other URL instead of this one.
How to fix: If this page should rank on its own, point the canonical at its own URL. If it is a deliberate duplicate that should hand its signals to another page, leave it and ignore the issue with a reason.
Official guidance: developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
Missing viewport meta
Severity: Warning · Dimension: Page basics · Rule ID: missing-viewport · Checked by: Rule check · Effort: small
What it means: The page has no <meta name="viewport">, so phones render it as a zoomed-out desktop page. Google indexes the mobile version of your site.
How to fix: Add <meta name="viewport" content="width=device-width, initial-scale=1"> to the <head>.
Official guidance: developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing
Sign-in or app page can be indexed
Severity: Warning · Dimension: Indexability · Rule ID: indexable-app-page · Checked by: Rule check · Effort: small
What it means: This address looks like a sign-in, account or app page, and it answers 200 without noindex. Search can list a login wall instead of a public page.
How to fix: Add noindex in the robots meta tag or the X-Robots-Tag header. Do not write a title and description for these pages.
Official guidance: developers.google.com/search/docs/crawling-indexing/robots-meta-tag
Page is set to noindex
Severity: Error · Dimension: Indexability · Rule ID: robots-noindex · Checked by: Rule check · Effort: small
What it means: The page tells search engines not to index it, so it will not appear in search results. Loomaly does not report this on pages that are usually kept out of search on purpose, such as sign-in, account, cart, checkout and legal pages.
How to fix: If the page should appear in search, remove noindex from the robots meta tag (and from any X-Robots-Tag header). If it is intentional, ignore the issue with a reason.
Official guidance: developers.google.com/search/docs/crawling-indexing/block-indexing
Page is set to nofollow
Severity: Warning · Dimension: Indexability · Rule ID: robots-nofollow · Checked by: Rule check · Effort: small
What it means: The page-level robots setting says nofollow, so search engines do not follow any link on the page. The pages it links to get no discovery or credit from it.
How to fix: Remove nofollow from the page's robots meta tag. To keep individual links from passing credit, put rel="nofollow" on those links instead.
Official guidance: developers.google.com/search/docs/crawling-indexing/robots-meta-tag
Title does not match the page
Severity: Warning · Dimension: Content & AI readability · Rule ID: title-content-mismatch · Checked by: AI judgment · Effort: small
What it means: The <title> promises something the page's headings and text don't deliver. Searchers who click leave quickly, and Google may rewrite the title in its results.
How to fix: Rewrite the title to describe what the page actually offers, using the words of its main heading, or change the page so it delivers what the title promises.
Official guidance: developers.google.com/search/docs/appearance/title-link
Missing Open Graph tags
Severity: Notice · Dimension: Page basics · Rule ID: missing-og-tags · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has none of og:title, og:description or og:image. Social networks, chat apps and AI assistants use these Open Graph tags to build the preview when someone shares the link.
How to fix: Add at least og:title, og:description and og:image (and ideally og:url) to the <head>. Most SEO plugins and frameworks can generate them from the page title and description.
Official guidance: ogp.me
Missing Open Graph image
Severity: Notice · Dimension: Page basics · Rule ID: missing-og-image · Checked by: Rule check · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has Open Graph tags but no og:image, so shared links show up without a preview image or with a random one.
How to fix: Add og:image with an absolute URL to a representative image. 1200 x 630 pixels is the common size.
Official guidance: ogp.me
Headings
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| Missing H1 | Warning | Page basics | Rule check |
| Multiple H1 tags | Warning | Page basics | Rule check |
| Heading levels skipped | Notice | Page basics | Rule check |
Missing H1
Severity: Warning · Dimension: Page basics · Rule ID: missing-h1 · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has no <h1>. The H1 is the page's main visible heading and a strong signal of its topic.
How to fix: Add exactly one H1 that states the page's main topic. It can match or closely echo the title.
Official guidance: developers.google.com/search/docs/fundamentals/seo-starter-guide
Multiple H1 tags
Severity: Warning · Dimension: Page basics · Rule ID: multiple-h1 · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has more than one <h1>, which blurs which topic is the main one. A common cause is a theme that marks up the logo or section titles as H1.
How to fix: Keep one H1 for the page's main topic and change the others to H2 or H3.
Official guidance: developers.google.com/search/docs/fundamentals/seo-starter-guide
Heading levels skipped
Severity: Notice · Dimension: Page basics · Rule ID: heading-skip-level · Checked by: Rule check · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The heading levels jump, for example from H1 straight to H3. Screen readers and crawlers use headings as the page's outline, and gaps make it harder to follow.
How to fix: Use heading levels in order (H1, then H2, then H3) based on structure, and set their size with CSS rather than by picking a different level.
Official guidance: developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements
Content
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| Competes with another page for the same search | Warning | Content & AI readability | Page judgment |
| Unavailable item still indexable | Warning | Content & AI readability | Page judgment |
| Placeholder page with no real content | Warning | Content & AI readability | Page judgment |
| No clear next step for the visitor | Warning | Content & AI readability | AI judgment |
| Thin content | Warning | Content & AI readability | AI judgment |
| Low word count | Notice | Content & AI readability | Rule check |
| Possible keyword stuffing | Warning | Content & AI readability | AI judgment |
| Target phrase missing from the title | Warning | Content & AI readability | Keyword check |
| Target phrase missing from the H1 | Notice | Content & AI readability | Keyword check |
| Target phrase missing from the meta description | Notice | Content & AI readability | Keyword check |
| Target phrase missing from the opening | Notice | Content & AI readability | Keyword check |
| A searched phrase is missing from the title | Warning | Content & AI readability | Keyword check |
| Target phrase is not at the start of the title | Notice | Content & AI readability | Keyword check |
| The site has no llms.txt | Notice | Content & AI readability | Site check |
| llms.txt isn't a usable page map | Notice | Content & AI readability | Site check |
| llms.txt links to pages that fail | Warning | Content & AI readability | Site check |
| Page not optimized for AI citation | Notice | Content & AI readability | AI judgment |
| Missing author byline | Notice | Content & AI readability | AI judgment |
| Missing publication date | Notice | Content & AI readability | AI judgment |
Competes with another page for the same search
Severity: Warning · Dimension: Content & AI readability · Rule ID: duplicate-intent · Checked by: Page judgment · Effort: large
What it means: Another page on your site serves the same search, and the issue names it. Search engines usually pick one of the two and the other loses. Pages that already declare each other as canonical or as language versions are not flagged.
How to fix: Merge the two into one page and redirect the weaker URL, point one at the other with a canonical, or make them clearly different (different audience, product or question).
Official guidance: developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
Unavailable item still indexable
Severity: Warning · Dimension: Content & AI readability · Rule ID: unavailable-item · Checked by: Page judgment · Effort: medium
What it means: The page is for something that is no longer available (sold out, discontinued, an event that has ended) but can still be found in search.
How to fix: Keep it only if it helps visitors onward, for example with alternatives or a restock date. Otherwise redirect it to the closest alternative or mark it noindex.
Official guidance: developers.google.com/crawling/docs/troubleshooting/http-status-codes
Placeholder page with no real content
Severity: Warning · Dimension: Content & AI readability · Rule ID: placeholder-page · Checked by: Page judgment · Effort: large
What it means: The page is a template shell or stub with nothing for a visitor, such as placeholder text, an empty category or a coming-soon page.
How to fix: Fill it with real content, or keep it out of search (noindex, or unpublish it) until it has some.
Official guidance: developers.google.com/search/docs/fundamentals/creating-helpful-content
No clear next step for the visitor
Severity: Warning · Dimension: Content & AI readability · Rule ID: missing-next-step · Checked by: AI judgment · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: A home, landing or product page doesn't give the visitor one clear next step: sign up, buy, book, contact you, or keep reading. The page may rank and still lose the visitors it earns. The AI judgment sees the page's buttons and call-to-action links, and this is only checked on pages where Loomaly recorded them.
How to fix: Add one primary call to action near the top and again after the main content, with a verb that says what happens ("Start free trial", "Book a call"). Keep secondary links visually quieter.
Official guidance: developers.google.com/search/docs/fundamentals/creating-helpful-content
Thin content
Severity: Warning · Dimension: Content & AI readability · Rule ID: thin-content · Checked by: AI judgment · Effort: large
What it means: For what the page is for (a product, an article, a landing page), it doesn't give a visitor enough substance: little beyond a heading and a few lines. Search engines treat such pages as low value.
How to fix: Add content that answers what a visitor to this page actually needs. If the page has no purpose of its own, merge it into a related page or keep it out of search.
Official guidance: developers.google.com/search/docs/fundamentals/creating-helpful-content
Low word count
Severity: Notice · Dimension: Content & AI readability · Rule ID: low-word-count · Checked by: Rule check · Effort: large
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has less text than the topic usually needs to rank.
How to fix: Expand it with useful detail such as specifications, answers to common questions or examples, not filler.
Official guidance: developers.google.com/search/docs/fundamentals/creating-helpful-content
Possible keyword stuffing
Severity: Warning · Dimension: Content & AI readability · Rule ID: keyword-stuffing · Checked by: AI judgment · Effort: medium
What it means: The text doesn't read like a person writing for other people: search terms are repeated far more often than natural writing would. It reads badly and risks a search penalty.
How to fix: Rewrite the affected passages naturally, use synonyms, and cut the repetition in headings, alt text and footers.
Official guidance: developers.google.com/search/docs/essentials/spam-policies#keyword-stuffing
Target phrase missing from the title
Severity: Warning · Dimension: Content & AI readability · Rule ID: keyword-missing-title · Checked by: Keyword check · Effort: small
What it means: The phrase this page should rank for is not in the part of the <title> Google shows. A match only in the second half of the title is cut off in search results.
How to fix: Put that phrase in the first half of the <title>, before the brand name.
Official guidance: developers.google.com/search/docs/appearance/title-link
Target phrase missing from the H1
Severity: Notice · Dimension: Content & AI readability · Rule ID: keyword-missing-h1 · Checked by: Keyword check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The phrase this page should rank for is not in any H1, so the heading a visitor sees first does not say what the page is for.
How to fix: Use the phrase in the page's H1, in the words a searcher would use.
Official guidance: developers.google.com/search/docs/fundamentals/seo-starter-guide
Target phrase missing from the meta description
Severity: Notice · Dimension: Content & AI readability · Rule ID: keyword-missing-description · Checked by: Keyword check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The phrase this page should rank for is not in the meta description, so the snippet under the result does not mention it.
How to fix: Work the phrase into the meta description once, in a sentence about what the visitor gets.
Official guidance: developers.google.com/search/docs/appearance/snippet
Target phrase missing from the opening
Severity: Notice · Dimension: Content & AI readability · Rule ID: keyword-missing-intro · Checked by: Keyword check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The phrase this page should rank for does not appear in the opening of the page, so the first screen does not confirm the visitor is in the right place.
How to fix: Use the phrase in the first paragraph, or the first line of a page written in Chinese, Japanese, Korean or Thai.
Official guidance: developers.google.com/search/docs/fundamentals/creating-helpful-content
A searched phrase is missing from the title
Severity: Warning · Dimension: Content & AI readability · Rule ID: gsc-query-title-gap · Checked by: Keyword check · Effort: small
What it means: Google already shows this page for a query with real demand, and that query is in neither the title nor the H1. The title is ignoring a search the page already earns.
How to fix: Work the query into the title or the H1, if the page actually answers it. Leave it out when the page is about something else.
Official guidance: developers.google.com/search/docs/appearance/title-link
Target phrase is not at the start of the title
Severity: Notice · Dimension: Content & AI readability · Rule ID: keyword-not-title-start · Checked by: Keyword check · Effort: small
What it means: The phrase this page should rank for is in the title, but not in the opening (the first third of the width, or the first few words). Searchers see the beginning of the title first.
How to fix: Move that phrase to the start of the title, before the brand name.
Official guidance: developers.google.com/search/docs/appearance/title-link
The site has no llms.txt
Severity: Notice · Dimension: Content & AI readability · Rule ID: llms-txt-missing · Checked by: Site check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: /llms.txt is missing, or that address answers with a web page. An HTML catch-all counts as missing. Some products fetch this file to find pages, and it has to be plain text.
How to fix: Publish /llms.txt at the domain root as text/plain: a # title, an optional one-line summary, and markdown links to real pages. Next.js: public/llms.txt or app/llms.txt/route.ts. Astro and TanStack Start: public/llms.txt. Fumadocs: generate it from the docs source. Docusaurus and other static sites: static/llms.txt or the host's public folder.
Official guidance: llmstxt.org
llms.txt isn't a usable page map
Severity: Notice · Dimension: Content & AI readability · Rule ID: llms-txt-invalid · Checked by: Site check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: /llms.txt is published as plain text, but it is not a usable map: it needs a title (# …) and at least one markdown link to a page. Some products fetch this file to find pages. A missing file, or an HTML page at that address, is a separate check.
How to fix: Give /llms.txt a # title, an optional summary, and a list of markdown links to the pages you want read, for example - [Pricing](https://example.com/pricing): plans and prices. Serve it as text/plain. Next.js can use public/llms.txt or app/llms.txt/route.ts; Astro and TanStack Start use public/llms.txt; Fumadocs can generate it from the docs; Docusaurus and other static sites use static/llms.txt.
Official guidance: llmstxt.org
llms.txt links to pages that fail
Severity: Warning · Dimension: Content & AI readability · Rule ID: llms-txt-broken-links · Checked by: Site check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: /llms.txt links to pages on this site that answer with an error. The issue lists the ones that were checked. Anything that follows the file lands on a dead page.
How to fix: Point each link at a page that answers 200, or remove the line. The issue lists the first ones that failed. The file is usually public/llms.txt or the route that serves it.
Official guidance: llmstxt.org
Page not optimized for AI citation
Severity: Notice · Dimension: Content & AI readability · Rule ID: page-not-citable-by-llm · Checked by: AI judgment · Effort: large
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page's sections don't open with a plain answer, or can't be understood on their own. AI answers and featured snippets quote passages that state the point up front; there is no markup shortcut for this.
How to fix: Start each section with a sentence that answers its heading directly, then add the detail. Use headings that match how people ask, and state specific facts and numbers.
Official guidance: developers.google.com/search/docs/appearance/ai-features
Missing author byline
Severity: Notice · Dimension: Content & AI readability · Rule ID: missing-author-byline · Checked by: AI judgment · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The article doesn't say who wrote it, on the page or in its structured data. A named author helps readers judge the content and is part of what Google's quality guidelines look for.
How to fix: Show the author's name with a link to a short bio or author page, and add the author to the page's Article JSON-LD.
Official guidance: developers.google.com/search/docs/fundamentals/creating-helpful-content
Missing publication date
Severity: Notice · Dimension: Content & AI readability · Rule ID: missing-publish-date · Checked by: AI judgment · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The article doesn't show when it was published or updated, on the page or in its structured data, so readers can't tell whether it's current.
How to fix: Show the published (and updated) date on the page and add datePublished and dateModified to the page's JSON-LD.
Official guidance: developers.google.com/search/docs/appearance/publication-dates
Images
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| Images missing alt text | Warning | Page basics | Rule check |
| Images not lazy-loaded | Notice | Performance | Rule check |
Images missing alt text
Severity: Warning · Dimension: Page basics · Rule ID: image-missing-alt · Checked by: Rule check · Effort: medium
What it means: One or more <img> elements have no alt attribute, and the issue says how many of the page's images are affected. Screen readers cannot describe them and Google Images has less to go on.
How to fix: Give every meaningful image a short alt that describes it. Purely decorative images should get an empty alt="".
Official guidance: developers.google.com/search/docs/appearance/google-images
Images not lazy-loaded
Severity: Notice · Dimension: Performance · Rule ID: image-no-lazy-loading · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: Images further down the page load right away with it and compete for bandwidth with what the visitor sees first.
How to fix: Add loading="lazy" to images below the fold. Do not lazy-load the main image at the top of the page, because that slows down Largest Contentful Paint.
Official guidance: web.dev/articles/browser-level-image-lazy-loading
Links
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| No internal links | Warning | Page basics | Rule check |
| Few internal links | Notice | Page basics | Rule check |
| Excessive external links | Notice | Page basics | Rule check |
| No internal link uses the target phrase | Notice | Content & AI readability | Keyword check |
| Focus page has few internal links | Warning | Content & AI readability | Keyword check |
| Internal links to pages that answer with an error | Warning | Page basics | Site check |
| Sitemap pages no other page links to | Warning | Page basics | Site check |
No internal links
Severity: Warning · Dimension: Page basics · Rule ID: no-internal-links · Checked by: Rule check · Effort: medium
What it means: The page links to no other page on your site. It passes no value to the rest of the site, and crawlers find less from it.
How to fix: Add links to related pages in the content, plus navigation or breadcrumbs. Make sure links are real <a href> elements, not click handlers.
Official guidance: developers.google.com/search/docs/crawling-indexing/links-crawlable
Few internal links
Severity: Notice · Dimension: Page basics · Rule ID: too-few-internal-links · Checked by: Rule check · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has very few links to other pages on your site, so it may be undervalued and does little to help visitors onward.
How to fix: Link to related products, articles or categories wherever it helps the reader.
Official guidance: developers.google.com/search/docs/crawling-indexing/links-crawlable
Excessive external links
Severity: Notice · Dimension: Page basics · Rule ID: excessive-external-links · Checked by: Rule check · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page links out to many external domains. Each outbound link should be there for the reader.
How to fix: Remove links that are not editorially justified. Mark paid or affiliate links with rel="sponsored" and user-submitted links with rel="ugc".
Official guidance: developers.google.com/search/docs/fundamentals/seo-starter-guide
No internal link uses the target phrase
Severity: Notice · Dimension: Content & AI readability · Rule ID: keyword-anchor-missing · Checked by: Keyword check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: Other pages of the site link here, and none of those links use the phrase this page should rank for. The anchor text is the hint those links pass on.
How to fix: On at least one internal link to this page, use the phrase as the visible link text.
Official guidance: developers.google.com/search/docs/crawling-indexing/links-crawlable
Focus page has few internal links
Severity: Warning · Dimension: Content & AI readability · Rule ID: focus-page-few-inlinks · Checked by: Keyword check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: Fewer than five pages link to the focus page, or those links use fewer than five different anchor texts. The page gets little of the site's internal attention.
How to fix: Add internal links from related pages. In an assistant, call link_suggestions and approve the ones that fit.
Official guidance: developers.google.com/search/docs/crawling-indexing/links-crawlable
Internal links to pages that answer with an error
Severity: Warning · Dimension: Page basics · Rule ID: internal-links-to-errors · Checked by: Site check · Effort: medium
What it means: Pages of your site link to other pages of your site that answer with an error (4xx or 5xx). The issue says how many pages link to how many dead ones, with examples. Visitors who follow these links hit a dead end, and crawlers spend their visit on them.
How to fix: Point each link at the page's current address, or remove it. If the page moved, redirect the old address to the new one so outside links keep working too.
Official guidance: developers.google.com/crawling/docs/troubleshooting/http-status-codes
Sitemap pages no other page links to
Severity: Warning · Dimension: Page basics · Rule ID: orphan-pages · Checked by: Site check · Effort: medium
What it means: Your sitemap lists pages that no page of your site links to. The issue says how many and gives examples; each was checked and loads. Visitors can only reach them from outside, and search engines give pages nobody links to little weight. Sometimes they are pages that shouldn't be in the sitemap at all (a template, a verification file, an old campaign).
How to fix: Link each page that matters from a related page, a hub or the navigation. Take the ones that shouldn't be public out of the sitemap.
Official guidance: developers.google.com/search/docs/crawling-indexing/links-crawlable
Structured data
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| No JSON-LD structured data | Notice | Structured data | Rule check |
| Product page without Product structured data | Warning | Structured data | Rule check |
| Invalid structured data | Warning | Structured data | Rule check |
| Missing Organization schema | Notice | Structured data | Rule check |
| Missing breadcrumb schema | Notice | Structured data | Rule check |
No JSON-LD structured data
Severity: Notice · Dimension: Structured data · Rule ID: missing-structured-data · Checked by: Rule check · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has no JSON-LD block. Structured data describes the page (a product, an article, your business) in a form search engines read directly, and many rich results require it.
How to fix: Add a <script type="application/ld+json"> block of the matching Schema.org type. Ask your assistant (problem) for a ready-to-paste block picked for your type of site; replace the placeholder values before publishing.
Official guidance: developers.google.com/search/docs/appearance/structured-data/intro-structured-data
Product page without Product structured data
Severity: Warning · Dimension: Structured data · Rule ID: missing-product-schema · Checked by: Rule check · Effort: medium
What it means: This is a product page, but it has no Product structured data. Google Shopping, rich results and AI assistants read a product's name, price, currency and availability from that markup; without it they have to guess from the page, if they can see it at all.
How to fix: Add a Product JSON-LD block with name, image, description and an offers object (price, priceCurrency, availability, url), generated from the same data the page shows. On a site that renders in the browser, it has to be in the HTML the server sends.
Official guidance: developers.google.com/search/docs/appearance/structured-data/product-snippet
Invalid structured data
Severity: Warning · Dimension: Structured data · Rule ID: invalid-structured-data · Checked by: Rule check · Effort: small
What it means: The page's JSON-LD has errors against Schema.org rules. Loomaly checks this with its own validator, not with AI, and the issue shows the path of the first error and how many more there are. Only errors are reported, not warnings.
How to fix: Correct the property at the reported path. Ask your assistant (problem) for a repaired copy of your own markup, what it changed, and what still needs a fact only you have. Then test the page in Google's Rich Results Test.
Official guidance: developers.google.com/search/docs/appearance/structured-data/sd-policies
Missing Organization schema
Severity: Notice · Dimension: Structured data · Rule ID: missing-organization-schema · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The homepage has no Organization (or LocalBusiness) JSON-LD, which tells search engines your name, logo and profiles and makes you eligible for a knowledge panel.
How to fix: Add Organization JSON-LD to the homepage with name, url, logo and sameAs links to your profiles. Local businesses should use LocalBusiness with address and opening hours. Ask your assistant (problem) for a template to fill in.
Official guidance: developers.google.com/search/docs/appearance/structured-data/organization
Missing breadcrumb schema
Severity: Notice · Dimension: Structured data · Rule ID: missing-breadcrumb-schema · Checked by: Rule check · Effort: medium
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page has no BreadcrumbList JSON-LD, which lets Google show the page's place in your site instead of a bare URL.
How to fix: Add BreadcrumbList JSON-LD that matches the page's position in your navigation. Most platforms and SEO plugins can generate it from your breadcrumbs. Ask your assistant (problem) for a template.
Official guidance: developers.google.com/search/docs/appearance/structured-data/breadcrumb
Technical
Error page served as a normal page
Severity: Error · Dimension: Indexability · Rule ID: soft-404 · Checked by: Page judgment · Effort: medium
What it means: The page says it is not found or broken but answers with HTTP 200, so search engines keep it indexed as a real page.
How to fix: Return a real 404 or 410 status for pages that are gone, or redirect (301) to the right page.
Official guidance: developers.google.com/crawling/docs/troubleshooting/http-status-codes
Crawlers that run no JavaScript see an empty page
Severity: Error · Dimension: Indexability · Rule ID: client-rendered-without-ssr · Checked by: Rule check · Effort: large
What it means: Fetched without running JavaScript, the page is a sizeable document (20 KB of HTML or more) with under 150 characters of text: the content only appears after JavaScript runs. That is what crawlers that run no JavaScript see, including most AI crawlers (ChatGPT, Perplexity, Claude) and link previews. Some sites send a rendered page to Googlebot only; Google then sees the content and the AI crawlers still do not. Pages like this are too empty to judge, so they get this issue instead of the AI judgment.
How to fix: Render the page on the server or pre-render it at build time, so the HTML already contains the content. Most frameworks offer server-side rendering or static generation.
Official guidance: developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics
Only search engines get the rendered page; AI crawlers see it empty
Severity: Warning · Dimension: Content & AI readability · Rule ID: prerendered-for-search-engines-only · Checked by: Rule check · Effort: large
What it means: Fetched as a normal visitor, the page is an empty shell that JavaScript fills in later; fetched as Googlebot, it arrives fully rendered. The site pre-renders pages for search engines only. Google and Bing therefore see the content and can rank it, but AI crawlers (ChatGPT, Perplexity, Claude and others) run no JavaScript and aren't on the pre-render list, so they see the empty page and can't quote prices, stock or details in their answers.
How to fix: Add the major AI crawlers (GPTBot, OAI-SearchBot, PerplexityBot, ClaudeBot and similar) to the pre-render list, which is usually a one-line change in the pre-render service or CDN rule. Longer term, render the content on the server for everyone.
Official guidance: developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering
Page served over HTTP
Severity: Error · Dimension: Indexability · Rule ID: non-https · Checked by: Rule check · Effort: medium
What it means: The page is served over plain HTTP. HTTPS is a confirmed Google ranking factor, and browsers mark HTTP pages as not secure.
How to fix: Install a TLS certificate, redirect every HTTP URL to its HTTPS version with a 301, and update internal links and canonicals to HTTPS.
Official guidance: developers.google.com/search/docs/appearance/page-experience
robots.txt is not a valid robots file
Severity: Warning · Dimension: Indexability · Rule ID: robots-txt-invalid · Checked by: Site check · Effort: small
What it means: /robots.txt at the root of your domain answers with a web page or a server error instead of plain-text rules. Crawlers find no rules and no sitemap in it, and a server error there makes Google pause crawling the site.
How to fix: Serve /robots.txt as text/plain from the domain root, with your User-agent rules and a Sitemap: line. Make sure the app's catch-all route or a redirect to the homepage doesn't answer for it.
Official guidance: developers.google.com/crawling/docs/robots-txt/create-robots-txt
robots.txt doesn't point to a sitemap
Severity: Notice · Dimension: Indexability · Rule ID: robots-txt-no-sitemap · Checked by: Site check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: robots.txt has no Sitemap: line, or the site has no robots.txt. Search engines you submitted the sitemap to still have it; Bing, AI crawlers and others have to find it on their own.
How to fix: Add Sitemap: https://your-domain/sitemap.xml (the full URL of each sitemap) to /robots.txt. If the site has no robots.txt (the evidence says no robots.txt), create one: that line alone is a valid file and blocks nothing.
Official guidance: developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap#addsitemap
robots.txt contains only comments
Severity: Notice · Dimension: Indexability · Rule ID: robots-only-comments · Checked by: Site check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: robots.txt has no crawler rules and no Sitemap line, only comments. A host such as Cloudflare publishes a file like this and manages it, so the copy in the project may not be what crawlers read.
How to fix: Add a Sitemap line in the host's robots.txt settings. If you control the file, replace the comments with real rules and a Sitemap line.
Official guidance: developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap#addsitemap
robots.txt blocks the crawlers behind AI search answers
Severity: Warning · Dimension: Content & AI readability · Rule ID: ai-search-crawlers-blocked · Checked by: Site check · Effort: small
What it means: robots.txt disallows one or more of the crawlers that fetch pages for AI answers with search: OAI-SearchBot (ChatGPT search), Claude-SearchBot (Claude) and PerplexityBot (Perplexity). The issue names which. Those products can't read the site, so they can't quote or link it. This is different from the training crawlers (GPTBot, ClaudeBot, Google-Extended): blocking those only keeps your pages out of future model training, and many sites block both groups at once without meaning to. Blocks set up at the CDN, such as a bot-blocking toggle, aren't in robots.txt and aren't checked here.
How to fix: If you want to appear in AI answers, remove the Disallow lines for the named crawlers, or give each its own group with Allow: /, for example User-agent: OAI-SearchBot followed by Allow: /. You can keep blocking GPTBot, ClaudeBot and Google-Extended if you don't want your content used for training. If the block is on purpose, ignore this issue.
Official guidance: developers.openai.com/api/docs/bots
robots.txt blocks AI crawlers
Severity: Warning · Dimension: Content & AI readability · Rule ID: ai-crawler-blocked · Checked by: Site check · Effort: small
What it means: robots.txt disallows one or more AI crawlers from the homepage. Search and answer crawlers (OAI-SearchBot, Claude-SearchBot, PerplexityBot) are a warning: those products can't read the site. Training crawlers (GPTBot, ClaudeBot, Google-Extended, and similar ones such as Applebot-Extended and CCBot) are only a notice: blocking them keeps pages out of future model training and does not by itself keep the site out of AI answers. The issue names which. A Content-Signal refusal is a separate check. Blocks set up at the CDN aren't in robots.txt and aren't checked here.
How to fix: If you want the site in AI answers, remove the Disallow for the search crawlers the issue names, or give each its own group with Allow: /. You can keep blocking training crawlers; that stays a notice. If the block is on purpose, ignore this issue.
Official guidance: developers.openai.com/api/docs/bots
The site asks AI answer engines not to use its pages
Severity: Warning · Dimension: Content & AI readability · Rule ID: content-signal-blocks-ai-answers · Checked by: Site check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: robots.txt sets Content-Signal so that search or AI-input use is off (search=no or ai-input=no) for the crawlers that fetch pages for AI answers: OAI-SearchBot, Claude-SearchBot and PerplexityBot. Those products are asked not to use the pages in their answers. Blocking training only (ai-train=no) does not raise this.
How to fix: On the Content-Signal line that applies to * or to those crawlers, set ai-input=yes and search=yes if you want them allowed to use the pages. You can keep ai-train=no. If the refusal is on purpose, ignore this issue.
Official guidance: contentsignals.org
No sitemap found
Severity: Warning · Dimension: Indexability · Rule ID: sitemap-missing · Checked by: Site check · Effort: small
What it means: No sitemap.xml answers, and robots.txt does not name one. With this many pages, crawlers have to discover every URL from links.
How to fix: Generate an XML sitemap from the route or content source and add a Sitemap line to robots.txt. Then submit it from Loomaly. You do not need to open Search Console.
Official guidance: developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
Sitemap leaves out indexable pages
Severity: Warning · Dimension: Indexability · Rule ID: sitemap-stale · Checked by: Site check · Effort: medium
What it means: The site has a sitemap, and indexable pages the crawl found are not in it. A trailing slash, www or a query string is not a different page.
How to fix: Generate the sitemap from the same source as the routes or content so new pages are included automatically. Do not hand-add URLs. Leave out sign-in and app pages.
Official guidance: developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
Sitemap is not valid XML
Severity: Warning · Dimension: Indexability · Rule ID: sitemap-invalid · Checked by: Site check · Effort: medium
What it means: A sitemap address answers with something that isn't a sitemap: usually the site's own web page, served by a catch-all route, or a 404 where robots.txt says a sitemap is. Crawlers get no URL list from it.
How to fix: Serve the sitemap as XML (<urlset> or <sitemapindex>) with an XML content type, and point robots.txt only at sitemap URLs that exist.
Official guidance: developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
Sitemap lists pages that aren't the version to index
Severity: Warning · Dimension: Indexability · Rule ID: sitemap-lists-non-canonical · Checked by: Site check · Effort: medium
What it means: The sitemap lists URLs that aren't the version Google should index: they declare another URL as canonical, redirect to another page, or answer with an error. The issue says how many, with examples (a redirect shows where it goes). Google trusts a sitemap less when it disagrees with the pages.
How to fix: Generate the sitemap from the same source as the canonical tags, list only URLs that answer 200 without redirecting and point their canonical at themselves, and replace old paths with the addresses they redirect to.
Official guidance: developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
Canonicals point to addresses that redirect or fail
Severity: Warning · Dimension: Indexability · Rule ID: canonical-target-broken · Checked by: Site check · Effort: medium
What it means: Some pages name a canonical URL (the version search engines should index) that itself redirects or answers with an error. The issue lists each such address and what it answered, and how many pages name it. Search engines are sent to a detour or a dead end, and may ignore the canonical or drop the page.
How to fix: Point each canonical at the final address that answers 200: usually the page itself, or the place the old address now redirects to. Canonicals are usually set in one shared template or an SEO plugin setting.
Official guidance: developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
Separate mobile site without rel="alternate"
Severity: Warning · Dimension: Indexability · Rule ID: mobile-site-not-annotated · Checked by: Site check · Effort: medium
What it means: Phones, including Googlebot's smartphone crawler, are redirected to a separate mobile site on another host (the issue names it). Google asks for the pair to be declared both ways: the mobile page's canonical points to the desktop page, and the desktop page has a rel="alternate" link with a media attribute pointing to the mobile page. The desktop page has no such link.
How to fix: On every desktop page, add <link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.your-site/..."> for its mobile URL, and keep the mobile page's canonical pointing back. Or serve one responsive site at one address.
Official guidance: developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing
Other versions of the address don't redirect permanently
Severity: Warning · Dimension: Indexability · Rule ID: host-variants-not-redirected · Checked by: Site check · Effort: small
What it means: Your site answers at more than one address: the http:// version, or the version with or without www., either shows the site itself or sends visitors on with a temporary redirect (302 or 307). The issue lists each address and what it answered. Search engines then may treat them as separate sites and split links and signals between them.
How to fix: Make every other version answer with one permanent redirect (301 or 308) straight to your main address, for example in your host's or CDN's domain settings (on Cloudflare: Always Use HTTPS and a redirect rule for the other host).
Official guidance: developers.google.com/search/docs/crawling-indexing/301-redirects
Missing favicon
Severity: Notice · Dimension: Page basics · Rule ID: missing-favicon · Checked by: Rule check · Effort: small
What it means: The page declares no favicon. Google shows it next to your result, and browsers show it in tabs and bookmarks.
How to fix: Add <link rel="icon" href="/favicon.ico"> (or a PNG or SVG icon) to the <head>.
Official guidance: developers.google.com/search/docs/appearance/favicon-in-search
Page returned non-200 status
Severity: Error · Dimension: Indexability · Rule ID: non-200-status · Checked by: Rule check · Effort: medium
What it means: The page answers with an error status (after following any redirects), which keeps it out of normal indexing. The issue shows the status code.
How to fix: If the page should exist, fix the server error or restore the page. If it was removed on purpose, redirect it to a replacement, or remove links to it and take it out of your sitemap.
Official guidance: developers.google.com/crawling/docs/troubleshooting/http-status-codes
Performance
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| Largest Contentful Paint over 2.5s | Warning | Performance | Performance test |
| Interaction to Next Paint over 200ms | Warning | Performance | Performance test |
| Cumulative Layout Shift over 0.1 | Warning | Performance | Performance test |
| Time to First Byte over 800ms | Warning | Performance | Performance test |
| Lighthouse Performance score under 50 | Warning | Performance | Performance test |
| LCP image not loaded with priority | Warning | Performance | Performance test |
Largest Contentful Paint over 2.5s
Severity: Warning · Dimension: Performance · Rule ID: cwv-lcp-poor · Checked by: Performance test · Effort: large
What it means: Largest Contentful Paint, the time until the main content is visible, is over 2.5 seconds on mobile. Loomaly uses real-user Chrome data when the page has enough traffic, and a lab measurement otherwise.
How to fix: Find the element Lighthouse times as the LCP and where its time goes. For text, remove render-blocking CSS and JavaScript, preload the web font and use font-display, and render it on the server. For an image, make it load first (fetchpriority="high", no lazy loading, in the initial HTML) and serve it in a modern format at the right size. A slow server response delays both.
Official guidance: web.dev/articles/lcp
Interaction to Next Paint over 200ms
Severity: Warning · Dimension: Performance · Rule ID: cwv-inp-poor · Checked by: Performance test · Effort: large
What it means: Interaction to Next Paint, how quickly the page reacts to taps and clicks, is over 200 ms on mobile. This is only reported from real-user data, so it appears for pages with enough Chrome traffic.
How to fix: Break up long JavaScript tasks, defer scripts that are not needed right away, and trim or delay third-party scripts.
Official guidance: web.dev/articles/inp
Cumulative Layout Shift over 0.1
Severity: Warning · Dimension: Performance · Rule ID: cwv-cls-poor · Checked by: Performance test · Effort: medium
What it means: Cumulative Layout Shift, how much the page jumps around while loading, is over 0.1 on mobile.
How to fix: Set width and height on images and embeds, reserve space for ads and banners, and avoid inserting content above what is already on screen.
Official guidance: web.dev/articles/cls
Time to First Byte over 800ms
Severity: Warning · Dimension: Performance · Rule ID: cwv-ttfb-slow · Checked by: Performance test · Effort: large
What it means: Time to First Byte, how long the server takes to start answering, is over 800 ms. Everything else on the page waits for it.
How to fix: Cache pages at the edge with a CDN, speed up the server or hosting, enable compression, and avoid redirects before the page.
Official guidance: web.dev/articles/ttfb
Lighthouse Performance score under 50
Severity: Warning · Dimension: Performance · Rule ID: lighthouse-perf-low · Checked by: Performance test · Effort: large
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The page's Lighthouse performance score on mobile, from Google PageSpeed Insights, is below 50. That usually means several bottlenecks at once.
How to fix: Work through the specific performance issues reported for the same page first; the PageSpeed Insights report for the URL lists further opportunities.
Official guidance: developer.chrome.com/docs/lighthouse/performance/performance-scoring
LCP image not loaded with priority
Severity: Warning · Dimension: Performance · Rule ID: lcp-image-no-fetchpriority · Checked by: Performance test · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: PageSpeed Insights found that the page's largest element is an image the browser doesn't fetch first. On an <img> that means no fetchpriority="high", lazy loading, or an image that only appears after a script runs. On a CSS background the element is not an <img>, so fetchpriority on it does nothing. Fixing the request often takes 200 to 500 ms off LCP.
How to fix: If the element is an <img>, give it fetchpriority="high", remove loading="lazy", and put it in the HTML the server sends. If it is a CSS background on another element, do not add fetchpriority to that element: preload the image with <link rel="preload" as="image" fetchpriority="high">, or render it as an <img>.
Official guidance: web.dev/articles/fetch-priority
International
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
| Hreflang missing self-reference | Warning | Page basics | Rule check |
| Missing hreflang x-default | Notice | Page basics | Rule check |
Hreflang missing self-reference
Severity: Warning · Dimension: Page basics · Rule ID: hreflang-self-referential-missing · Checked by: Rule check · Effort: medium
What it means: The page lists its other language versions in hreflang but not itself. Each hreflang set must include the page's own URL.
How to fix: Add an hreflang entry for the page's own language that points to its own URL.
Official guidance: developers.google.com/search/docs/specialty/international/localized-versions
Missing hreflang x-default
Severity: Notice · Dimension: Page basics · Rule ID: hreflang-x-default-missing · Checked by: Rule check · Effort: small
What it means: The hreflang set has no x-default, the fallback version for visitors whose language you do not offer.
How to fix: Add hreflang="x-default" pointing to your language selector or default version.
Official guidance: developers.google.com/search/docs/specialty/international/localized-versions
Accessibility
| Rule | Severity | Dimension | Checked by |
|---|---|---|---|
Missing lang attribute on <html> | Warning | Page basics | Rule check |
Missing lang attribute on <html>
Severity: Warning · Dimension: Page basics · Rule ID: missing-html-lang · Checked by: Rule check · Effort: small
Good practice, not a Google requirement: it doesn't decide rankings on its own.
What it means: The <html> element has no lang attribute, so screen readers and translation tools cannot tell which language the page is in.
How to fix: Set it to the page's language code, for example <html lang="en">, lang="de" or lang="zh-CN".
Official guidance: developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang