What the RELACON website check examines

The check runs 193 rules in four areas. Every rule below explains what is measured, why it matters, how a fix looks and where the requirement comes from.

Four areas

What is fetched

The page itself, its http and www variants, robots.txt, sitemap.xml, llms.txt, security.txt, favicon, web app manifest, a non-existent URL for the 404 test, the MTA-STS policy, up to five images and the og:image. The page is also fetched once as Googlebot and once as GPTBot (our probe names itself) to find bot challenges. DNS records are read over DNS-over-HTTPS.

SEO basics (64 checks)

HTTPS

SeverePage loads over HTTPSseo.https.loads
What is checked
Whether the page is reachable and ends up being served over HTTPS.
Why it matters
Browsers flag HTTP pages as not secure and Google prefers HTTPS. Without encryption, third parties can read or alter the content.
Example
`https://www.example.com/` instead of `http://www.example.com/`
Source
web.dev: Why HTTPS matters
SevereHTTP redirects to HTTPS with a 301seo.https.redirect
What is checked
Whether the `http://` address of the page permanently (301 or 308) redirects to the HTTPS address.
Why it matters
Old links and typed addresses without `https` would otherwise land on the unencrypted version. A permanent redirect gives search engines one clear main URL.
Example
`http://example.com/` → `301` → `https://example.com/`
Source
Google Search Central: Redirects and Google Search
SevereValid TLS certificateseo.https.cert
What is checked
Whether the HTTPS connection can be established without certificate errors.
Why it matters
With an expired or mismatched certificate, browsers show a warning page and crawlers abort the request.
Example
Certificate for `example.com` and `www.example.com`, renewed automatically (e.g. Let's Encrypt).
Source
MDN: Transport Layer Security
MediumHSTS setseo.https.hsts
What is checked
Whether the response includes the `Strict-Transport-Security` header.
Why it matters
With HSTS, browsers only load the site over HTTPS, even when someone types `http://`. This removes the first unencrypted request.
Example
`Strict-Transport-Security: max-age=63072000; includeSubDomains`
Source
MDN: Strict-Transport-Security

Redirects

Mediumwww and non-www consistentseo.redirect.www
What is checked
Whether the variant with or without `www` ends up on the same host as the checked page.
Why it matters
If both variants serve content, search engines see duplicate pages and signals are split across two addresses.
Example
`https://www.example.com/` → `301` → `https://example.com/`
Source
Google Search Central: Consolidate duplicate URLs
MediumAt most 2 redirect hopsseo.redirect.hops
What is checked
How many redirects it takes until the final page answers.
Why it matters
Every hop adds load time, and crawlers do not follow long chains indefinitely.
Example
`http://example.com` → `https://example.com/` in one step instead of via `www` and a language path.
Source
Google Search Central: Redirects and Google Search
LowNo 302 for permanent redirectsseo.redirect.302
What is checked
Whether a temporary redirect (302 or 307) occurs on the way to the page.
Why it matters
A temporary redirect tells search engines the old address will come back. For permanent moves, 301 or 308 is the clearer signal.
Example
`HTTP/1.1 301 Moved Permanently` instead of `302 Found`
Source
Google Search Central: Redirects and Google Search

Indexability

SevereNo noindexseo.index.noindex
What is checked
Whether the robots meta tag or the `X-Robots-Tag` header contains `noindex`.
Why it matters
With `noindex` the page does not appear in search results. It is often left over from a staging site after a relaunch.
Example
`<meta name="robots" content="index, follow">` or leave the tag out entirely.
Source
Google Search Central: Block indexing with noindex
SevereNot blocked by robots.txtseo.index.robotsblocked
What is checked
Whether a `Disallow` rule in robots.txt blocks the page's path for Googlebot.
Why it matters
Google cannot read blocked pages. They appear without a description at best, or not at all.
Example
`User-agent: *` with `Disallow: /internal/` instead of `Disallow: /`
Source
Google Search Central: Introduction to robots.txt

Title

SevereTitle presentseo.title.present
What is checked
Whether the page has a non-empty `<title>` element.
Why it matters
The title is the basis for the headline in search results and the name in the browser tab.
Example
`<title>Tax advice in Graz | Example Ltd</title>`
Source
Google Search Central: Influencing your title links
MediumTitle 30–60 charactersseo.title.length
What is checked
Whether the title is between 30 and 60 characters long.
Why it matters
Very short titles say little, very long ones are cut off in search results. Google sets no fixed limit; the range is a guideline.
Example
`Tax advice in Graz | Example Ltd` (32 characters)
Source
Google Search Central: Influencing your title links
MediumOnly one title elementseo.title.unique
What is checked
Whether the HTML contains exactly one `<title>` element.
Why it matters
With several titles it is unclear which one applies. This often happens when both a theme and a plugin add one.
Example
A single `<title>` in the `<head>`.
Source
MDN: <title> element
LowTitle not identical to H1seo.title.h1
What is checked
Whether the title and the first H1 are word for word the same.
Why it matters
Title and H1 do different jobs: the title sells the page in search results, the H1 guides the reader on the page. Two different phrasings make use of both.
Example
Title `Tax advice in Graz | Example Ltd`, H1 `Your tax adviser in Graz`
Source
Google Search Central: Influencing your title links
MediumTitle has at least two wordsseo.title.words
What is checked
The title consists of at least two words.
Why it matters
A single word tells search engines little about the page.
Example
Wrong: “Home”. Right: “Web design for small businesses”.
Source
Google Search Central
LowTitle names more than the brandseo.title.notbrand
What is checked
The title contains a topic in addition to the brand name.
Why it matters
A title with only the company name is rarely clicked in search results.
Example
Wrong: “Muster Ltd”. Right: “Tax advice Graz | Muster”.
Source
Google Search Central

Meta description

MediumMeta description presentseo.meta.present
What is checked
Whether the page has a `<meta name="description">` with content.
Why it matters
Google often uses the description as the text below the search result. Without it, Google picks an excerpt itself, which does not always fit.
Example
`<meta name="description" content="Tax advice for freelancers in Graz. Free first consultation.">`
Source
Google Search Central: Control your snippets in search results
LowMeta description 70–160 charactersseo.meta.length
What is checked
Whether the meta description is between 70 and 160 characters long.
Why it matters
Short descriptions waste space in the search result, long ones are cut off. The range is a guideline, not a Google requirement.
Example
Two short sentences: offer, location, next step.
Source
Google Search Central: Control your snippets in search results
MediumMeta description is not a placeholderseo.meta.placeholder
What is checked
The meta description contains original text instead of a placeholder or CMS default.
Why it matters
Placeholders appear verbatim in search results and look untrustworthy.
Example
Wrong: “Just another WordPress site”. Right: a sentence about the page.
Source
Google Search Central
LowMeta description differs from the titleseo.meta.nottitle
What is checked
The meta description and the title are not the same text.
Why it matters
Two identical texts waste space in the search result.
Example
Wrong: title “Muster | Web design” and description “Muster - Web design”.
Source
Google Search Central

Canonical

MediumCanonical presentseo.canonical.present
What is checked
Whether the page has a `<link rel="canonical">` with an address.
Why it matters
The same page is often reachable under several addresses (with parameters, with a trailing slash). The canonical says which address belongs in the index.
Example
`<link rel="canonical" href="https://example.com/services/">`
Source
Google Search Central: Consolidate duplicate URLs
LowCanonical is absoluteseo.canonical.absolute
What is checked
Whether the canonical is a full address with `https://` and the domain.
Why it matters
Relative values usually work but easily point to the wrong address with copies, proxies or a wrong base URL. Google recommends absolute URLs.
Example
`https://example.com/services/` instead of `/services/`
Source
Google Search Central: Consolidate duplicate URLs
MediumCanonical points to a reachable pageseo.canonical.self
What is checked
Whether the canonical points to the same domain as the checked page.
Why it matters
A canonical pointing to another domain (such as the old domain or a staging site) moves the page in the index over there.
Example
Page `https://example.com/blog/` with canonical `https://example.com/blog/`
Source
Google Search Central: Consolidate duplicate URLs
MediumCanonical matches the served URLseo.canonical.matches
What is checked
The canonical names the same address the server serves, with trailing slash, letter case and default port normalised.
Why it matters
If the canonical points elsewhere, Google may index the wrong address.
Example
Served: `/contact` → `<link rel="canonical" href="/contact">`.
Source
Google Search Central
LowCanonical without tracking parametersseo.canonical.noquery
What is checked
The canonical contains no tracking or session parameters; pagination is allowed.
Why it matters
Parameters create duplicates of the same page.
Example
Wrong: `?utm_source=newsletter`. Right: `/product`.
Source
Google Search Central

Headings

MediumExactly one H1seo.headings.h1
What is checked
How many `<h1>` headings the page has.
Why it matters
One H1 names the main topic of the page. If it is missing or there are several, it is less clear to readers, screen readers and search engines what the page is about.
Example
`<h1>Tax advice in Graz</h1>`, followed by `<h2>` sections
Source
MDN: <h1>–<h6> elements
LowHeading order without skipped levelsseo.headings.order
What is checked
Whether heading levels follow each other without skipping (e.g. not from H2 straight to H4).
Why it matters
Screen reader users navigate a page by its headings. An outline without gaps helps them and makes the structure unambiguous for machines.
Example
H1 → H2 → H3 → H2
Source
MDN: <h1>–<h6> elements
LowSubheadings (H2) presentseo.headings.h2
What is checked
The page structures its content with at least one H2.
Why it matters
Subheadings help readers, screen readers and search engines grasp the content.
Example
`<h2>Services</h2>` below the H1.
Source
Google Search Central

Language and hreflang

Mediumlang attribute on the html elementseo.lang
What is checked
Whether the `<html>` element has a `lang` attribute.
Why it matters
The language setting drives pronunciation in screen readers, hyphenation and automatic translation.
Example
`<html lang="en">`
Source
MDN: lang attribute
Lowhreflang valid (with x-default)seo.hreflang
What is checked
Whether existing `hreflang` entries use valid language codes and include an `x-default`. Single-language sites need none.
Why it matters
With hreflang, Google shows each user the matching language version. Invalid codes are ignored; `x-default` covers all other languages.
Example
`<link rel="alternate" hreflang="en-GB" href="https://example.com/">` and `hreflang="x-default"`
Source
Google Search Central: Localized versions of your pages

Open Graph

Mediumog:title presentseo.og.title
What is checked
Whether the page has a `<meta property="og:title">` with content.
Why it matters
LinkedIn, Facebook, Slack and messengers show og:title as the headline of the link preview.
Example
`<meta property="og:title" content="Tax advice in Graz">`
Source
The Open Graph protocol
Mediumog:description presentseo.og.description
What is checked
Whether the page has a `<meta property="og:description">` with content.
Why it matters
The description appears below the headline of the link preview and helps decide whether someone clicks.
Example
`<meta property="og:description" content="Free first consultation, appointments online too.">`
Source
The Open Graph protocol
Mediumog:image reachable and at least 1200 px wideseo.og.image
What is checked
Whether an og:image is set, whether it can be loaded and whether it is at least 1200 px wide.
Why it matters
Without an image, a shared page looks plain. Images that are too small are shown as a small tile instead of a large preview.
Example
`<meta property="og:image" content="https://example.com/og.jpg">` at 1200×630 px
Source
The Open Graph protocol
Lowog:type presentseo.og.type
What is checked
The page declares its content type with `og:type`.
Why it matters
Social networks present the content more appropriately.
Example
`<meta property="og:type" content="website">`
Source
Open Graph protocol
Mediumog:image is a full HTTPS URLseo.og.imageabsolute
What is checked
The preview image is given as a full HTTPS URL.
Why it matters
Relative addresses and http fail to load a preview on some services.
Example
Right: `https://example.com/og.jpg`.
Source
Open Graph protocol
Lowog:url matches the canonicalseo.og.url
What is checked
`og:url` names the same address as the canonical, otherwise the served page.
Why it matters
Mismatched addresses create duplicates when sharing.
Example
`<meta property="og:url" content="https://example.com/page">`
Source
Open Graph protocol
Lowog:image with width and heightseo.og.imagesize
What is checked
The preview image width and height are declared in the head.
Why it matters
Without dimensions the preview loads later and is sometimes cropped wrongly.
Example
`og:image:width` 1200 and `og:image:height` 630.
Source
Open Graph protocol
Lowog:locale in the de_AT formatseo.og.locale
What is checked
The page language is declared in `og:locale` as language_COUNTRY.
Why it matters
Platforms then show the preview in the right language.
Example
`<meta property="og:locale" content="de_AT">`
Source
Open Graph protocol

X cards (Twitter)

Lowtwitter:card presentseo.og.twitter
What is checked
Whether the page has a `<meta name="twitter:card">`.
Why it matters
X (Twitter) uses twitter:card to pick the preview format. With `summary_large_image` the image is shown large.
Example
`<meta name="twitter:card" content="summary_large_image">`
Source
X Developer Platform: Cards markup
Lowtwitter:card is summary_large_imageseo.twitter.large
What is checked
The page uses the large card for X/Twitter.
Why it matters
Large cards are more visible and get more clicks.
Example
`<meta name="twitter:card" content="summary_large_image">`
Source
Open Graph protocol
Lowtwitter:image present (or og:image)seo.twitter.image
What is checked
An image is provided for X/Twitter, directly or as an og:image fallback.
Why it matters
Without an image there is no preview card.
Example
`<meta name="twitter:image" content="https://example.com/og.jpg">`
Source
Open Graph protocol

robots.txt

Mediumrobots.txt presentseo.robots.present
What is checked
Whether a file is served at `/robots.txt` with status 200.
Why it matters
Crawlers request robots.txt first. It controls which areas may be read and points to the sitemap.
Example
`User-agent: *`, `Allow: /`, `Sitemap: https://example.com/sitemap.xml`
Source
RFC 9309: Robots Exclusion Protocol
Lowrobots.txt points to the sitemapseo.robots.sitemap
What is checked
Whether robots.txt contains a `Sitemap:` line.
Why it matters
This way every crawler finds the sitemap, including those you never submitted it to.
Example
`Sitemap: https://example.com/sitemap.xml`
Source
Google Search Central: Build and submit a sitemap
Lowrobots.txt has a wildcard ruleseo.robots.wildcard
What is checked
The robots.txt contains a `User-agent: *` group.
Why it matters
Without a general rule the default for all unlisted crawlers is missing.
Example
`User-agent: *` followed by `Allow: /`.
Source
RFC 9309 (robots.txt)

sitemap.xml

Mediumsitemap.xml presentseo.sitemap.present
What is checked
Whether a file is served at `/sitemap.xml` with status 200.
Why it matters
The sitemap lists every page that should be indexed. New and deeply linked pages are found faster.
Example
`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>https://example.com/</loc></url></urlset>`
Source
Google Search Central: Build and submit a sitemap
Mediumsitemap.xml is valid XMLseo.sitemap.valid
What is checked
Whether the sitemap starts with an XML declaration, `<urlset>` or `<sitemapindex>`.
Why it matters
Some servers return an HTML page at `/sitemap.xml` (such as the home page or an error page). Crawlers cannot use that.
Example
`<?xml version="1.0" encoding="UTF-8"?>` followed by `<urlset …>`
Source
sitemaps.org: Sitemaps XML format
LowSitemap contains the checked URLseo.sitemap.contains
What is checked
Whether the checked page, or at least the domain, appears in the sitemap.
Why it matters
Pages missing from the sitemap are crawled less often and later.
Example
`<url><loc>https://example.com/services/</loc></url>`
Source
Google Search Central: Build and submit a sitemap
LowSitemap contains lastmodseo.sitemap.lastmod
What is checked
Whether the sitemap contains `<lastmod>` entries.
Why it matters
Google uses lastmod to recrawl changed pages sooner, as long as the date is accurate.
Example
`<lastmod>2026-10-01</lastmod>` only when the content really changed
Source
Google Search Central: Build and submit a sitemap
LowSitemap and indexability do not contradictseo.sitemap.indexconsistent
What is checked
A noindex page is not listed in the sitemap, an indexable page is.
Why it matters
Contradictory signals confuse search engines and cost trust.
Example
Remove the noindex page from the sitemap or drop noindex.
Source
sitemaps.org
MediumSitemap contains entriesseo.sitemap.entries
What is checked
The sitemap lists at least one address or a child index.
Why it matters
An empty sitemap does not help search engines.
Example
`<urlset><url><loc>https://example.com/</loc></url></urlset>`
Source
sitemaps.org
LowNo legal pages in the sitemapseo.sitemap.nolegal
What is checked
Imprint, privacy policy, terms, cookie notices and terms of use are not listed in the sitemap.
Why it matters
Legal pages exist for visitors, not as search results.
Example
Remove `/imprint` and `/privacy` from the sitemap.
Source
sitemaps.org

404 page

MediumUnknown URL returns a real 404seo.404.real
What is checked
Whether a deliberately non-existent address answers with status 404.
Why it matters
If an error page returns status 200 (soft 404), Google treats it as real content, and empty or duplicate pages end up in the index.
Example
`/does-not-exist` → `HTTP/2 404` with a helpful error page
Source
Google Search Central: Soft 404 errors
Low404 page has contentseo.404.content
What is checked
The 404 page explains the situation in a few sentences.
Why it matters
A bare error message leaves visitors stranded.
Example
“This page no longer exists. Here is the home page.”
Source
Google Search Central

URL structure

LowURL without capitals, underscores or session parametersseo.404.url
What is checked
Whether the URL path contains capital letters or underscores and whether session parameters appear in the URL.
Why it matters
URLs are case-sensitive, which creates duplicate addresses. Google recommends hyphens over underscores, and session parameters create endless variants.
Example
`/tax-advice/` instead of `/Tax_Advice/?sid=123`
Source
Google Search Central: URL structure best practices
LowTrailing slash used consistentlyseo.url.trailingslash
What is checked
Internal links and the page itself use the trailing slash the same way.
Why it matters
With and without a slash creates two addresses for one page.
Example
Either `/services` everywhere or `/services/` everywhere, not mixed.
Source
Google Search Central
LowURL is readableseo.url.readable
What is checked
The path consists of readable words, not IDs or hashes.
Why it matters
Readable addresses get more clicks and are easier to understand.
Example
Good: `/blog/crypto-tax-austria`. Bad: `/p/8f14e45f`.
Source
Google Search Central

Robots meta tag

Lowrobots directive presentseo.robotsmeta.present
What is checked
The page has a robots meta or an X-Robots-Tag.
Why it matters
Without it defaults apply; one line documents the intent.
Example
`<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large">`
Source
Google Search Central
MediumNo nofollow in the robots metaseo.robotsmeta.nofollow
What is checked
The page does not tell crawlers to ignore its links.
Why it matters
Page-level `nofollow` devalues every internal link and slows indexing.
Example
Wrong: `index, nofollow`. Right: `index, follow`.
Source
Google Search Central

Links and navigation

LowNavigation element presentseo.nav.present
What is checked
The page has a `<nav>` element or `role="navigation"`.
Why it matters
Semantic navigation is clearer for screen readers and crawlers.
Example
`<nav aria-label="Main navigation">…</nav>`
Source
W3C: WAI-ARIA

AI visibility (38 checks)

Snippet control

Mediummax-image-preview:large allowedgeo.snippet.imagepreview
What is checked
The robots meta or X-Robots-Tag allows large image previews.
Why it matters
Without it Google only shows small preview images.
Example
`max-image-preview:large`
Source
Google: Snippet-Steuerung
MediumNo data-nosnippet on the main contentgeo.snippet.datanosnippet
What is checked
Sections with `data-nosnippet` do not cover the main content.
Why it matters
Text marked this way does not appear in search results and AI answers.
Example
Wrong: `<main data-nosnippet>`. Right: mark only small side notes.
Source
Google: Snippet-Steuerung
SevereNo nosnippetgeo.snippet.nosnippet
What is checked
Whether the robots meta tag contains `nosnippet`.
Why it matters
With `nosnippet`, Google may not show any text excerpt, including in AI Overviews. The page can then hardly serve as a source for answers.
Example
`<meta name="robots" content="index, follow">` without `nosnippet`
Source
Google Search Central: Robots meta tag specifications
Mediummax-snippet not too smallgeo.snippet.maxsnippet
What is checked
Whether `max-snippet` in the robots meta tag limits the text excerpt to fewer than 50 characters.
Why it matters
A very small value leaves hardly any text for search results and AI answers. `-1` allows excerpts of any length.
Example
`<meta name="robots" content="max-snippet:-1">`
Source
Google Search Central: Robots meta tag specifications

Answer-ready content

MediumContent reachable without JavaScriptgeo.content.noscript
What is checked
The page delivers enough text in the HTML or a noscript hint.
Why it matters
Bots without JavaScript only see the raw HTML; an empty container stays empty.
Example
`<noscript><p>Please enable JavaScript …</p></noscript>` plus server-rendered text.
Source
Google Search Central
SevereAt least 300 words of textgeo.content.words
What is checked
How many words of visible text the page's HTML contains.
Why it matters
AI models cite pages that answer a question themselves. With little text there is hardly anything to cite. 300 words is a guideline, not a Google requirement.
Example
A service page with a description, process, pricing and common questions
Source
Google Search Central: Creating helpful, reliable, people-first content
SevereContent not rendered by JavaScript onlygeo.content.notjs
What is checked
Whether the raw HTML (before JavaScript runs) contains text, and how much text there is compared to inline scripts.
Why it matters
Many AI crawlers do not run JavaScript. Anything that only appears in the browser stays invisible to them.
Example
Server-side rendering or static pages instead of an empty `<div id="root"></div>`
Source
Google Search Central: Understand JavaScript SEO basics
LowQuestion headings with a direct answergeo.content.qa
What is checked
Whether headings phrased as questions are followed by more content. Pages without question headings pass.
Why it matters
AI search likes to quote the answer right below a matching question. A question without an answer below it helps no one.
Example
`<h2>How much is a first consultation?</h2><p>The first consultation is free and takes 30 minutes.</p>`
Source
Google Search Central: Creating helpful, reliable, people-first content
LowLists or tables presentgeo.content.lists
What is checked
Whether the page contains lists (`<ul>`, `<ol>`) or tables (`<table>`).
Why it matters
Lists and tables are easy to read and to reuse in answers, such as steps, prices or comparisons.
Example
`<ol><li>Send documents</li><li>First meeting</li><li>Quote</li></ol>`
Source
MDN: <ul> element
LowConcrete facts in the textgeo.content.facts
What is checked
The text names numbers, years, percentages or names instead of general claims.
Why it matters
Concrete facts make content quotable for AI answers.
Example
“Since 2014 we have served 120 clients in Vienna.”
Source
Google Search Central
LowNo filler textgeo.content.filler
What is checked
The text avoids empty phrases and filler.
Why it matters
Filler dilutes the answer and is not quoted.
Example
Wrong: “In today's fast-paced world it is important to note …”.
Source
Google Search Central
LowAuthor identifiablegeo.content.author
What is checked
On article pages an author is named, in the schema, a meta tag or visibly.
Why it matters
AI systems prefer content with clear authorship.
Example
`<meta name="author" content="Max Muster">` or `author` in the article schema.
Source
Google Search Central

llms.txt

Mediumllms.txt presentgeo.llms.present
What is checked
Whether a file with content is served at `/llms.txt`.
Why it matters
llms.txt is a proposed short overview in Markdown: who you are and which pages matter. AI assistants find the right content faster.
Example
`# Example Ltd` + `> Tax advice in Graz` + `- [Services](https://example.com/services/)`
Source
llmstxt.org: The /llms.txt file
Lowllms.txt with H1 and short descriptiongeo.llms.structure
What is checked
Whether llms.txt starts with a `# heading` and contains a descriptive paragraph.
Why it matters
The format requires only the H1, followed by a short summary. Without it, a model lacks the context for the links.
Example
`# Example Ltd` followed by `> Tax advice for freelancers and small businesses in Graz.`
Source
llmstxt.org: The /llms.txt file
Lowllms-full.txt present (bonus)geo.llms.full
What is checked
Whether a file with the full content is served at `/llms-full.txt`. The file is optional: if it is missing, the check does not count.
Why it matters
Some tools load llms-full.txt to read all content in one piece instead of fetching every linked page separately.
Example
`/llms-full.txt` with the text of every page linked in llms.txt, as Markdown
Source
llmstxt.org: The /llms.txt file
Lowllms.txt linked in the headgeo.llms.linked
What is checked
The head contains an alternate link with `type="text/plain"` or `text/markdown"` to the llms.txt.
Why it matters
AI tools find the file without guessing.
Example
`<link rel="alternate" type="text/plain" href="/llms.txt">`
Source
llmstxt.org
Lowllms.txt starts with name and short descriptiongeo.llms.intro
What is checked
The file starts with an H1 and a quoted paragraph describing the company.
Why it matters
AI tools immediately recognise who runs the site.
Example
`# Muster GmbH` and below `> Muster GmbH advises small businesses in Vienna.`
Source
llmstxt.org
Lowllms.txt is plain textgeo.llms.plaintext
What is checked
llms.txt is served as `text/plain` or `text/markdown` and contains no HTML or JSON.
Why it matters
Only then can AI tools read the file directly.
Example
Response header `Content-Type: text/plain; charset=utf-8`.
Source
llmstxt.org
Lowllms.txt under 100 KBgeo.llms.size
What is checked
The file is smaller than 100 KB and was read completely.
Why it matters
Very large files get truncated by tools.
Example
Include only the most important pages and sections.
Source
llmstxt.org

AI crawlers in robots.txt

LowAI training botsgeo.crawlers.training
What is checked
Whether robots.txt blocks bots that collect content only for training models (Common Crawl's CCBot, Applebot-Extended).
Why it matters
Blocking is a deliberate choice and costs little: it keeps your texts out of training data, but AI search can still cite your page. Blocked training bots only cause a small deduction.
Example
`User-agent: CCBot` with `Disallow: /` blocks Common Crawl only.
Source
Common Crawl: CCBot
SevereOAI-SearchBot is allowedgeo.bots.oaisearchbot
What is checked
The rule checks whether robots.txt allows OAI-SearchBot to access the tested page.
Why it matters
OAI-SearchBot reads pages for search in ChatGPT.
Example
User-agent: OAI-SearchBot Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
SevereChatGPT-User is allowedgeo.bots.chatgptuser
What is checked
The rule checks whether robots.txt allows ChatGPT-User to access the tested page.
Why it matters
ChatGPT-User fetches pages when someone mentions an address in chat.
Example
User-agent: ChatGPT-User Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
SevereClaude-User is allowedgeo.bots.claudeuser
What is checked
The rule checks whether robots.txt allows Claude-User to access the tested page.
Why it matters
Claude-User fetches pages on behalf of a user.
Example
User-agent: Claude-User Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
SevereClaude-SearchBot is allowedgeo.bots.claudesearchbot
What is checked
The rule checks whether robots.txt allows Claude-SearchBot to access the tested page.
Why it matters
Claude-SearchBot builds the search index for Claude.
Example
User-agent: Claude-SearchBot Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
SeverePerplexityBot is allowedgeo.bots.perplexitybot
What is checked
The rule checks whether robots.txt allows PerplexityBot to access the tested page.
Why it matters
PerplexityBot supplies the sources for Perplexity answers.
Example
User-agent: PerplexityBot Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
LowGPTBot is allowedgeo.bots.gptbot
What is checked
The rule checks whether robots.txt allows GPTBot to access the tested page.
Why it matters
GPTBot collects content for training OpenAI models.
Example
User-agent: GPTBot Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
LowClaudeBot is allowedgeo.bots.claudebot
What is checked
The rule checks whether robots.txt allows ClaudeBot to access the tested page.
Why it matters
ClaudeBot collects content for training Anthropic models.
Example
User-agent: ClaudeBot Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation
LowGoogle-Extended is allowedgeo.bots.googleextended
What is checked
The rule checks whether robots.txt allows Google-Extended to access the tested page.
Why it matters
Google-Extended controls whether Google uses content for Gemini.
Example
User-agent: Google-Extended Allow: /
Source
OpenAI / Anthropic Crawler-Dokumentation

Entity

MediumOrganization/Person JSON-LD presentgeo.entity.identity
What is checked
Whether the page contains JSON-LD of type Organization, Person, ProfessionalService or LocalBusiness.
Why it matters
It tells machines unambiguously who is behind the site. Search engines and AI models then attribute content to the right business.
Example
`{"@context":"https://schema.org","@type":"Organization","name":"Example Ltd","url":"https://example.com"}`
Source
Google Search Central: Organization structured data
MediumsameAs with at least 2 profilesgeo.entity.sameas
What is checked
How many profiles (LinkedIn, X, GitHub, company register …) the entity schema links via `sameAs`.
Why it matters
sameAs connects your website with your other profiles. This helps to tell you apart from others with the same name.
Example
`"sameAs": ["https://www.linkedin.com/company/example", "https://github.com/example"]`
Source
schema.org: sameAs
LowknowsAbout in the entity schemageo.entity.knowsabout
What is checked
The Organization or Person schema names topics in `knowsAbout`.
Why it matters
This helps search engines and AI assistants place the entity by topic.
Example
`"knowsAbout": ["Taxes", "Accounting"]`
Source
Schema.org
LowServices marked up as Offergeo.entity.offers
What is checked
The entity schema describes services with `makesOffer` or `hasOfferCatalog`.
Why it matters
This tells Google which services are offered.
Example
`"makesOffer": [{"@type":"Offer","itemOffered":{"@type":"Service","name":"Consulting"}}]`
Source
Google: Strukturierte Daten
LowPerson links a LinkedIn profilegeo.entity.personlinkedin
What is checked
A person in the schema references a personal LinkedIn profile via sameAs.
Why it matters
The profile substantiates the identity of the person behind the page.
Example
`"sameAs": ["https://www.linkedin.com/in/max-muster"]`
Source
Schema.org

Freshness

LowFreshness signal presentgeo.freshness
What is checked
Whether the page states a modification date: the `Last-Modified` header, `article:modified_time` or `dateModified`.
Why it matters
For questions about prices, laws or deadlines, search engines and AI models prefer current sources. Without a date, freshness cannot be told.
Example
`<meta property="article:modified_time" content="2026-10-01T09:00:00+02:00">`
Source
Google Search Central: Influence the byline date
LowVisible date on article pagesgeo.content.dateshown
What is checked
The article page shows a publication or modification date in the text.
Why it matters
A visible date makes freshness verifiable.
Example
`<time datetime="2026-10-12">12 October 2026</time>`
Source
Google Search Central

Structured data (29 checks)

JSON-LD general

MediumAt least one JSON-LD blockstructured.jsonld.present
What is checked
The page contains at least one block of structured data as JSON-LD.
Why it matters
Structured data helps search engines understand content and entities.
Example
`<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization"}</script>`
Source
Google: Strukturierte Daten
SevereAll JSON-LD blocks are parseablestructured.jsonld.parseable
What is checked
Every JSON-LD block is valid JSON.
Why it matters
A syntax error makes every statement in the block unusable.
Example
Check the block with a JSON validator.
Source
Google: Strukturierte Daten
Medium@context schema.orgstructured.jsonld.context
What is checked
The blocks carry `@context: https://schema.org`.
Why it matters
Without a context the types are ambiguous for search engines.
Example
`"@context": "https://schema.org"`
Source
Schema.org
Low@id with an absolute URLstructured.entity.id
What is checked
Whether the main entities (Organization, Person, WebSite) carry an @id that is an absolute URL.
Why it matters
A stable @id makes an entity recognisable across pages. Other blocks can point to it instead of repeating the same details.
Example
`{"@type":"Organization","@id":"https://example.com/#organization","name":"Example Ltd"}`
Source
W3C JSON-LD 1.1: Node identifiers
LowinLanguage declaredstructured.inlanguage
What is checked
Whether the WebSite, WebPage or article states the content language with inLanguage, and whether it matches the page's lang attribute.
Why it matters
The language tag helps match the content to the right language version and audience, which matters most on multilingual sites.
Example
`{"@type":"WebSite","name":"Example Ltd","url":"https://example.com/","inLanguage":"en-GB"}`
Source
schema.org: inLanguage
LowSchema image URLs are absolutestructured.image.absolute
What is checked
Whether every image reference in the JSON-LD (image, logo, thumbnailUrl) is a full http(s) address.
Why it matters
Structured data is often processed apart from the page. Relative paths or data URIs cannot be resolved reliably there, and the image goes missing from the result.
Example
`"logo": "https://example.com/logo.png"` instead of `"logo": "/logo.png"`
Source
Google Search Central: General structured data guidelines

WebSite

LowWebSite schema presentstructured.website.present
What is checked
A WebSite schema describes the site as a whole.
Why it matters
It links pages to name, URL and language.
Example
`{"@type":"WebSite","name":"Example","url":"https://example.com"}`
Source
Google: Strukturierte Daten
LowWebSite with name and urlstructured.website.fields
What is checked
The WebSite schema contains `name` and `url`.
Why it matters
Both are required for the markup.
Example
`{"@type":"WebSite","name":"Example","url":"https://example.com"}`
Source
Google: Strukturierte Daten

Breadcrumbs

LowBreadcrumbList on subpagesstructured.breadcrumb
What is checked
Subpages mark up their path as a BreadcrumbList.
Why it matters
Google can then show the path in search results.
Example
`{"@type":"BreadcrumbList","itemListElement":[…]}`
Source
Google: Strukturierte Daten
LowBreadcrumb items have URLsstructured.breadcrumb.urls
What is checked
Whether every BreadcrumbList entry except the last one points to an absolute URL through item.
Why it matters
Google requires the URL for every level except the current page. Without it the trail cannot be shown as a breadcrumb in search results.
Example
`{"@type":"ListItem","position":1,"name":"Services","item":"https://example.com/services"}`
Source
Google Search Central: Breadcrumb structured data
LowBreadcrumb with at least two levelsstructured.breadcrumb.levels
What is checked
Whether every BreadcrumbList has at least two entries.
Why it matters
A trail with a single level does not show where the page sits on the site. Google recommends at least two ListItems.
Example
Home › Services › Bookkeeping
Source
Google Search Central: Breadcrumb structured data

Articles

MediumArticle schema complete (for articles)structured.article
What is checked
Articles name `headline`, `author`, `datePublished` and `image`.
Why it matters
This is the basis for article rich results.
Example
`{"@type":"Article","headline":"…","author":{…},"datePublished":"2026-10-12","image":"https://…"}`
Source
Google: Strukturierte Daten

Other schema types

LowOther schema types completestructured.other
What is checked
FAQPage, Product, LocalBusiness, Event, Review and VideoObject are complete when present.
Why it matters
Incomplete blocks produce no rich results.
Example
Add the required fields per type from the Google documentation.
Source
Google: Strukturierte Daten

Organization and person

LowOrganization with name, url, address and sameAsstructured.org.fields
What is checked
Whether the Organization schema (including subtypes such as LocalBusiness or ProfessionalService) states a name, the website URL, a postal address and sameAs profiles.
Why it matters
These details let Google tie the page to your company without guessing, for example in the knowledge panel. sameAs links the site to your profiles elsewhere.
Example
`{"@type":"Organization","name":"Example Ltd","url":"https://example.com/","address":{"@type":"PostalAddress","streetAddress":"1 Main Street","postalCode":"1010","addressLocality":"Vienna","addressCountry":"AT"},"sameAs":["https://www.linkedin.com/company/example"]}`
Source
Google Search Central: Organization structured data
LowPerson schemastructured.person.present
What is checked
Whether the structured data describes a person, for example as an author, an owner or the subject of a profile page. Its absence does not count against you.
Why it matters
For consultants, authors and sole traders, a Person schema helps search engines and AI assistants attribute content to a specific person.
Example
`{"@type":"Person","name":"Anna Example","jobTitle":"Tax adviser","url":"https://example.com/team/anna"}`
Source
schema.org: Person

FAQPage

LowFAQPage schemastructured.faq.present
What is checked
Whether the page has a FAQPage schema. Its absence does not count; it only makes sense on pages with real questions and answers.
Why it matters
Since 2023 Google shows FAQ results only for well-known government and health sites. Clearly marked-up questions and answers still help search engines and AI assistants find and quote your answers.
Example
`{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"What does the first meeting cost?","acceptedAnswer":{"@type":"Answer","text":"The first meeting is free."}}]}`
Source
Google Search Central: FAQPage structured data
MediumEvery FAQ question has an answerstructured.faq.answers
What is checked
Whether every Question in the FAQPage schema has a name and an acceptedAnswer with text.
Why it matters
name and acceptedAnswer.text are required. A question without an answer is useless to search engines and makes the markup invalid.
Example
`"acceptedAnswer": {"@type":"Answer","text":"We reply within one working day."}`
Source
Google Search Central: FAQPage structured data
MediumFAQ content visible on the pagestructured.faq.visible
What is checked
Whether each question from the FAQPage schema, and roughly its answer, appears in the visible page text. Text in scripts or hidden with the hidden attribute or display:none does not count.
Why it matters
Google requires marked-up questions and answers to be visible to visitors. Markup for content nobody can see is treated as misleading and can lead to a manual action.
Example
Questions as headings or `<summary>`, with the answer as text right below.
Source
Google Search Central: FAQPage structured data

Ratings

LowAggregateRatingstructured.rating.present
What is checked
Whether the structured data contains an overall rating (AggregateRating), including one nested in Product, LocalBusiness or similar types. Its absence does not count.
Why it matters
Genuine ratings can appear as stars in search results. Google only allows this for certain types, and not for ratings a business publishes about itself on its own site.
Example
`"aggregateRating":{"@type":"AggregateRating","ratingValue":4.7,"reviewCount":38,"bestRating":5}`
Source
Google Search Central: Review snippet structured data
LowRating with ratingValue and a countstructured.rating.fields
What is checked
Whether every AggregateRating has a ratingValue and a count (reviewCount or ratingCount).
Why it matters
Both are required. Without a count the rating cannot be put in context, and Google shows no stars.
Example
`"ratingValue": 4.7, "reviewCount": 38`
Source
Google Search Central: Review snippet structured data
LowbestRating declaredstructured.rating.best
What is checked
Whether the aggregate rating states its scale with bestRating, and whether ratingValue falls within it.
Why it matters
Without bestRating Google assumes a scale up to 5. If you rate on another scale, such as out of 10, the value is shown wrongly.
Example
`"ratingValue": 9.1, "bestRating": 10, "worstRating": 1`
Source
Google Search Central: Review snippet structured data

Events

LowEvent schemastructured.event.present
What is checked
Whether the page marks up events as Event (or a subtype such as BusinessEvent). Its absence does not count.
Why it matters
Google can show marked-up events with date and place in its event search. That is worth it for seminars, webinars and other dates.
Example
`{"@type":"Event","name":"Tax update 2027","startDate":"2027-01-20T18:00+01:00","location":{"@type":"Place","name":"Example Ltd","address":"1 Main Street, 1010 Vienna"}}`
Source
Google Search Central: Event structured data
LowEvent with name and startDatestructured.event.fields
What is checked
Whether every event has a name and a start date in ISO 8601 format.
Why it matters
name and startDate are required. A date like "20 January" cannot be read reliably by a machine; with time and time zone the slot is unambiguous.
Example
`"startDate": "2027-01-20T18:00+01:00"`
Source
Google Search Central: Event structured data
LowEvent location with addressstructured.event.location
What is checked
Whether every event has a location: a Place with an address or, for online events, a VirtualLocation.
Why it matters
Google requires location. For in-person events the Place needs an address, otherwise the event cannot be matched to local searches.
Example
`"location":{"@type":"Place","name":"Seminar room","address":{"@type":"PostalAddress","streetAddress":"1 Main Street","addressLocality":"Vienna","postalCode":"1010","addressCountry":"AT"}}`
Source
Google Search Central: Event structured data

Video

LowVideoObjectstructured.video.present
What is checked
Whether videos on the page are marked up as VideoObject. Its absence does not count.
Why it matters
VideoObject tells Google what a video is about, so it can show it with a thumbnail in search and in the video tab.
Example
`{"@type":"VideoObject","name":"How the import works","description":"Two minutes on the CSV import.","thumbnailUrl":"https://example.com/video.jpg","uploadDate":"2026-10-01T09:00:00+02:00"}`
Source
Google Search Central: Video structured data
LowVideo has a namestructured.video.name
What is checked
Whether every VideoObject has a title (name).
Why it matters
name is required. Without a title the video is not shown as a video result.
Example
`"name": "How the import works"`
Source
Google Search Central: Video structured data
LowVideo has a descriptionstructured.video.description
What is checked
Whether every VideoObject has a description.
Why it matters
Google recommends a description. It tells search engines and AI assistants what the video shows without playing it.
Example
`"description": "Two minutes on importing a CSV from your accounts."`
Source
Google Search Central: Video structured data
LowVideo has a thumbnailUrlstructured.video.thumbnail
What is checked
Whether every VideoObject provides a preview image through thumbnailUrl.
Why it matters
thumbnailUrl is required. Without a thumbnail Google does not show the video as a video result.
Example
`"thumbnailUrl": ["https://example.com/video-16x9.jpg"]`
Source
Google Search Central: Video structured data
LowVideo has an uploadDatestructured.video.uploaddate
What is checked
Whether every VideoObject has a publication date in ISO 8601 format, ideally with time and time zone.
Why it matters
uploadDate is required. Google recommends adding the time zone; otherwise the time is read in Googlebot's time zone.
Example
`"uploadDate": "2026-10-01T09:00:00+02:00"`
Source
Google Search Central: Video structured data

Technology (62 checks)

Mobile

SevereViewport meta presenttech.viewport
What is checked
The page sets `<meta name="viewport">`.
Why it matters
Without a viewport mobile browsers zoom out and the page looks tiny.
Example
`<meta name="viewport" content="width=device-width, initial-scale=1">`
Source
Google: Mobile-freundliche Seiten

Security headers

MediumContent-Security-Policy settech.security.csp
What is checked
The `Content-Security-Policy` header is set.
Why it matters
A CSP limits which scripts and resources may load.
Example
`Content-Security-Policy: default-src 'self'`
Source
MDN: HTTP headers
LowX-Content-Type-Options settech.security.xcto
What is checked
The `X-Content-Type-Options: nosniff` header is set.
Why it matters
It stops browsers from interpreting files as another type.
Example
`X-Content-Type-Options: nosniff`
Source
MDN: HTTP headers
LowReferrer-Policy settech.security.referrer
What is checked
The `Referrer-Policy` header is set.
Why it matters
It limits which addresses are passed to other sites.
Example
`Referrer-Policy: strict-origin-when-cross-origin`
Source
MDN: HTTP headers
LowPermissions-Policy settech.security.permissions
What is checked
The `Permissions-Policy` header is set.
Why it matters
It disables browser features such as camera and microphone.
Example
`Permissions-Policy: camera=(), microphone=(), geolocation=()`
Source
MDN: HTTP headers
LowClickjacking protectiontech.security.clickjacking
What is checked
The page protects itself with `frame-ancestors` or `X-Frame-Options`.
Why it matters
Otherwise the page can be embedded invisibly in another site.
Example
`frame-ancestors 'none'` in the CSP or `X-Frame-Options: DENY`.
Source
MDN: HTTP headers
LowCross-Origin-Opener-Policy settech.security.coop
What is checked
The `Cross-Origin-Opener-Policy` header is set.
Why it matters
It isolates browsing contexts and makes window-based attacks harder.
Example
`Cross-Origin-Opener-Policy: same-origin`
Source
MDN: HTTP headers
LowCross-Origin-Embedder-Policy settech.security.coep
What is checked
The `Cross-Origin-Embedder-Policy` header is set.
Why it matters
It prevents embedding foreign resources without permission.
Example
`Cross-Origin-Embedder-Policy: credentialless` (or `require-corp` if no third-party resources are needed)
Source
MDN: HTTP headers
LowCross-Origin-Resource-Policy settech.security.corp
What is checked
The `Cross-Origin-Resource-Policy` header is set.
Why it matters
It limits who may embed your files.
Example
`Cross-Origin-Resource-Policy: same-site`
Source
MDN: HTTP headers

Caching and compression

MediumBrotli or gzip enabledtech.caching.compression
What is checked
Text responses are compressed with Brotli, gzip or zstd.
Why it matters
Compression saves transfer time and bandwidth.
Example
The response header states `content-encoding: br` or `gzip`.
Source
MDN: HTTP caching
LowCache-Control for static filestech.caching.cachecontrol
What is checked
Static files carry a long-lived `Cache-Control`.
Why it matters
Repeat visits then load the files from cache.
Example
`Cache-Control: public, max-age=31536000, immutable`
Source
MDN: HTTP caching
LowHTML size under 500 KBtech.caching.htmlsize
What is checked
The HTML response stays under 500 KB.
Why it matters
Large HTML documents delay rendering and parsing.
Example
Move inline CSS and JS into separate files.
Source
web.dev
MediumCache-Control on the main responsetech.caching.main
What is checked
The HTML response carries a `Cache-Control` header.
Why it matters
Without it, browsers and CDNs decide inconsistently.
Example
`Cache-Control: public, max-age=0, must-revalidate`
Source
MDN: HTTP caching
LowPublic page is cacheabletech.caching.public
What is checked
The response does not forbid caching unnecessarily.
Why it matters
`no-store` or `private` slow down CDN and browser.
Example
`Cache-Control: public, max-age=300` instead of `no-store`
Source
MDN: HTTP caching
LowETag presenttech.caching.etag
What is checked
The response carries an `ETag`.
Why it matters
Crawlers then avoid re-downloading unchanged pages.
Example
`ETag: "5f3c9a"`
Source
MDN: HTTP caching

Images

Mediumalt on all content imagestech.images.alt
What is checked
All content images have an `alt` attribute.
Why it matters
Screen readers and image search need the alternative text.
Example
`<img src="team.jpg" alt="Team in a consultation">`
Source
Google: Bilder
LowModern image formats (WebP/AVIF)tech.images.format
What is checked
Raster images are served as WebP or AVIF; SVG is exempt.
Why it matters
Modern formats are much smaller at the same quality.
Example
`team.webp` instead of `team.jpg`.
Source
Google: Bilder
Lowwidth and height settech.images.dimensions
What is checked
Images declare `width` and `height`.
Why it matters
This reserves space and prevents layout shifts.
Example
`<img src="team.webp" width="800" height="600" alt="…">`
Source
web.dev
Lowloading=lazy below the foldtech.images.lazy
What is checked
Below-the-fold images use `loading="lazy"`.
Why it matters
This saves bandwidth on the first load.
Example
`<img src="…" loading="lazy" alt="…">` from the second image onwards.
Source
web.dev
LowHero image is not lazy-loadedtech.images.herolazy
What is checked
The most important visible image loads immediately; an image with fetchpriority=high must not be lazy either.
Why it matters
A lazy-loaded hero image delays the visible paint (LCP).
Example
`<img src="hero.jpg" fetchpriority="high">` without `loading="lazy"`.
Source
web.dev
LowHero image uses fetchpriority=hightech.images.fetchpriority
What is checked
The first content image carries `fetchpriority="high"`, directly or via a preload in the head.
Why it matters
The browser then loads it before other resources.
Example
`<img src="hero.jpg" fetchpriority="high">` or `<link rel="preload" as="image" href="hero.jpg" fetchpriority="high">`.
Source
web.dev
MediumAlt texts describe the imagetech.images.altquality
What is checked
Alt texts describe the image and repeat neither file names nor placeholders.
Why it matters
Descriptive alt texts help screen readers and image search.
Example
Wrong: `alt="IMG_1234.jpg"`. Right: `alt="Team in a consultation"`.
Source
Google: Bilder
LowImages under 200 KBtech.images.weight
What is checked
The sampled images are smaller than about 200 KB.
Why it matters
Large images slow the page, especially on mobile.
Example
Compress images or serve smaller variants via srcset.
Source
web.dev

Load time

MediumTime to First Byte under 800 mstech.load.ttfb
What is checked
The server responds in less than 800 ms.
Why it matters
A fast first byte speeds up every following step.
Example
Caching, a CDN or less work in the backend.
Source
web.dev
LowBlocking scripts in the headtech.load.blockingscripts
What is checked
The head contains no blocking scripts without `async` or `defer`.
Why it matters
Blocking scripts hold up the first paint.
Example
`<script src="app.js" defer></script>`
Source
web.dev
LowCSS included in the headtech.load.cssinhead
What is checked
Stylesheets appear as `<link rel="stylesheet">` or `<style>` in the head.
Why it matters
CSS in the body delays the first paint and can shift content.
Example
`<link rel="stylesheet" href="/style.css">` in the `<head>`.
Source
web.dev
MediumResponse time under 3 secondstech.load.responsetime
What is checked
The server responds in less than three seconds.
Why it matters
Slow responses cost rankings and visitors.
Example
Cache the home page at the network edge (CDN).
Source
web.dev

MX and SPF

MediumSPF present and strict enoughtech.email.spf
What is checked
The domain has an SPF record ending in `-all` or `~all`.
Why it matters
SPF prevents foreign servers from sending mail in your name.
Example
`v=spf1 include:… -all`
Source
Google Search Central
LowMX records presenttech.email.mx
What is checked
The domain has at least one MX record.
Why it matters
Without MX the domain cannot receive email.
Example
`example.com MX 10 mx1.mailprovider.com.`
Source
Google Search Central

DMARC

MediumDMARC with p=quarantine or rejecttech.email.dmarc
What is checked
The DMARC record is set to `p=quarantine` or `p=reject`.
Why it matters
This protects the domain's reputation against spam and spoofing.
Example
`v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com`
Source
Google Search Central
LowDMARC with a reporting addresstech.email.dmarc_rua
What is checked
The DMARC record states `rua=` for reports.
Why it matters
Without reports the policy's effect stays invisible.
Example
`rua=mailto:dmarc@example.com`
Source
Google Search Central

DKIM

LowDKIM foundtech.email.dkim
What is checked
A DKIM record is reachable on a common selector.
Why it matters
DKIM signs outgoing mail and proves its origin.
Example
`<selector>._domainkey` as TXT with `v=DKIM1; p=…`.
Source
Google Search Central
LowDKIM with a public keytech.email.dkim_key
What is checked
The DKIM record contains a key (`p=`).
Why it matters
Without a key no signature can be verified.
Example
`v=DKIM1; k=rsa; p=MIIBIjANBg…`
Source
Google Search Central

MTA-STS

LowMTA-STS presenttech.email.mtasts
What is checked
An MTA-STS policy is published on the host `mta-sts.<domain>`.
Why it matters
It requires encrypted delivery between mail servers.
Example
`https://mta-sts.example.com/.well-known/mta-sts.txt` with `version: STSv1`.
Source
RFC 8461 (MTA-STS)
LowMTA-STS in enforce modetech.email.mtasts_mode
What is checked
The MTA-STS policy is set to `mode: enforce`.
Why it matters
Only then do mail servers enforce encrypted delivery.
Example
`mode: enforce`
Source
RFC 8461 (MTA-STS)
Low_mta-sts is announcedtech.email.mtasts_dns
What is checked
A `_mta-sts` TXT record announces the policy.
Why it matters
Without it mail servers do not find the policy.
Example
`_mta-sts.example.com TXT "v=STSv1; id=20261018"`
Source
RFC 8461 (MTA-STS)
LowMTA-STS with max_agetech.email.mtasts_maxage
What is checked
The policy states `max_age`.
Why it matters
It determines how long mail servers cache the policy.
Example
`max_age: 604800`
Source
RFC 8461 (MTA-STS)

security.txt

Lowsecurity.txt with Contact and Expirestech.trust.securitytxt
What is checked
`/.well-known/security.txt` contains `Contact` and `Expires`.
Why it matters
Security researchers know where to send reports.
Example
`Contact: mailto:security@example.com` and `Expires: 2027-12-31T23:59:59.000Z`.
Source
RFC 9116 (security.txt)
Lowsecurity.txt with a valid Expirestech.trust.securitytxt_expires
What is checked
`Expires:` lies in the future.
Why it matters
An expired Expires makes the file invalid per RFC.
Example
`Expires: 2027-12-31T23:59:59.000Z`
Source
RFC 9116 (security.txt)
Lowsecurity.txt with Canonicaltech.trust.securitytxt_canonical
What is checked
`Canonical:` names the file location.
Why it matters
Multiple copies remain unambiguous.
Example
`Canonical: https://example.com/.well-known/security.txt`
Source
RFC 9116 (security.txt)
Lowsecurity.txt with Preferred-Languagestech.trust.securitytxt_languages
What is checked
`Preferred-Languages:` names the security team's languages.
Why it matters
Reporters know which language they can use.
Example
`Preferred-Languages: en, de`
Source
RFC 9116 (security.txt)

Trust

Analytics and consent

LowAnalytics detectedtech.analytics.detected
What is checked
The page includes Google Analytics, Tag Manager or a privacy-friendly tool.
Why it matters
Without measurement, decision data is missing; this is a hint, not an error.
Example
`gtag.js` with a measurement ID or a Tag Manager container.
Source
Google Search Central
MediumConsent is set before analyticstech.analytics.consentfirst
What is checked
The default consent appears in the HTML before the analytics loader.
Why it matters
Otherwise data is collected without consent (GDPR risk).
Example
`gtag('consent','default',{ad_storage:'denied',…})` before gtag.js loads.
Source
Google Search Central
LowAnalytics does not block renderingtech.analytics.async
What is checked
Analytics scripts use `async` or `defer`, or the Tag Manager loads them later.
Why it matters
A blocking script delays the first paint.
Example
`<script async src="…/gtag/js">`
Source
web.dev
MediumAll four consent types start as deniedtech.analytics.denied
What is checked
`ad_storage`, `analytics_storage`, `ad_user_data` and `ad_personalization` start as `denied`.
Why it matters
This is the privacy-friendly default; `granted` before consent is a risk.
Example
`gtag('consent','default',{ad_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'});`
Source
Google Search Central

Favicon and icons

LowFavicon presenttech.icons.favicon
What is checked
The page links an icon or serves `/favicon.ico`.
Why it matters
The icon appears in tabs and bookmarks.
Example
`<link rel="icon" href="/favicon.ico">`
Source
Google Search Central
LowSVG favicon linkedtech.icons.svg
What is checked
An icon with `type="image/svg+xml"` is linked.
Why it matters
SVG stays sharp at any size and is small.
Example
`<link rel="icon" href="/icon.svg" type="image/svg+xml">`
Source
Google Search Central
Lowapple-touch-icon linkedtech.icons.apple
What is checked
An apple-touch-icon is linked.
Why it matters
iOS uses it when adding to the home screen.
Example
`<link rel="apple-touch-icon" href="/apple-touch-icon.png">`
Source
Google Search Central

Web app manifest

LowWeb manifest linkedtech.manifest.present
What is checked
The page links a web app manifest.
Why it matters
The manifest describes name, icons and app start behaviour.
Example
`<link rel="manifest" href="/site.webmanifest">`
Source
MDN: Web app manifest
LowManifest is reachable and validtech.manifest.reachable
What is checked
The linked manifest responds with 200 and valid JSON.
Why it matters
A broken link causes errors and no app metadata.
Example
`{"name":"Example","icons":[…]}` as the manifest response.
Source
MDN: Web app manifest
LowManifest with a maskable icontech.manifest.maskable
What is checked
At least one icon in the manifest has `purpose` containing `maskable`.
Why it matters
Android otherwise crops icons awkwardly.
Example
`{"src":"/icon-512.png","purpose":"any maskable"}`
Source
MDN: Web app manifest
Lowtheme-color settech.themecolor
What is checked
The page sets `theme-color`.
Why it matters
Mobile browsers tint the address bar to match the brand.
Example
`<meta name="theme-color" content="#123456">`
Source
MDN: Web app manifest

Accessibility

LowInteractive elements have accessible namestech.a11y.arianames
What is checked
Links, buttons and elements with an ARIA role have an accessible name from text, aria-label, aria-labelledby, title, image alt or SVG title.
Why it matters
Screen readers cannot announce nameless elements.
Example
`<button aria-label="Open menu"><svg></svg></button>`
Source
W3C: WAI-ARIA
LowNo focusable content under aria-hiddentech.a11y.ariahidden
What is checked
Elements with `aria-hidden="true"` contain no focusable children unless excluded with tabindex=-1, disabled or inert.
Why it matters
Otherwise keyboard focus lands on invisible elements.
Example
`<div aria-hidden="true" inert>` for menus that are only visually hidden.
Source
W3C: WAI-ARIA

DNS (CAA)

LowCAA record settech.email.caa
What is checked
The domain authorises certificate authorities via CAA.
Why it matters
CAA prevents foreign authorities from issuing certificates.
Example
`example.com CAA 0 issue "letsencrypt.org"`
Source
Google Search Central

Bot access

SeverePage reachable without a bot challengetech.bots.no_challenge
What is checked
Whether our request gets the page content or a firewall block page (Cloudflare, Sucuri, Akamai, DataDome, PerimeterX, Imperva).
Why it matters
Search engines and AI assistants fetch pages without a browser. If the firewall shows them a block page, the content is neither read nor cited.
Example
Configure the bot protection to let known crawlers (verified bots) through, for example allow "Verified Bots" in Cloudflare.
Source
Google Search Central: Overview of Google crawlers
SevereNo JavaScript challenge or CAPTCHA before the contenttech.bots.no_captcha
What is checked
Whether a CAPTCHA (reCAPTCHA, hCaptcha, Turnstile) or a check that needs JavaScript stands in front of the content.
Why it matters
Crawlers do not solve CAPTCHAs and often do not run JavaScript. A CAPTCHA in front of the whole page locks them out; inside a form it is fine.
Example
Use the CAPTCHA only in the form, not as an entry page.
Source
Google Search Central: JavaScript SEO basics
SevereGooglebot gets the contenttech.bots.googlebot
What is checked
We also fetch the page with the Googlebot token in the user agent (marked as a RELACON probe) and compare the result with our normal request.
Why it matters
Some firewalls block anything that calls itself Googlebot but does not come from Google's addresses; others let only Googlebot through. The comparison shows whether crawlers are treated differently.
Example
Use URL inspection in Search Console to test whether the real Googlebot can fetch the page.
Source
Google: Verifying Googlebot
MediumAI crawlers get the contenttech.bots.ai
What is checked
We fetch the page with the GPTBot token in the user agent (marked as a RELACON probe) and compare the result with our normal request.
Why it matters
Many bot protection services block AI crawlers by default, even when robots.txt allows them. Then the permission in robots.txt does not help.
Example
Allow AI crawlers in the firewall too, in Cloudflare under "AI Crawl Control".
Source
OpenAI: Overview of OpenAI crawlers
Mediumrobots.txt readable despite the firewalltech.bots.robots
What is checked
Whether /robots.txt is served as text and not as a firewall block page.
Why it matters
If a crawler gets a block page or a server error instead of robots.txt, Google treats the whole site as blocked to be safe.
Example
Exempt `/robots.txt` from the bot protection.
Source
Google: How Google interprets robots.txt

FAQ

Does the check store my page?

No content is stored beyond the report itself. The report contains the URL, the results and the time of the check.

Why does a rule show n/a?

n/a means the rule does not apply to this page, for example video rules on a page without video. n/a never costs points.

More about the website check

Check now