Checks reference (146)

Severity says how confident we are that this hurts; priority says how soon to act. Every check here has a matching filter in the app and a regression fixture in our test suite.

Response Codes · URL · Page Titles · Meta Description · Meta Keywords · H1 · H2 · Content · Content rules · Images · Canonicals · Pagination · Directives · Hreflang · JavaScript · Links · Security · Structured Data · Sitemaps · Validation · Crawl

Response Codes

SeverityPriorityCheckWhat it means and how to fix it
errorhighNo response
rc_no_response
The server did not respond (DNS failure, connection refused, reset, or timeout).
Fix: Check the host resolves, the server is up, and it responds within the timeout. Retry the crawl for intermittent issues.
errorhighTimed out
rc_timeout
The request exceeded the configured timeout.
Fix: Investigate server response times for the URL. Raise the timeout only if the server is legitimately slow.
errorhighInternal client error (4xx)
rc_client_error_4xx
An internal URL returns a 4xx such as 404 or 410. Links to it are broken for users and waste crawl budget.
Fix: Fix or remove the linking pages (see Inlinks), or redirect the URL to the best replacement.
errorhighInternal server error (5xx)
rc_server_error_5xx
An internal URL returns a 5xx error.
Fix: Check server logs for the URL. Persistent 5xx responses lead to de-indexing.
errorhighRedirect loop
rc_redirect_loop
The redirect chain returns to a URL already visited, so it never resolves.
Fix: Fix the redirect rules so the chain ends on a 200 page.
errorhighRedirect to error page
rc_redirect_to_error
The URL redirects to a page that returns 4xx or 5xx.
Fix: Redirect to a live page instead.
warningmediumBlocked by robots.txt
rc_blocked_by_robots
Internal URL disallowed by robots.txt, so it was not fetched.
Fix: Confirm the block is intended. Pages blocked here cannot be crawled or indexed via the link graph; remove the disallow rule if the page should rank.
warninghighBlocked resource
rc_blocked_resource
A CSS, JavaScript or image file is blocked by robots.txt. Google renders pages with these resources, so blocking them can hide content and layout from indexing.
Fix: Allow Googlebot to fetch CSS, JS and images used for rendering.
warninglowInternal redirection (3xx)
rc_redirect_3xx
Internal URL responds with a redirect. Linking straight to the final URL saves a hop for users and crawlers.
Fix: Update internal links to point at the redirect target.
warninglowTemporary redirect (302/307)
rc_redirect_302
A temporary redirect may keep the old URL indexed. Use 301/308 for permanent moves.
Fix: Change to a 301 or 308 if the move is permanent.
warningmediumMeta refresh redirect
rc_meta_refresh
The page redirects via <meta http-equiv="refresh">. Slower than an HTTP redirect and weaker as a signal.
Fix: Replace with a server-side 301 redirect.
warningmediumJavaScript redirect
rc_js_redirect
The rendered page ended on a different URL than requested, so JavaScript redirected it.
Fix: Use an HTTP 301 redirect instead of a client-side redirect.
warningmediumExternal client error (4xx)
rc_external_client_error
An external link target returns 4xx.
Fix: Update or remove the outbound link (see Inlinks for where it appears).
warninglowExternal server error (5xx)
rc_external_server_error
An external link target returns 5xx.
Fix: Re-check later; remove the link if it stays down.
warninglowExternal no response
rc_external_no_response
An external link target did not respond.
Fix: Re-check later; remove the link if it stays down.
warningmediumRedirect chain
rc_redirect_chain
The URL redirects to another URL that also redirects. Each hop adds latency and loses signals.
Fix: Point the first URL straight at the final destination.
warninglowSlow response (>1s)
rc_slow_response
Time to download the HTML exceeded one second.
Fix: Improve server response time: caching, faster hosting, fewer blocking queries.

URL

