All 195 checks
What a scan looks for, what happens when it fails, and what to do about it. This page is generated from the same catalogue the report reads, so the wording here is the wording you will see on a finding.
The health score starts at 100 and each category can take away at most the points shown. A category with more checks does not weigh more - the cap is the cap, which is why one broken robots.txt can cost more than a dozen missing alt attributes.
195 checks in six categories
Whether a page can be found, fetched and indexed at all. Nothing else matters if this is wrong, which is why it carries the most weight.
90 checks, up to 33 points · 13 critical, 50 warning, 27 info
Canonical points at a broken page
CriticalYou are telling search engines the real version of this page is one that errors, so neither may be indexed.
Fix: Point the canonical at a working URL, or remove it so the page is its own canonical.
canonical_to_non200
Canonical points to a page excluded from search
CriticalYou have named an original that is set to noindex, so neither this page nor the one it points at can be shown. The content disappears from search entirely.
Fix: Either remove the noindex from the target, or canonicalise to a page that can be indexed.
canonical_to_noindex
Form submits over an insecure connection
CriticalThis page contains a form whose action is an http:// address, so whatever is typed into it travels unencrypted - regardless of the page being served over https.
Fix: Change the form action to https. Browsers already warn on password fields and will warn on more.
form_insecure_action
HTTP does not redirect to HTTPS
CriticalThe insecure version stays reachable, splitting your ranking signals across two addresses.
Fix: Add a site-wide
301fromhttp://tohttps://.http_to_https_missing
Internal link points to a broken page
CriticalYour own navigation sends people to a dead end, and it tells search engines the page is worth crawling.
Fix: Update or remove the link on the source pages listed in the details.
broken_internal_link
Many pages name the homepage as their original
CriticalSeveral pages tell Google that the homepage is the real version of them. That is almost always a plugin default, and it removes every one of those pages from search.
Fix: Check your SEO plugin's canonical setting. Each page should point at itself unless it really is a duplicate.
canonical_to_homepage
Page not found
CriticalYou are linking to pages that no longer exist, wasting crawl budget and stranding visitors.
Fix: Either restore the page or update the links pointing at it. Redirect only if a genuine replacement exists.
http_4xx
Page returns a server error
CriticalSearch engines drop pages that error, and visitors see a broken site.
Fix: Check your server and application logs for these URLs - a
5xxis always a fault on your side, never the crawler's.http_5xx
Redirect ends at an error
CriticalThe redirect works but its destination is broken, so the original URL is effectively dead.
Fix: Point the redirect at a page that actually returns
200, or remove it and let the URL404honestly.redirect_to_error
Redirect loop
CriticalThe page can never load: the redirects send visitors and crawlers in a circle.
Fix: Trace the chain in the finding details and break the cycle - usually two rules that each undo the other.
redirect_loop
Secure page loads insecure files
CriticalBrowsers block
http://scripts and images on anhttps://page, so parts of the page silently do not load - and the padlock goes away for the visitor.Fix: Change those script, image and stylesheet URLs to
https://. If a third party has no https version, drop it.insecure_resources
Two pages name each other as the original
CriticalEach page says the other is the original. Google cannot resolve that and discards both.
Fix: Decide which one is the original, point the other at it, and make the original's canonical point at itself.
canonical_loop
A broken page nothing links to any more
WarningThis URL answered an error in your previous scan, still answers one now, and nothing on the site links to it - so this scan could not reach it, and the finding that would have told you disappeared. A page in this state is the worst of both: broken for anyone holding the link, and invisible to the report that should have caught it.
Fix: Decide what the URL is for. If the page should exist, restore it; if it should not, redirect it to whatever replaced it so the people and the links that still point at it land somewhere. Removing the last internal link is not a fix - it only hides the page from your own audit.
page_gone_unlinked
A path segment repeats in the URL
WarningA path like
/shop/bags/shop/bags/is a crawler trap: relative links keep appending, so the number of URLs grows without limit.Fix: Fix the relative links on that page. They should resolve from the site root rather than from the current path.
url_repeated_path
Broken page still showing in search
WarningThe page answers with an error and Google is still offering it to people. Every one of those impressions is a visitor who arrives at nothing.
Fix: Restore the page, or redirect it to the closest live equivalent. A 401, 403 or 429 usually means bot protection is answering Google rather than the page being gone.
error_page_with_traffic
Campaign parameters in a crawled URL
WarningSomething on your site links to this page with a tracking parameter attached, which makes a duplicate of it for every campaign.
Fix: Link internally to the clean URL. Tracking belongs on links from outside the site.
url_tracking_params
Canonical points at a page with a different canonical
WarningSearch engines follow one canonical step, not a chain, so the signal is likely ignored.
Fix: Point this page's canonical directly at the final destination.
canonical_chain
Canonical points at a URL robots.txt blocks
WarningYou have named an original that search engines are not allowed to fetch. They cannot confirm it, so they resolve the duplication however they choose.
Fix: Either allow the canonical target in robots.txt, or canonicalise to a page that is allowed.
canonical_to_blocked
Canonical points back to the insecure version
WarningThe page is served over https and names an http address as the original, which undoes the move to https for that page.
Fix: Update the canonical to https. It is usually a hardcoded URL left over from before the migration.
canonical_https_to_http
Canonical points to a redirect
WarningThe page you named as the original does not exist at that address - it redirects somewhere else. Google has to follow an extra hop and often ignores the canonical instead.
Fix: Point the canonical at the final URL, the one that answers 200 directly.
canonical_to_redirect
Content only appears with JavaScript
WarningWe had to run a browser to see these pages at all. Google usually renders JavaScript too, but later and not always - and every other crawler, link preview and AI answer engine gets the empty shell.
Fix: Server-render or pre-render the main content so it is in the HTML that arrives, and keep JavaScript for what happens after the page is readable.
content_requires_js
Cookie banner hides the content
WarningYour consent platform is holding the page text behind the banner, and a crawler never clicks Accept - so search engines see an almost empty page. We measured the difference: the words appear only after the page runs its scripts.
Fix: Configure the consent tool so the page content is in the HTML before consent, and gate only what actually needs it - analytics, ads, embeds. Blocking your own text is never required by consent rules.
consent_hides_content
Every link on this page is nofollowed
WarningA page-level
nofollowstops ranking signals flowing through all of its links at once, which is a much bigger effect than nofollowing one link.Fix: Remove the page-level nofollow and apply it to individual links if you need it at all.
meta_nofollow
Filtered URL with no canonical
WarningEvery filter combination looks like a separate page, so one product list can end up competing with hundreds of near-copies of itself.
Fix: Add a canonical link on filtered URLs pointing at the unfiltered version of the list.
param_url_no_canonical
hreflang is not reciprocated
WarningLanguage alternates must point at each other. One-way declarations are discarded.
Fix: Add a matching
hreflangtag on the target page pointing back to this one.hreflang_no_return
HTML and HTTP header name different originals
WarningYour page declares one canonical in its markup and a different one in the
Link:response header. Both are valid ways to say it, so the site has given Google two answers and only one is visible on the page.Fix: Decide which is right and remove the other. The header is usually set by a CDN rule nobody remembers.
canonical_header_conflict
Invalid hreflang tag
WarningA malformed language code or relative URL makes the whole hreflang set unreliable, so it may be ignored entirely.
Fix: Use a valid language code (e.g.
en,en-GB, orx-default) and an absolutehttps://URL.hreflang_invalid
JavaScript error when the page loads
WarningAn uncaught error stops the script that threw it, so whatever it was about to do never happens - often rendering the content, wiring the navigation or firing analytics.
Fix: Open the page with the browser console visible and fix the exception; the finding details carry the error text we saw.
js_errors_on_load
Language alternate does not load
WarningOne of the translations you declared answers with an error. Google discards a language set when its entries are broken, so the whole group loses its annotations.
Fix: Fix or remove the broken alternate. A set of three working entries beats four with one dead.
hreflang_to_non200
Language alternate is blocked by robots.txt
WarningOne of the declared translations is disallowed, so search engines can never load it to confirm the pairing.
Fix: Allow the alternate in robots.txt, or take it out of the language set.
hreflang_to_blocked
Language alternate is excluded from search
WarningYou are pointing Google at a translation it has been told not to show.
Fix: Remove the noindex from the translation, or drop it from the language set.
hreflang_to_noindex
Language alternate names a different original
WarningThe translation you declared canonicalises somewhere else, so your annotation and its canonical contradict each other. Google follows the canonical and ignores the annotation.
Fix: Point the hreflang at the canonical URL of the translation rather than at a duplicate of it.
hreflang_to_canonicalised
Language alternate redirects
WarningThe translation you declared is not at that address any more. Every entry should be the final URL.
Fix: Update the hreflang href to the URL that answers directly.
hreflang_to_redirect
Language links do not include this page
WarningGoogle needs every language version to list itself as well as its siblings, and ignores the whole set when one does not - so the translations earn nothing.
Fix: Add an
hreflangentry pointing at this page's own URL, alongside the entries for the other languages.Check one URL with the free hreflang checker
hreflang_missing_self
More than one canonical tag
WarningTwo canonical tags are worse than none: search engines discard all of them rather than choosing, so the page is left with no canonical at all - and the report above still shows the first one, which is why this is easy to miss.
Fix: Keep exactly one
<link rel="canonical">in the head. Two usually means a theme and a plugin are both adding one, or a template outputs it twice.canonical_multiple
No doctype
WarningWithout a doctype the browser falls back to a compatibility mode from the nineties, which changes how the page is laid out and measured.
Fix: Add
<!DOCTYPE html>as the first line of the document.doctype_missing
No sitemap found
WarningSearch engines have to discover every page by following links, so anything weakly linked may never be found.
Fix: Publish a
sitemap.xmland reference it fromrobots.txt.Check one URL with the free xml sitemap checker
sitemap_missing
One page reachable under many filter URLs
WarningA crawler spends its visit on filter combinations instead of your real pages, so new content is found late or not at all.
Fix: Decide which parameters make a genuinely different page and canonicalise or block the rest. A judgement call: a colour filter usually is not a new page, a category often is.
param_explosion
Page has no internal links to it
WarningIt is in your sitemap but nothing on the site links to it, which reads as low importance and makes it hard to find.
Fix: Link to it from a relevant page - navigation, a hub page, or related content.
orphan_page
Page is hidden from search and points elsewhere
WarningNoindex says drop this page, the canonical says credit a different one. Google may act on either, so which one wins is not something you control.
Fix: Decide which you meant: keep
noindexand remove the canonical, or removenoindexand keep the canonical.noindex_canonical_conflict
Page is set to noindex and still gets clicks
WarningGoogle is sending people to a page you told it to drop. One of the two is wrong, and the traffic is the part that disappears.
Fix: Decide which you meant. If the page should rank, remove the noindex; if it should not, expect these clicks to stop and make sure the traffic has somewhere else to land.
noindex_with_traffic
Page language and hreflang disagree
WarningThe
langattribute on the page says one language and its own hreflang entry says another. One of the two is wrong and search engines see both.Fix: Check which is correct and make them match. It is usually the template's
langthat was never changed.hreflang_lang_mismatch
Page says index in the HTML and noindex in a header
WarningThe
X-Robots-Tagheader and the meta tag disagree, so whether this page exists in search is decided by which one Google happens to act on - not by you.Fix: Decide which you meant and remove the other. The header usually comes from a server or CDN rule, so that is where to look first.
robots_conflict
Page says it has nothing, but answers OK
WarningSearch engines index it as a real page, so an empty result competes with your actual content and eats crawl budget that should go to pages worth finding.
Fix: Return
404or410for pages with no content. If the page should exist, give it real content and a title that describes it.soft_404
Pages get traffic but the crawl never found them
WarningNothing on your site links to these and they are not in your sitemap, so the only reason we know they exist is that Google sent people to them. They have no route for ranking signals.
Fix: Link to them from a relevant page, or add them to your sitemap. If they should not exist, redirect them.
orphan_with_traffic
Paginated page canonicals to page one
WarningThis page tells search engines it is a duplicate of page 1, so it is dropped from the index - and anything only linked from it goes with it. This is the most common reason products or articles deep in a listing never appear in search.
Fix: Make each paginated page canonical to itself. Page 2 is not a copy of page 1; it holds different items.
pagination_canonical_to_first
Redirect done with a meta refresh
WarningThe page loads, then moves - so it is slower than a server redirect, and search engines treat the signal as weaker than a
301. It also loses the referrer for whoever arrives.Fix: Replace it with a
301at the server or CDN. Keep the meta refresh only where you cannot set a status code at all.meta_refresh_redirect
Redirect takes more than one hop
WarningEvery extra hop costs load time, and some link equity is lost along the way.
Fix: Redirect the original URL straight to the final destination in one step.
redirect_chain
robots.txt blocks stylesheets or scripts
WarningSearch engines render pages. A CSS or JS file they are told not to fetch means they render your page differently from the way a visitor sees it.
Fix: Allow CSS and JS in robots.txt. Blocking them protects nothing and changes how your pages are judged.
robots_blocks_assets
Same page reachable in different letter cases
WarningA server treats
/Productand/productas two pages, so links and ranking signals are split between copies of one thing.Fix: Pick one casing - lowercase is the usual choice - and redirect the others to it.
case_twin
Search results cannot show a snippet
Warningnosnippetstops Google printing any description under your result. The listing becomes a bare link, and click-through falls sharply.Fix: Remove
nosnippet, or usemax-snippetwith a length if you want to limit rather than forbid it.robots_nosnippet
Secure page loads insecure resources
WarningBrowsers block or warn about the insecure parts, so the page can render broken.
Fix: Change the
http://references in the details tohttps://.mixed_content
Session identifier in the URL
WarningA session parameter makes a new address for every visitor, so the same page is crawled endlessly under different URLs and none of them accumulates anything.
Fix: Move session state to a cookie, and block the parameter in Search Console if it cannot be removed.
url_session_id
Sitemap lists a noindex page
WarningContradictory signals: the sitemap asks search engines to index it while the page tells them not to.
Fix: Pick one - remove the URL from the sitemap, or drop the
noindexif the page should rank.noindex_in_sitemap
Sitemap lists a URL that does not work
WarningA sitemap full of errors reduces how much search engines trust the rest of it.
Fix: Regenerate the sitemap from live URLs only, and keep it in sync automatically.
sitemap_non200
Temporary redirect where a permanent one was meant
WarningA 302 or 307 tells search engines the move is not permanent, so they keep the old URL and do not transfer the page's standing to the new one.
Fix: Use 301 for a move that is not coming back.
redirect_temporary
The document has more than one head or body
WarningA second
<head>or<body>means the markup was assembled wrongly. Parsers recover differently, so what a search engine reads may not be what a browser shows.Fix: Look for a template fragment that brings its own document wrapper.
document_structure_invalid
Two pages claim the same language
WarningMore than one URL is declared as the version for the same language. Google picks one arbitrarily, or drops the set.
Fix: One URL per language. If two pages really are both in that language, they need different region codes or one of them is a duplicate.
hreflang_lang_ambiguous
URL contains a double slash
Warning//in a path is nearly always a bug in how links are built, and each variation is a separate address to search engines.Fix: Fix the link template that joins the base URL to the path.
url_double_slash
URL redirects to itself
WarningThe page redirects to its own address. Some clients follow that until they give up, and search engines treat it as an error.
Fix: Look at the redirect rule that matches this URL - it is usually a condition that is always true.
redirect_self
www and non-www both serve the site
WarningSearch engines see two copies of every page and split ranking between them.
Fix: Choose one as primary and
301the other to it.host_duplicate
Canonical is a relative path
InfoA relative canonical resolves against whatever URL served the page, so the same markup delivered from two addresses produces two different canonicals.
Fix: Use the absolute URL, including the scheme and host.
canonical_relative
Canonical is set only in the HTTP header
InfoThe canonical is declared in the response header and not in the page. That works, and it means nobody reading the source will see it - including your own team.
Fix: Add a matching canonical tag to the page, or write down that the header is where it lives.
canonical_header_only
Extra robots directives on this page
InfoDirectives like
noarchive,nocacheornotranslateare set here. Individually minor, together they describe what you have told search engines about this page.Fix: Confirm each was intended. They are usually inherited from a template rather than chosen per page.
robots_secondary_directives
Google ranks a page you canonicalised away
InfoYour canonical tag names a different page as the original, and Google disagreed. That is the only way to find out that it disagreed.
Fix: Check whether the canonical target is really the better page. If this one is what people want, canonicalise the other way round.
canonicalised_with_traffic
Images on this page are excluded from image search
Infonoimageindexkeeps every image on the page out of Google Images.Fix: Remove it if image search matters for this page. It is often applied site-wide when only a few pages needed it.
robots_noimageindex
Internal links go through a spelling redirect
InfoThe link and the destination are the same page written differently - a trailing slash, or a change of case - so every visit pays for a redirect that a template edit would remove.
Fix: Fix the links to use the final form. Keep the redirect as a safety net.
redirect_normalisation
Language alternates are set only in the HTTP header
InfoYour translations are declared in the
Link:header rather than in the markup. Valid, and invisible to anyone reading the page source.Fix: Nothing to fix if it was deliberate. Worth knowing before somebody adds a second set in the HTML.
hreflang_header_only
Linked pages are blocked by robots.txt
InfoYou link to pages crawlers are not allowed to fetch, which wastes link equity and may be unintentional.
Fix: Check whether the
robots.txtrule is still wanted, or remove the internal links to those URLs.Check one URL with the free robots.txt tester
robots_blocked_linked
No canonical tag
InfoWithout a canonical, search engines guess which address is the real one whenever the same content is reachable more than one way.
Fix: Add a self-referencing canonical. On a page with no duplicates it costs nothing and closes the question.
Check one URL with the free canonical tag checker
canonical_missing
No x-default in the hreflang set
InfoGoogle serves the
x-defaultversion to every language your set does not name. Without one, a visitor whose language is not listed gets whichever version Google guesses - often the wrong one.Fix: Add
<link rel="alternate" hreflang="x-default" href="...">pointing at your language-selection page, or at the version you want strangers to land on.hreflang_no_x_default
Page earns traffic with no internal links
InfoReal visitors reach this page and no other page on the site points to it, so it earns nothing from the rest of your site.
Fix: Add a link from a related page. One relevant internal link is usually enough to change how it is treated.
unlinked_page_with_traffic
Page is buried deep in the site
InfoMore than four clicks from the homepage means less crawl attention and less perceived importance.
Fix: Add a link from a higher-level page, or flatten the section's structure.
deep_page
Page is not in your sitemap
InfoThese pages are indexable and linked from your own site, but your sitemap does not list them - so you are telling search engines two different things about what matters. On a large site it is also the difference between a page being found this week and next month.
Fix: Include them in the sitemap, or check why your generator skipped them. If they are not meant to rank,
noindexis the honest signal rather than a quiet omission.missing_from_sitemap
Page is set to noindex
InfoThis page will not appear in search results. Often deliberate - surfaced so you can confirm it is.
Fix: Nothing, if intended. Remove the
noindexif the page should rank.meta_noindex
Page opts out of AI training or AI images
InfoA
noaiornoimageaidirective tells AI companies not to use this page. Worth knowing you have it, because it is easy to apply site-wide by accident.Fix: If it was deliberate, nothing to do. If it was not, remove the directive - it is usually set in a plugin or at the CDN.
robots_ai_optout
Pages that name a different page as the original
InfoThese pages tell search engines to index something else instead. That is often correct - pagination and filters - but it is worth knowing how much of the site is in that state.
Fix: Skim the list. Anything here that should rank on its own needs its canonical pointing at itself.
canonicalised_page
Redirecting URLs are what Google still ranks
InfoGoogle is ranking the old address rather than the new one, so every visit costs an extra hop and the destination never accumulates the signals.
Fix: Update internal links and the sitemap to point at the destination directly. The redirect stays as a safety net, but nothing should be routing through it.
redirect_with_traffic
Sitemap lastmod dates are unreliable
Infolastmodis the one part of a sitemap that can be checked against reality, so search engines stop trusting the whole file when the dates are wrong. A date in the future, an unparseable value, or the same timestamp on every URL all mean the signal is ignored.Fix: Emit the date each page actually changed, in W3C format (
2026-08-06or2026-08-06T12:00:00+02:00). If your generator cannot do that, omitlastmodentirely - no date is better than a date nobody believes.sitemap_lastmod_invalid
Standard security headers are not set
InfoThese four are the cheap ones - they cost nothing to add and they are what a security scan, a procurement questionnaire, or a cautious customer checks first.
Fix: Set them at the CDN or web server, not per page:
Strict-Transport-Security,X-Content-Type-Options,X-Frame-Options,Referrer-Policy.security_headers_missing
The page you canonicalised to has no internal links
InfoYou have named another page as the original, and nothing on your site links to that page. The version you want indexed is the one with no support.
Fix: Review the list and decide page by page.
canonical_unlinked
The same language declared twice
InfoOne page lists the same language code more than once, which makes the set ambiguous.
Fix: Remove the duplicate entry. Keep one URL per language.
hreflang_lang_duplicate
URL contains a space
InfoSpaces break links in mail clients, chat apps and editors, and they get encoded inconsistently.
Fix: Replace spaces with hyphens and redirect the old address.
url_whitespace
URL contains capital letters
InfoMost servers treat
/Pageand/pageas different addresses, so any link that gets the case wrong creates a duplicate.Fix: Use lower case in URLs, and redirect the mixed-case version to it.
url_uppercase
URL contains non-ASCII characters
InfoAccented or non-Latin characters are handled differently by different clients, so the same page ends up shared under several encodings.
Fix: Either encode them consistently or use plain ASCII in new URLs.
url_non_ascii
URL has many query parameters
InfoSeveral parameters usually mean filters, and filters multiply into more URLs than the site has pages.
Fix: Decide which combinations should be indexed and canonicalise the rest to them.
url_too_many_params
URL is very long
InfoLong URLs are harder to share, get truncated in results, and usually mean the path is carrying information the page should carry.
Fix: Shorten it if the page is new. Do not rewrite established URLs for length alone - the redirect costs more than the URL does.
url_too_long
URL uses underscores between words
InfoGoogle treats hyphens as word separators and underscores as joins, so
blue_shoesreads as one word.Fix: Use hyphens in new URLs. Existing ones are rarely worth a redirect on their own.
url_underscores
The title, description and structured data a search engine reads before it reads the page.
26 checks, up to 18 points · 1 critical, 11 warning, 14 info
Missing page title
CriticalThe title is the headline in search results; without one, search engines invent something from the page.
Fix: Write a unique title of roughly 15-60 characters describing this specific page.
title_missing
Duplicate meta description
WarningThe same summary on several pages tells search engines and users nothing distinguishes them.
Fix: Write a distinct description per page, or remove the duplicates and let search engines excerpt.
meta_desc_duplicate
Duplicate page title
WarningIdentical titles make pages look interchangeable, so search engines pick one and ignore the rest.
Fix: Give each page a title reflecting what is unique about it.
title_duplicate
H1 tag is present but empty
WarningThe page has an
<h1>element containing nothing. It looks like a heading to a checker and reads as a missing heading to a search engine.Fix: Put the page's main heading in it, or remove the empty element.
h1_empty
Missing meta description
WarningSearch engines will excerpt the page instead, which is usually less compelling and lowers click-through.
Fix: Write a 50-165 character summary that reads as an invitation, not a keyword list.
meta_desc_missing
More than one viewport tag
WarningThe page declares the viewport twice. Browsers pick one, and which one is not something you control.
Fix: Keep a single viewport tag. The duplicate usually comes from a theme layered over the template.
viewport_multiple
No H1 heading
WarningThe H1 is the page's main heading for both readers and crawlers; without it the topic is ambiguous.
Fix: Add exactly one H1 stating what the page is about.
h1_missing
No mobile viewport declared
WarningA phone renders the page at desktop width and shrinks it, so the text is unreadable without pinching - and most of your visitors are on a phone.
Fix: Add
<meta name="viewport" content="width=device-width, initial-scale=1">to the page head.viewport_missing
The same H1 on several pages
WarningIdentical main headings make pages look interchangeable, in the same way identical titles do.
Fix: Give each page a heading that describes that page.
h1_duplicate
Title and description both duplicated on the same pages
WarningWhen both match across the same set of pages, it is much stronger evidence that the pages themselves are duplicates rather than that the metadata was rushed.
Fix: Look at whether these pages should exist separately at all. If they should, both fields need to describe what makes each one different.
title_and_desc_duplicate
Viewport is pinned to a fixed width
WarningThis is worse than having none: the page declares a layout width and holds it, so a phone shows a scaled-down desktop page instead of adapting.
Fix: Replace the pixel width with
width=device-width.viewport_fixed_width
Visitors cannot zoom in
WarningThe viewport tag disables pinch zoom. That is a failure of an accessibility requirement as well as an obstacle for anyone reading on a phone.
Fix: Remove
user-scalable=noand anymaximum-scalefrom the viewport tag.viewport_blocks_zoom
Description will be cut off in search results
InfoSame measurement as the title, applied to the description: this one is wider than the space a result gets.
Fix: Say the useful thing in the first line. The rest is there for search engines rather than for readers.
Check one URL with the free meta description checker
meta_desc_truncated_serp
H1 is very long
InfoA heading past about seventy characters stops working as a heading and starts working as a paragraph.
Fix: Shorten it. Move the detail into the first sentence underneath.
h1_too_long
Incomplete Open Graph tags
InfoA partial set gives a broken share preview: a headline with no picture, or a picture with no headline. Every platform that unfurls links reads these, and the missing half is filled with whatever it can scrape.
Fix: Ship
og:title,og:descriptionandog:imagetogether. The image is the one worth checking - it is what people actually see in a feed.og_incomplete
Meta description length is off
InfoUnder 50 characters wastes the space; over 165 gets truncated mid-sentence.
Fix: Aim for 50-165 characters.
meta_desc_length
More than one H1
InfoMultiple top-level headings blur what the page is primarily about.
Fix: Keep one H1 and demote the others to H2.
h1_multiple
No favicon declared
InfoGoogle shows a favicon beside your result on mobile, and a site with none gets a blank placeholder next to competitors who have one. It is the smallest possible difference in how trustworthy a result looks.
Fix: Add
<link rel="icon" href="/favicon.ico">to the head. If you already serve/favicon.ico, declare it anyway - an explicit tag is what we and every crawler read first.favicon_missing
No preview title or image for shared links
InfoWhen somebody shares this page on social media or in a chat app, it appears as a bare URL rather than a card with a headline and picture, and gets far fewer clicks.
Fix: Add
og:titleandog:imagemeta tags. One good image per page beats a site-wide default.og_missing
Title and description are identical
InfoThe description adds nothing to the snippet: the reader sees the same sentence twice.
Fix: Use the description to say what the title could not fit.
title_equals_meta_desc
Title and H1 are identical
InfoTwo chances to describe the page and both say the same thing. The title works in search results and the H1 works on the page, and they can do different jobs.
Fix: Write the title for the search result and the H1 for the reader who has already clicked.
title_equals_h1
Title is too long
InfoPast roughly 60 characters search results truncate it, and the end of your message is cut off.
Fix: Tighten to under 60 characters, keeping the distinguishing words first.
title_too_long
Title is very short
InfoUnder 15 characters rarely says enough for a user to choose your result.
Fix: Expand it to describe the page's specific subject.
title_too_short
Title will be cut off in search results
InfoMeasured at the width Google actually renders titles rather than by counting characters. Wide letters take more room than narrow ones, so a short title can still be truncated and a long one can fit.
Fix: Put the important words first. Everything past the cut is still read by search engines and never seen by a person.
Check one URL with the free title tag checker
title_truncated_serp
Viewport does not set an initial scale
InfoWithout
initial-scale=1some browsers choose their own starting zoom, so the page opens at the wrong size.Fix: Add
initial-scale=1to the viewport tag.viewport_no_initial_scale
What is actually on the page - enough of it, unique, and readable.
20 checks, up to 16 points · 1 critical, 5 warning, 14 info
Identical content on several URLs
CriticalSearch engines pick one URL and ignore the others, so the ranking for this content is split or lost.
Fix: Keep one canonical version and either canonical or redirect the rest to it.
duplicate_content
Page answers successfully with no content
WarningThe page returns 200 and has no text. To a search engine it is a working page that says nothing.
Fix: Add the content, or return a 404 if the page should not exist.
page_empty
Placeholder text is published
WarningThis page still contains lorem ipsum. It is live, it is indexable, and search engines can see it.
Fix: Replace the placeholder or take the page down until it is written.
placeholder_text
Same page with and without a trailing slash
WarningTwo URLs serve identical content, which is duplicate content created by configuration rather than writing.
Fix: Pick one form and
301the other to it, site-wide.slash_twin
Structured data will not parse
WarningBroken JSON-LD is ignored entirely, so you lose any rich result it was meant to produce.
Fix: Validate the block - the details name the parse error and its position.
structured_data_invalid
Very little content
WarningUnder 200 words rarely answers a search fully, so the page struggles to rank for anything.
Fix: Expand it, or merge it into a fuller page and redirect.
thin_content
Content has not changed in six months
InfoThe
Last-Modifiedheader says this page has not been touched since then. Assistants and search engines both favour material that has been kept current.Fix: Review it. A page that is still correct needs a check and a date; one that is not needs the edit.
content_stale
Hard to read
InfoMeasured on the Flesch reading-ease scale, this page scores in the range associated with academic writing. Applied to English pages only.
Fix: Shorter sentences and plainer words. The score moves fastest by splitting long sentences.
readability_hard
Heading levels are out of order
InfoHeadings are the outline of the page. A section that starts at
h2with noh1above it, or a jump fromh2toh4, leaves a heading with no parent - which makes the structure harder for a screen reader to navigate and harder for a search engine to read as a hierarchy.Fix: One
h1for the page, then descend one level at a time. Going back up is fine:h3→h2is simply the next section starting.heading_order_broken
Indexable pages that earn nothing
InfoThese pages are open to search engines and have received no impressions at all. They are candidates for improving, merging, or removing.
Fix: Work through the list and decide page by page. This is a shortlist to review, not a list of mistakes.
indexable_page_no_traffic
Language attribute is not a language code
InfoBrowsers and search engines ignore a value they cannot parse, so the page counts as having no language declared - the same as if you had left it out.
Fix: Use a real code:
en,en-GB,sr-Latn-RS. Not a language name, and not an underscore.lang_invalid
llms.txt does not parse
InfoThe file is there and is not in the expected format - usually an HTML page served for a missing file rather than a markdown document.
Fix: Serve it as plain text with a top-level heading, or remove it so tools stop finding a broken one.
llms_txt_invalid
More than one main element
InfoA page can only have one main region. With several, the landmark means nothing.
Fix: Keep one
<main>and use<section>or<article>for the parts inside it.semantic_main_multiple
No character set declared
InfoThe browser has to guess the encoding, and when it guesses wrong accented letters and quotes come out as mojibake - for some readers and not others.
Fix: Add
<meta charset="utf-8">as the first thing in the page head.charset_missing
No language declared
InfoWithout a
langattribute, screen readers guess pronunciation and search engines guess the audience.Fix: Add
langto the html element, e.g.<html lang="en">.lang_missing
No llms.txt file
InfoSome AI tools look for
/llms.txtas a map of your site. There is no evidence it affects search - Google's documentation says Search ignores it - so this is housekeeping and not a ranking issue.Fix: Add one if you want to describe your site to AI tools. Skipping it costs nothing measurable.
llms_txt_missing
No main element
InfoNothing on the page marks where the content is. Assistants use landmarks to tell an article from the navigation around it, and without one they guess.
Fix: Wrap the page's own content in
<main>. One tag, and it changes nothing visually.semantic_main_missing
No structured data says who the site belongs to
InfoNo page declares an Organization, WebSite or Person. That markup is how search engines and assistants connect a site to an entity they already know about.
Fix: Add Organization or Person markup on the homepage, with the name, logo and official profiles.
structured_data_identity_missing
Page may be too long for AI answers
InfoAssistants have a limit to how much of a page they read. Past a few thousand words the end of the page may never be seen by one.
Fix: If the page covers several topics, split it. If it has to be long, put the answer near the top.
content_very_long
Visitors arrive and leave without engaging
InfoMost people who land here leave without staying, converting, or going anywhere else. The page is being found and is not delivering.
Fix: Check that the page matches what people searched for, and that the answer is above the fold rather than below an introduction.
engagement_low
Links that go nowhere, images without alternative text, and the shape of the site's own link graph.
22 checks, up to 10 points · 7 warning, 15 info
A whole section is cut off from the rest of the site
WarningThese pages link to each other and nothing outside the group links in. The section is an island: each page looks linked, and the section as a whole is reachable by nothing.
Fix: Link into the group from the main site - usually one link to its entry point is enough.
isolated_cluster
An image, stylesheet or script is missing
WarningThe page asks for a file that answers with an error. A missing stylesheet or script changes how search engines render the page; a missing image is a hole where content should be.
Fix: Restore the file or remove the reference. Check the path first - most of these are a build output that moved.
broken_resource
Every link in comes from a page excluded from search
WarningThe only pages linking here are set to noindex. That route works while Google still crawls those pages, and it crawls excluded pages less over time.
Fix: Add a link from a page that is indexed. A hub, a category listing, or the navigation.
isolated_via_noindex_page
Every link to this page is nofollowed
WarningPeople can reach it and ranking signals cannot. For search purposes the page is effectively unlinked despite being in your navigation.
Fix: Remove
rel=nofollowfrom the internal links pointing here. Nofollow is for links you do not vouch for, not for your own pages.only_nofollow_links
Internal link points at a redirect
WarningEvery visitor and every crawler pays an extra round trip, and the link's value is passed through a hop it does not need. It is the normal aftermath of moving to HTTPS or renaming a page - the redirect works, so nobody notices the links were never updated.
Fix: Point the link at the final URL. The finding names the destination it ends up at.
internal_link_to_redirect
Page reachable only as a redirect destination
WarningThe only way in is an old URL redirecting here. Nothing links to the new address directly, so the page depends entirely on the redirect staying in place.
Fix: Update your internal links to point at this URL rather than at the old one.
isolated_via_redirect
Page reachable only through a canonical
WarningNothing on your site links to this page. We only found it because another page names it as the original, and a canonical is not a link - no ranking signals travel along one.
Fix: Link to it from a relevant page. If it should not be the canonical target, point the canonical at a page that is actually linked.
isolated_via_canonical
Alt text is a file name
InfoAn alt of
hero-image-2.jpgis the box being filled rather than the image being described. It reads out loud exactly as badly as it looks.Fix: Replace it with what the image shows. If the image is decoration, an empty alt is the correct answer.
alt_text_filename
Alt text is a paragraph
InfoAlt text over a hundred characters is read out in full before a screen reader moves on, and it is describing rather than replacing the image.
Fix: Say what the image shows in a sentence. Anything longer belongs in the page text, where everybody can read it.
alt_text_too_long
Embed loads before it is needed
InfoAn embedded video or map is usually the heaviest thing on the page, and without lazy loading it is fetched even when it is far below the fold - competing with the content somebody is actually reading.
Fix: Add
loading="lazy"to theiframe. One attribute, no behaviour change for anything above the fold.iframe_no_lazy
Images have no width or height
InfoThe browser cannot reserve space before an image arrives, so the text jumps as the page loads - the thing Google measures as layout shift.
Fix: Put
widthandheightattributes on theimgtags. The real pixel size; CSS can still resize it.img_dimensions_missing
Images without alt text
InfoScreen-reader users get nothing, and search engines cannot tell what the image shows.
Fix: Describe each image's content. Leave
altempty only for purely decorative images.img_alt_missing
Internal link marked nofollow
InfoYou are telling search engines not to follow a link within your own site, which usually is not intended.
Fix: Remove
rel=nofollowfrom internal links unless you have a specific reason.nofollow_internal
Internal links with no text
InfoThese links carry no words at all - usually an image or an icon with no alternative text. They pass no description to the destination and announce nothing to a screen reader.
Fix: Add alt text to linked images, or a visually hidden label.
anchor_text_empty
Link to an external page that is broken
InfoDead outbound links frustrate readers and suggest the page is not maintained.
Fix: Update or remove the links listed in the details.
broken_external_link
Links labelled click here and read more
InfoLink text tells search engines what the destination is about, and it is what a screen reader announces. "Read more" describes neither.
Fix: Use the destination's subject as the link text.
anchor_text_generic
Links open a new tab without rel=noopener
InfoA link with
target=_blankhands the page it opens a handle back to yours unlessrelsays otherwise. A security default rather than an SEO one.Fix: Add
rel=noopenerto links that open in a new tab.blank_no_noopener
No modern image formats on the page
InfoWebPandAVIFare typically a quarter to a half the size of the same JPEG or PNG, and every byte is on the path to the first thing a visitor sees.Fix: Export images as
WebPorAVIF, or serve them through something that converts on the fly.img_legacy_format
Only one link points to this page
InfoOne internal link is one edit away from none, and one link is a weak signal that the page matters.
Fix: If the page is worth ranking, link to it from somewhere else relevant as well.
single_internal_link
Page links nowhere else on the site
InfoA reader has nowhere to go next, and the authority this page has earned stays here instead of flowing on to your other pages.
Fix: Add a few relevant internal links - a related article, the parent category, or the obvious next step.
dead_end_page
This page is linked both with and without nofollow
InfoThe same page is linked one way from one template and another way from another, which is usually a bug rather than a decision.
Fix: Pick one. Internal links to your own pages should normally be followed.
mixed_follow_nofollow
Very many links on one page
InfoOver 300 links dilutes the value passed by each and makes the page hard to navigate.
Fix: Trim to the links that genuinely help the reader.
excessive_links
How quickly the page becomes useful, measured where we can measure it.
16 checks, up to 13 points · 8 warning, 8 info
Content moves around while loading, for real visitors
WarningCumulative Layout Shift is above the poor threshold for a quarter of real loads. This is the metric behind mis-clicks: somebody reaches for a link and an advert pushes it away.
Fix: Reserve space for images, adverts and embeds by setting explicit dimensions. Fonts that swap late are the other common cause.
cwv_cls_poor
HTML is sent uncompressed
WarningText compresses to roughly a fifth of its size, so this page is several times bigger over the wire than it needs to be - worst on a mobile connection.
Fix: Turn on
gziporbrotliat the web server or CDN. This is a configuration switch, not a code change.compression_missing
Resources delay the first paint
WarningStylesheets and scripts in the head must be downloaded and parsed before anything appears. Lighthouse measured how much time this costs on the sampled pages.
Fix: Defer what is not needed for the first screen, and inline the small amount of CSS that is.
lab_render_blocking
Scripts in the head block the page from painting
WarningThe browser stops building the page until each of these downloads and runs, so the visitor waits on a blank screen for something they cannot see yet.
Fix: Add
deferto scripts that need the page,asyncto ones that do not, or move them to the end of the body.render_blocking_scripts
Server responds slowly
WarningOver 800 ms before the first byte delays everything that follows, on every visit. Measured while this crawl was fetching the rest of the site, so a busy origin can raise it.
Fix: Check these URLs on their own before changing anything - if they are fast when nothing else is running, the crawl was the load. If they are slow either way, look at server-side rendering time, database queries and caching.
ttfb_slow
Slow to respond when people interact, for real visitors
WarningInteraction to Next Paint is over half a second at the 75th percentile. Somebody taps and the page does nothing for long enough that they tap again.
Fix: Break up long JavaScript tasks and defer work that is not needed before the first interaction.
cwv_inp_poor
Slow to show the main content, for real visitors
WarningLargest Contentful Paint is over four seconds for a quarter of the people who load your site. This is not a lab estimate - it is what Chrome measured on real devices over the last month, and it is the number Google ranks on.
Fix: Find the largest element above the fold, usually a hero image or a web font, and make it arrive sooner. Preloading it is often the whole fix.
cwv_lcp_poor
Stylesheet blocks the first paint
WarningThe browser will not paint anything until it has these stylesheets, so each one is a round trip in front of your content. CSS blocks harder than JavaScript does: a script delays the parser, a stylesheet delays the pixels.
Fix: Serve one stylesheet for the page, and give anything that is not needed immediately a
mediaattribute (print, or a query that does not match at load) so it is fetched at a lower priority.render_blocking_css
Font preloaded without crossorigin
InfoFonts are always fetched in CORS mode, whatever the preload says. Without the
crossoriginattribute the browser cannot reuse the preloaded copy, so it downloads the font twice - the preload has made the page slower rather than faster.Fix: Add
crossoriginto the preload:<link rel="preload" as="font" crossorigin href="...">. No value is needed; the bare attribute is correct.font_preload_uncorsed
Images are larger than they need to be
InfoThe images are either sized for a bigger screen than the one asking, or served in a format that costs more bytes than a modern one for the same quality.
Fix: Serve responsive sizes and use WebP or AVIF. This is usually the single largest saving on a content page.
lab_image_delivery
Low performance score in the lab
InfoLighthouse scored a sampled page below fifty on a simulated mobile connection. A lab score is one load on one machine and is not what Google ranks on, so read it as a diagnosis rather than a verdict - the field metrics above are the verdict.
Fix: Open the finding for the opportunities Lighthouse listed. They are ordered by the time each would save.
lab_performance_low
Most of the CSS is never used
InfoThe page downloads stylesheet bytes it never applies. On a phone connection that is time spent before anything is visible.
Fix: Split the stylesheet so each page loads what it uses. A framework's full build on every page is the usual cause.
lab_unused_css
Most of the JavaScript is never used
InfoThe page downloads and parses script it never runs. Parsing is the expensive half and it happens on the main thread, so it delays interaction as well as loading.
Fix: Code-split by route, and load third-party widgets only on the pages that use them.
lab_unused_js
Page loads from many other domains
InfoEach extra domain is its own DNS lookup and connection before anything from it appears, and any one of them being slow makes your page slow.
Fix: Drop the ones nobody reads the data from, and self-host what you can - fonts especially.
third_party_heavy
Static files are not cached for long
InfoImages, stylesheets and scripts are re-downloaded more often than they need to be, so a returning visitor pays again for bytes that did not change.
Fix: Set a long max-age on files whose URL changes when their content does. If the URLs are already fingerprinted, a year is safe.
lab_cache_policy
Very large HTML document
InfoOver 1.5 MB of HTML alone is slow to download and parse, especially on mobile connections.
Fix: Move inline data and repeated markup out of the document; paginate very long pages.
page_heavy
21 checks, up to 10 points · 3 critical, 14 warning, 4 info
A control the keyboard cannot reach
CriticalA
<div>with a click handler, or arole="button"with notabindex, works for a mouse and does not exist for a keyboard. It is also invisible to a screen reader user, who navigates by exactly the same route.Fix: Use a real
<button>or<a href>. If it has to stay a div, give ittabindex="0"and a key handler for Enter and Space - which is three things a<button>does for free.a11y_keyboard_unreachable
A select with no label
CriticalA dropdown with no associated label is announced as an unlabelled combo box. On a country picker, a size picker or a delivery option, that is a form somebody cannot complete.
Fix: Connect it to a
<label>withforandid, or give it anaria-label. The first option is not a label - it disappears the moment a choice is made.a11y_select_name
Form fields with no label
CriticalA field with no associated label is read out as an unlabelled text box. On a checkout or a contact form that is the difference between using the site and leaving it.
Fix: Connect each input to a
<label>withforandid, or give it an aria-label. Placeholder text is not a label - it disappears the moment somebody types.a11y_form_label
A control inside another control
WarningA button inside a link, or a link inside a button. A screen reader announces one control and the browser fires the other, so what the user is told and what happens are two different things.
Fix: Take one of them out. Two actions in one place need two controls side by side, not one inside the other.
a11y_nested_interactive
A focused control is hidden behind a sticky element
WarningWCAG 2.2 added this because it is what a sticky header does: the keyboard moves to a link, the browser scrolls it to the top of the window, and the header covers it. The user is on a control they cannot see.
Fix: Add
scroll-margin-topto focusable elements, the height of the sticky header. One rule, usually on a global selector.a11y_focus_obscured
A scrollable area the keyboard cannot reach
WarningA box with its own scrollbar - a code block, a wide table, a map - that no keyboard can focus is content a keyboard user cannot read. The mouse scrolls it and nothing else does.
Fix: Give the scrolling element
tabindex="0"so it can be focused and scrolled with the arrow keys, and a label saying what it is.a11y_scrollable_region
ARIA attributes that do not work
WarningARIA overrides what a browser would otherwise announce, so an invalid role or a required attribute that is missing does more harm than leaving it out. The element is announced as something it is not.
Fix: Fix the role or the attribute, or remove the ARIA - a plain
<button>is announced correctly with no ARIA at all.a11y_aria
Links in text are shown by colour alone
WarningA link inside a paragraph that differs from the text around it only by colour is invisible to anyone who cannot see that difference - which includes the most common form of colour blindness. WCAG requires a second cue.
Fix: Underline links inside body text, or give them a distinct weight. Navigation and buttons are exempt because their position already marks them as controls.
a11y_link_in_text
Links with nothing to announce
WarningA link whose only content is an icon or an image with no alternative text is read out only as a link. Somebody using a screen reader has no way to know where it goes.
Fix: Give the link visible text, or an aria-label, or alt text on the image inside it.
a11y_link_name
Nothing shows where the keyboard is
WarningSomebody navigating by keyboard has no cursor. The focus ring is the only thing telling them which control they are on, and
outline: nonewith nothing put in its place removes it - measured on the page with the control actually focused, because a focus style exists only while it is.Fix: Give focused controls a visible style:
:focus-visible { outline: 2px solid; outline-offset: 2px }is enough, and it only shows for keyboard users. Neveroutline: noneon its own.a11y_focus_invisible
Tap targets are too small or too close together
WarningWCAG 2.2 asks for 24 by 24 CSS pixels, or enough space around a smaller control. A link in a row of links that is six pixels tall is a link nobody with unsteady hands, a large finger or a trackball can hit reliably - and everybody misses it on a train.
Fix: Give the control padding until it is 24px in both directions, or leave 24px of clear space around it. Padding is usually enough; the visible box does not have to grow.
a11y_target_size
Text does not stand out enough from its background
WarningMeasured against the WCAG contrast requirement in a real browser. Low contrast is the single most common accessibility failure on the web, and it is the one that affects the most people - anyone reading on a phone in daylight, not only people with a diagnosis.
Fix: Darken the text or lighten the background until the ratio passes. It is almost always one or two values in a stylesheet rather than a per-page fix.
a11y_contrast
The page blocks zooming
Warninguser-scalable=noor a maximum-scale below 2 stops somebody pinching to enlarge the text. It is a WCAG failure and a mobile-usability one, and it is a single attribute in the head of every page on the site.Fix: Remove
user-scalable=noand anymaximum-scalebelow 5 from the viewport meta tag. There is no layout it protects that a media query cannot handle.a11y_viewport_zoom
The page does not declare its language
WarningWithout a valid
langon the html element a screen reader guesses which language to pronounce the page in, and it guesses wrong often enough to make the page unusable.Fix: Set
langon the<html>element to a valid code for the page's language.a11y_html_lang
The page has no title for assistive technology
WarningThe title is the first thing announced when a page opens and the label of its browser tab. Without one, every page on the site sounds identical.
Fix: Add a
<title>that describes this page specifically.a11y_document_title
An iframe with no title
InfoA screen reader announces frames by their title. Without one it says "frame", so a page with an embedded video, map and form has three frames and no way to tell them apart.
Fix: Add a
titleto each<iframe>saying what is inside it - "Checkout payment form", not "iframe".a11y_frame_title
Headings skip levels
InfoHeadings are how somebody using a screen reader navigates a long page. A jump from h2 to h4 breaks the outline they are navigating by.
Fix: Use headings in order. If a level looks wrong visually, change the styling rather than the level.
a11y_heading_order
No way past the navigation
InfoThe first thing a keyboard reaches on every page is your menu. Without a skip link, reaching the content means tabbing through every navigation item, on every page, every time.
Fix: Put a link to
#mainas the first element in the body. It can be hidden until focused - the usual pattern isposition: absolute; left: -9999pxuntil:focus.a11y_skip_link_missing
Other accessibility issues found
InfoFurther WCAG A and AA failures found by the automated audit, grouped here so the report stays readable. The rule names travel with the finding.
Fix: Open the finding for the rule names and the elements involved. Each rule links to Deque's explanation of what it means and how to fix it.
a11y_other
What is not on this list
Your own rules. A site can add checks of its own - a string that must appear on every page, a meta tag that must never be missing - and those are deliberately kept out of the health score, because that number is ours and has to mean the same thing on every site. How custom rules work
The catalogue grows. When a check is added, an existing scan is not re-scored behind your back - the comparison you were shown yesterday stays the comparison you were shown yesterday, and the new check appears on the next crawl.