Points per issue
Every page starts at 100. Each issue takes points off, by how much it hurts. The score never drops below 0.
Keeps the page out of search or AI answers, such as a noindex, a server error or a page blocked in robots.txt.
Costs clicks or rankings, such as a missing meta description or a title that gets cut off.
Worth doing when there is time, such as image sizes or a few extra headings.
The same page gives the same score every time, until the page changes. There is no sampling and no AI guesswork in the score.
What is read
- The HTML your server sendsThe way Google and AI crawlers fetch the page.
- The rendered page, when neededClient-side React, Vue and Angular apps are loaded in a real browser and scored as rendered.
- What crawlers without JavaScript getGPTBot, ClaudeBot and PerplexityBot do not run JavaScript, so the gap is reported.
- Links, images and crawler rulesBroken links, image sizes, robots.txt for each AI crawler and llms.txt.
AI readiness
AI readiness is a separate score: the share of these 15 checks that pass. Checks that do not apply to the page are left out.
- Opens with a clear answer
- Headings phrased as questions
- Short, quotable paragraphs
- Lists or structured answers
- Concrete facts and numbers
- Cites outside sources
- Questions answered right below
- Every section opens with the point
- FAQ or HowTo markup
- Named author
- Publish or update date
- Organisation identity
- AI crawlers may read it
- llms.txt present
- Content is in the HTML
Reading ease
Reading ease uses the formula made for the page language, because a formula for English gives misleading scores in other languages. Higher is easier: 60 to 70 is plain language for most adults.
| Language | Formula | Calculation |
|---|---|---|
| English | Flesch | 206.835 − 1.015 × words per sentence − 84.6 × syllables per word |
| Dutch | Flesch-Douma | 206.835 − 0.93 × words per sentence − 77 × syllables per word |
| German | Amstad | 180 − words per sentence − 58.5 × syllables per word |
| French | Kandel-Moles | 207 − 1.015 × words per sentence − 73.6 × syllables per word |
| Spanish | Fernández-Huerta | 206.84 − 1.02 × words per sentence − 60 × syllables per word |
| Italian | Flesch-Vacca | 217 − 1.3 × words per sentence − 60 × syllables per word |
Every check
Each issue has a fixed code, so a fix can be tracked from one scan to the next. These are the 44 codes of the page scan.
bot-protectedBot protection
Bot protection blocked the request, so we cannot judge the page.
Fix: Allowlist our scan for a while or check the page by hand.
fetch-failedCould not fetch
The server did not respond or returned an error.
Fix: Check that the URL is correct and the site is reachable.
status-codeError status
An error status means visitors and search engines cannot see the page.
Fix: Fix the page or redirect to a working URL.
server-errorServer error
With a 5xx error, visitors and Google get no page.
Fix: Check the server logs and fix the cause.
broken-pagePage unreachable
A 4xx status removes the page from search results.
Fix: Fix the page or add a 301 redirect to the right URL.
redirectRedirect
Every redirect costs load time and part of the link value.
Fix: Link straight to the final destination.
redirect-chainRedirect chain
Long chains slow the page down and Google does not always follow them to the end.
Fix: Point internal links and the sitemap straight to the final URL.
redirect-onceOne redirect
That is fine, but your links and sitemap can point straight to the target.
Fix: Use the final URL in links and the sitemap.
stale-headerOld page
Outdated pages lose trust and rankings.
Fix: Check that the content is still accurate and refresh it if needed.
title-missingTitle missing
The title is the strongest signal for search results.
Fix: Add a unique title of 30 to 60 characters.
title-lengthTitle length
Titles that are too short say little, and long ones are cut off in Google.
Fix: Keep the title between 30 and 60 characters and put the main keyword first.
meta-missingMeta description missing
Without a description Google picks a piece of text itself, often a poor one.
Fix: Write a description of 120 to 160 characters that invites a click.
meta-lengthMeta length
Long descriptions are cut off, short ones waste space.
Fix: Write between 120 and 160 characters.
h1-missingH1 missing
The H1 tells visitors and search engines what the page is about.
Fix: Give the page one clear H1.
h1-multipleMultiple H1s
Multiple H1s make the topic of the page unclear.
Fix: Keep one H1 and turn the rest into H2s.
h2-manyMany H2s
A lot of subheadings make the page hard to scan.
Fix: Merge headings or split the content over more pages.
img-alt-missingAlt text missing
Alt text helps search engines, screen readers and Google Images.
Fix: Describe each relevant image briefly and keep the alt text and the file name on the topic of the page. Decorative images get an empty alt.
img-alt-longLong alt text
Alt texts over 100 characters are not read well.
Fix: Keep alt text short and factual, and on the topic of the page and its file name.
img-dimsImage sizes missing
Without dimensions the page shifts while loading, which hurts Core Web Vitals.
Fix: Set width and height on every image.
img-sizeHeavy images
Heavy images slow the page down.
Fix: Compress them and use webp or avif.
canonical-missingCanonical missing
Without a canonical Google can mix up duplicate versions of the page.
Fix: Add a canonical that points to the page itself.
canonical-otherCanonical elsewhere
Google may then ignore this page in favour of the other one.
Fix: Check that this is intended. If not, point the canonical to this page.
canonical-invalidCanonical invalid
An invalid canonical is ignored.
Fix: Use a full URL starting with https://.
noindexNoindex
Google does not include this page in search results.
Fix: Remove noindex if the page should be findable.
js-renderedJavaScript content
This scan only reads the raw HTML, so the numbers may be too low.
Fix: Check the page in a browser. Server-side rendering makes the content visible to all crawlers.
thinThin content
Short pages rarely answer a question in full.
Fix: Add content that really answers the visitor’s question, aiming for 300 words or more.
broken-linksBroken links
Broken links frustrate visitors and waste crawl budget.
Fix: Fix or remove the links.
blocked-linksLinks not checkable
This is usually bot protection on the target site.
Fix: Open those links by hand to check them.
soft-404Soft 404
Google may treat this as a soft 404 and drop the page.
Fix: Return a real 404, or put real content on the page.
no-jsonldNo structured data
JSON-LD helps Google and AI answers understand what the page is.
Fix: Add JSON-LD that fits the page, such as Article, Product or FAQPage.
jsonld-invalidJSON-LD invalid
Invalid JSON is skipped.
Fix: Validate the block and fix the syntax error.
hreflangHreflang without x-default
Without x-default Google does not know which version is the default.
Fix: Add an hreflang="x-default".
ogOpen Graph
Shared links then look bare on social media.
Fix: Add og:title, og:description and og:image.
twitterTwitter Card
Links on X then show no preview card.
Fix: Add twitter:card.
viewportViewport missing
Without a viewport the page works poorly on mobile, and Google ranks mobile first.
Fix: Add <meta name="viewport" content="width=device-width, initial-scale=1">.
faviconFavicon
A favicon makes your result recognisable.
Fix: Add a link rel="icon".
mixedMixed content
Browsers block or warn about insecure resources.
Fix: Load everything over https.
dup-titleDuplicate title
Identical titles make pages compete with each other.
Fix: Give every page its own title.
dup-metaDuplicate meta description
Identical descriptions make pages interchangeable in the results.
Fix: Write a separate description for each page.
orphanOrphan page
Without internal links visitors and crawlers cannot find the page.
Fix: Link to this page from relevant pages.
sitemap-staleOld sitemap date
An old lastmod gives Google little reason to come back.
Fix: Update the page or correct the lastmod.
robots-blockedBlocked by robots.txt
Search engines may not fetch the page, so it does not reach the index.
Fix: Remove the Disallow rule for this page.
ai-blockedAI crawlers blocked
Blocked AI crawlers cannot cite your site in answers.
Fix: Allow the crawlers in robots.txt if you want to appear in AI answers.
no-llmsNo llms.txt
llms.txt is a growing signal for AI answer engines.
Fix: Put an llms.txt in the root with a short description and your most important pages.
What the score does not measure
The score is about the page itself. It does not include rankings, search volume or backlinks. Connect Search Console, GA4, Ahrefs or Semrush in the same chat and prioritize_fixes ranks the fixes by the traffic and revenue they can win.