SeverityPriorityCheckWhat it means and how to fix it
warninglowNon-ASCII characters
url_non_ascii
URL contains characters outside ASCII.
Fix: Prefer ASCII, lowercase, hyphen-separated slugs.
warninglowUppercase characters
url_uppercase
URL path contains uppercase characters, which can create duplicate variants.
Fix: Serve lowercase URLs and redirect uppercase variants.
warninglowRepetitive path
url_repetitive_path
The same path segment repeats, often a sign of a relative-link bug creating infinite URLs.
Fix: Fix the relative link that generates the repeated segment.
warninglowMultiple slashes
url_multiple_slashes
The path contains "//".
Fix: Normalise and redirect to the single-slash version.
warninglowContains space
url_space
URL contains a space or %20.
Fix: Use hyphens instead of spaces.
warningmediumSession ID in URL
url_session_id
URL carries a session identifier, which creates unlimited duplicates.
Fix: Keep sessions in cookies; canonicalise the URL.
opportunitylowUnderscores
url_underscores
URL path uses underscores. Google treats hyphens as word separators, underscores not reliably.
Fix: Use hyphens in new URLs; do not rename existing ranking URLs just for this.
opportunitylowParameters
url_parameters
URL includes query parameters, which often create duplicates.
Fix: Confirm parameterised URLs are canonicalised or blocked where appropriate.
opportunitylowOver 115 characters
url_over_115
Very long URL.
Fix: Keep URLs short and descriptive.

Page Titles

SeverityPriorityCheckWhat it means and how to fix it
errorhighMissing title
title_missing
The page has no <title>. Titles are a primary ranking and click-through signal.
Fix: Add a unique, descriptive <title> inside <head>.
warningmediumDuplicate title
title_duplicate
Another page uses the same title.
Fix: Give each page a unique title that describes its content.
warninglowOver 60 characters
title_over_60
Title is longer than 60 characters and may be truncated in results.
Fix: Shorten the title, front-loading the key terms.
warninglowOver 580 pixels
title_over_px
Title is wider than Google typically displays (~580px).
Fix: Shorten the title.
warningmediumMultiple titles
title_multiple
More than one <title> element found.
Fix: Keep a single <title> in <head>.
warningmediumTitle outside head
title_outside_head
The <title> appears after an element that closed <head> early, so it may be ignored.
Fix: Move the title into <head> and remove invalid elements before it.
opportunitylowUnder 30 characters
title_under_30
Short titles may miss relevant terms.
Fix: Expand the title with descriptive terms.
opportunitylowSame as H1
title_same_as_h1
Title and H1 are identical. Not an error, but an opportunity to target variations.
Fix: Consider a different but consistent title and H1.

Meta Description

SeverityPriorityCheckWhat it means and how to fix it
warningmediumMissing meta description
desc_missing
No meta description. Google may write its own snippet.
Fix: Add a unique description of 70 to 155 characters.
warningmediumDuplicate meta description
desc_duplicate
Another page has the same meta description.
Fix: Write a unique description per page.
warninglowOver 155 characters
desc_over_155
The description is likely to be truncated.
Fix: Shorten to under 155 characters.
warninglowOver 990 pixels
desc_over_px
The description is wider than typically displayed.
Fix: Shorten the description.
warningmediumMultiple meta descriptions
desc_multiple
More than one meta description found.
Fix: Keep one.
opportunitylowUnder 70 characters
desc_under_70
Short description leaves snippet space unused.
Fix: Expand with a useful summary and call to action.

Meta Keywords

SeverityPriorityCheckWhat it means and how to fix it
infolowMeta keywords present
mk_present
Meta keywords are ignored by Google and reveal targeting to competitors.
Fix: Remove the tag unless another engine you care about uses it.

H1

SeverityPriorityCheckWhat it means and how to fix it
warningmediumMissing H1
h1_missing
No H1 heading on the page.
Fix: Add a single descriptive H1.
warninglowDuplicate H1
h1_duplicate
Another page uses the same H1.
Fix: Make each H1 unique.
warninglowH1 over 70 characters
h1_over_70
The H1 is long.
Fix: Shorten the H1.
warninglowMultiple H1
h1_multiple
More than one H1 on the page.
Fix: Keep one H1; demote others to H2.

H2

SeverityPriorityCheckWhat it means and how to fix it
opportunitylowMissing H2
h2_missing
No H2 headings. Subheadings help structure and comprehension.
Fix: Break content into sections with H2s.
opportunitylowDuplicate H2
h2_duplicate
Another page uses the same first H2.
Fix: Vary subheadings per page where sensible.
opportunitylowH2 over 70 characters
h2_over_70
The first H2 is long.
Fix: Shorten the H2.
opportunitylowH2 before H1
h2_non_sequential
Heading levels are out of order.
Fix: Order headings H1, then H2, then H3.

Content

SeverityPriorityCheckWhat it means and how to fix it
warninghighExact duplicate
content_exact_duplicate
Visible text is identical to another page.
Fix: Canonicalise, redirect or differentiate the duplicates.
warningmediumNear duplicate (≥90%)
content_near_duplicate
Visible text is at least 90% similar to another page.
Fix: Consolidate or differentiate the pages.
warninghighSoft 404
content_soft_404
Returns 200 but looks like a not-found page.
Fix: Return a real 404/410 status, or restore the content.
warninghighLorem ipsum placeholder
content_lorem_ipsum
Placeholder text found.
Fix: Replace with real copy or noindex the page.
warninghighMojibake (broken encoding)
content_mojibake
Characters like ’ or é indicate UTF-8 shown as Latin-1.
Fix: Fix the stored text or the declared charset.
opportunitylowLow content (<200 words)
content_low_word_count
Thin page with fewer than 200 words of visible text.
Fix: Expand the content or merge the page into a stronger one.
opportunitylowReadability: difficult
content_readability_difficult
Flesch reading ease under 30 (college-level English).
Fix: Shorter sentences and simpler words, if the audience calls for it.

Content rules

SeverityPriorityCheckWhat it means and how to fix it
warninghighBanned phrase
content_banned_phrase
A phrase from your content rules appears on the page.
Fix: Rewrite the sentence per your messaging rules.

Images

SeverityPriorityCheckWhat it means and how to fix it
errorhighBroken image
img_broken
The image URL returns an error.
Fix: Fix the src or restore the file.
warningmediumMissing alt attribute
img_missing_alt
An <img> has no alt attribute.
Fix: Add alt text, or alt="" for purely decorative images.
warninglowMissing width/height
img_missing_size_attrs
Images without size attributes cause layout shift (CLS).
Fix: Add width and height attributes.
opportunitylowEmpty alt text
img_alt_empty
An <img> has alt="". Fine for decorative images, missed opportunity otherwise.
Fix: Describe meaningful images.
opportunitylowAlt text over 100 characters
img_alt_over_100
Very long alt text.
Fix: Keep alt text concise.
opportunitylowImage over 100 KB
img_over_100kb
Large image file.
Fix: Compress, resize or serve WebP/AVIF.

Canonicals

SeverityPriorityCheckWhat it means and how to fix it
errorhighConflicting canonicals
canonical_conflict
Multiple canonicals point at different URLs; Google ignores all of them.
Fix: Keep one canonical.
errorhighCanonical to non-indexable URL
canonical_non_indexable
The canonical target redirects, errors or is noindex.
Fix: Point the canonical at a 200, indexable URL.
warningmediumMultiple canonicals
canonical_multiple
More than one canonical declared (HTML or HTTP header).
Fix: Keep a single canonical.
warningmediumRelative canonical
canonical_relative
Canonical href is relative. Absolute URLs avoid ambiguity.
Fix: Use the absolute URL.
warningmediumCanonical target not linked
canonical_unlinked
The canonical target has no internal links.
Fix: Link to the canonical URL internally.
warningmediumCanonical protocol mismatch
canonical_protocol_mismatch
HTTPS page canonicalises to HTTP or vice versa.
Fix: Canonicalise to the HTTPS URL.
warningmediumNoindex with canonical
canonical_noindex_conflict
The page is noindex but declares a canonical to another URL. Mixed signals.
Fix: Use one or the other.
opportunitylowMissing canonical
canonical_missing
No canonical link. Self-referencing canonicals protect against parameter duplicates.
Fix: Add <link rel="canonical"> pointing at the preferred URL.
infolowCanonicalised
canonicalised
The canonical points at a different URL, so this page is not meant to be indexed.
Fix: Confirm the canonical target is correct.

Pagination

SeverityPriorityCheckWhat it means and how to fix it
warningmediumPagination target not indexable
pagination_non_indexable_target
rel=next/prev points at a URL that is not 200 and indexable.
Fix: Fix the pagination target.

Directives

SeverityPriorityCheckWhat it means and how to fix it
warningmediumNofollow
dir_nofollow
Meta robots nofollow stops link equity flowing from this page.
Fix: Remove nofollow unless intended.
warninghighRobots "none"
dir_none
robots "none" = noindex, nofollow.
Fix: Confirm it is intended.
warninglowMultiple robots meta tags
dir_multiple_robots
More than one robots meta tag.
Fix: Merge into one tag.
infolowNoindex
dir_noindex
Page carries noindex (meta or X-Robots-Tag).
Fix: Confirm it should be excluded from search.
infolowNoarchive / nosnippet / noimageindex
dir_noarchive
Restrictive snippet directives present.
Fix: Confirm they are intended.
infolowUnavailable_after
dir_unavailable_after
Page sets an expiry for indexing.
Fix: Confirm the date.

Hreflang

SeverityPriorityCheckWhat it means and how to fix it
errorhighHreflang to non-200 URL
hl_non_200
An hreflang target redirects or errors.
Fix: Point hreflang at final 200 URLs.
errorhighInvalid language code
hl_invalid_code
hreflang value is not a valid ISO 639-1 language (optionally with ISO 3166-1 region).
Fix: Use codes like en, en-GB, de-AT.
warningmediumMissing self reference
hl_missing_self
The page does not include itself in its hreflang set.
Fix: Add a self-referencing hreflang.
warningmediumHreflang to non-canonical URL
hl_noncanonical
An hreflang target canonicalises elsewhere.
Fix: Point hreflang at canonical URLs.
warningmediumHreflang to noindex URL
hl_noindex_target
An hreflang target is noindex.
Fix: Remove it from the set or make it indexable.
warningmediumMultiple entries for one language
hl_multiple_same_lang
The same language code points at different URLs.
Fix: Keep one URL per language-region.
warningmediumInconsistent language confirmation
hl_inconsistent_lang
The hreflang target declares itself (html lang) as a different language.
Fix: Align hreflang and html lang.
opportunitylowMissing x-default
hl_missing_x_default
No x-default alternate.
Fix: Add x-default for unmatched languages.

JavaScript

SeverityPriorityCheckWhat it means and how to fix it
warninghighNoindex only in rendered HTML
js_noindex_only_rendered
JavaScript injects noindex. Google may index the page before rendering it.
Fix: Put noindex in the raw HTML or HTTP header.
warningmediumCanonical only in rendered HTML
js_canonical_only_rendered
Canonical is added by JavaScript.
Fix: Put the canonical in the raw HTML.
warninghighCanonical mismatch raw vs rendered
js_canonical_mismatch
JavaScript changes the canonical URL.
Fix: Make raw and rendered canonicals agree.
warninglowTitle updated by JavaScript
js_title_updated
The rendered title differs from the raw HTML title.
Fix: Server-render the final title.
warninglowMeta description updated by JavaScript
js_desc_updated
The rendered description differs from the raw one.
Fix: Server-render the description.
warninglowH1 updated by JavaScript
js_h1_updated
The rendered H1 differs from the raw one.
Fix: Server-render the H1.
warningmediumRender timed out
js_render_timeout
Network never went idle within the render timeout; captured DOM may be incomplete.
Fix: Reduce long-polling/analytics noise or raise the render timeout.
infolowContent only in rendered HTML
js_content_only_rendered
Rendered word count is substantially higher than raw. Content depends on JavaScript.
Fix: Server-side render or pre-render key content.
infolowJavaScript errors
js_console_errors
Page errors were logged during rendering.
Fix: Fix the script errors.
infolowFailed resource requests during render
js_failed_requests
Some resources failed to load while rendering.
Fix: Check the failing URLs.
SeverityPriorityCheckWhat it means and how to fix it

Security

SeverityPriorityCheckWhat it means and how to fix it
errorhighMixed content
sec_mixed_content
HTTPS page loads HTTP resources, which browsers block or flag.
Fix: Load all resources over HTTPS.
errorhighForm posts to HTTP
sec_insecure_form_action
Form action uses http://.
Fix: Post to HTTPS.
warninghighHTTP URL
sec_http_url
Internal page served over HTTP.
Fix: Serve over HTTPS and redirect HTTP.
warningmediumForm on HTTP page
sec_form_on_http
A form on an insecure page.
Fix: Serve the page over HTTPS.
warninglowMissing HSTS header
sec_missing_hsts
No Strict-Transport-Security header.
Fix: Add HSTS once HTTPS is stable.
warninglowMissing X-Content-Type-Options
sec_missing_xcto
No X-Content-Type-Options: nosniff.
Fix: Add the header.
warninglowMissing X-Frame-Options / frame-ancestors
sec_missing_xfo
Page can be framed by any site (clickjacking).
Fix: Add X-Frame-Options or CSP frame-ancestors.
warninglowMissing secure Referrer-Policy
sec_missing_referrer_policy
No Referrer-Policy header.
Fix: Add Referrer-Policy: strict-origin-when-cross-origin.
warninglowProtocol-relative resource links
sec_protocol_relative
Resources referenced with "//host/path".
Fix: Use https:// explicitly.
warninglowMissing or wrong Content-Type
sec_bad_content_type
The response has no Content-Type, or an HTML page is not served as text/html.
Fix: Set the correct Content-Type header.
opportunitylowMissing Content-Security-Policy
sec_missing_csp
No CSP header.
Fix: Add a CSP that fits your scripts.

Structured Data

SeverityPriorityCheckWhat it means and how to fix it
errorhighStructured data parse error
sd_parse_error
JSON-LD could not be parsed.
Fix: Fix the JSON syntax.
errorhighStructured data missing required property
sd_validation_error
A rich result type lacks a required property, so Google will not show the rich result.
Fix: Add the missing property.
warninglowStructured data missing recommended property
sd_validation_warning
A recommended property is missing.
Fix: Add it where you have the data.
infolowMixed formats
sd_microdata_and_jsonld
Both microdata and JSON-LD present.
Fix: Prefer JSON-LD only, to avoid conflicting values.

Sitemaps

SeverityPriorityCheckWhat it means and how to fix it
errorhighNon-200 URL in sitemap
sm_non_200_in_sitemap
A sitemap URL redirects or errors.
Fix: List only final, live URLs.
warningmediumNoindex URL in sitemap
sm_noindex_in_sitemap
A noindex page is listed in an XML sitemap.
Fix: Remove it from the sitemap.
warningmediumCanonicalised URL in sitemap
sm_canonicalised_in_sitemap
A sitemap URL canonicalises to another URL.
Fix: List the canonical URL instead.
warningmediumNo XML sitemap found
sm_sitemap_missing
No sitemap in robots.txt or at /sitemap.xml.
Fix: Publish a sitemap and reference it in robots.txt.
warningmediumSitemap could not be fetched or parsed
sm_sitemap_error
A referenced sitemap returned an error or was invalid.
Fix: Fix the sitemap URL or XML.
warningmediumSitemap URL on another host
sm_foreign_url_in_sitemap
A sitemap lists URLs outside the crawled host.
Fix: Sitemaps may only list URLs on their own host.
opportunitylowIndexable URL not in sitemap
sm_not_in_sitemap
An indexable page is missing from the sitemaps.
Fix: Add it to a sitemap.

Validation

SeverityPriorityCheckWhat it means and how to fix it
errorhighHTML over 15 MB
val_html_over_15mb
Googlebot stops reading HTML after 15 MB.
Fix: Reduce page size.
errorhighMissing head
val_missing_head
No <head> element.
Fix: Add a head with title and meta tags.
warninglowMissing doctype
val_missing_doctype
No <!DOCTYPE html>, so browsers use quirks mode.
Fix: Add the doctype as the first line.
warninglowCharset declared after 1024 bytes
val_charset_after_1024
The charset meta appears late in <head>.
Fix: Declare charset in the first 1024 bytes.
warningmediumMissing viewport meta
val_missing_viewport
No viewport meta, so the page is not mobile friendly.
Fix: Add <meta name="viewport" content="width=device-width, initial-scale=1">.
warningmediumInvalid element in head
val_invalid_head_element
A body element (div, img, p, iframe...) appears inside <head>, which closes head early and can hide meta tags from Google.
Fix: Move the element into <body>.
warninglowMissing html lang
val_missing_lang
The <html> element has no lang attribute.
Fix: Add lang="en" (or the page language).
warningmediumMultiple head or body
val_multiple_head
More than one <head> or <body>.
Fix: Keep one of each.

Crawl

SeverityPriorityCheckWhat it means and how to fix it
errorhighrobots.txt server error
crawl_robots_5xx
robots.txt returned 5xx. Google treats this as "crawl nothing".
Fix: Make robots.txt return 200 or 404.
errorhighRate limited (429 / 1015)
crawl_rate_limited
The server or CDN throttled the crawler. Data for this URL is not trustworthy.
Fix: Lower concurrency, add a delay, or allowlist the crawler user agent.
infolowrobots.txt missing
crawl_robots_missing
No robots.txt (404). Everything is crawlable, but you cannot declare sitemaps.
Fix: Publish a robots.txt.
infolowCrawl limit reached
crawl_too_many_urls
The crawl stopped at the configured URL limit.
Fix: Raise the limit for a complete audit.