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
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | No responserc_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. |
| error | high | Timed outrc_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. |
| error | high | Internal 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. |
| error | high | Internal 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. |
| error | high | Redirect looprc_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. |
| error | high | Redirect to error pagerc_redirect_to_error | The URL redirects to a page that returns 4xx or 5xx. Fix: Redirect to a live page instead. |
| warning | medium | Blocked by robots.txtrc_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. |
| warning | high | Blocked resourcerc_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. |
| warning | low | Internal 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. |
| warning | low | Temporary 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. |
| warning | medium | Meta refresh redirectrc_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. |
| warning | medium | JavaScript redirectrc_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. |
| warning | medium | External 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). |
| warning | low | External server error (5xx)rc_external_server_error | An external link target returns 5xx. Fix: Re-check later; remove the link if it stays down. |
| warning | low | External no responserc_external_no_response | An external link target did not respond. Fix: Re-check later; remove the link if it stays down. |
| warning | medium | Redirect chainrc_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. |
| warning | low | Slow 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
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | low | Non-ASCII charactersurl_non_ascii | URL contains characters outside ASCII. Fix: Prefer ASCII, lowercase, hyphen-separated slugs. |
| warning | low | Uppercase charactersurl_uppercase | URL path contains uppercase characters, which can create duplicate variants. Fix: Serve lowercase URLs and redirect uppercase variants. |
| warning | low | Repetitive pathurl_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. |
| warning | low | Multiple slashesurl_multiple_slashes | The path contains "//". Fix: Normalise and redirect to the single-slash version. |
| warning | low | Contains spaceurl_space | URL contains a space or %20. Fix: Use hyphens instead of spaces. |
| warning | medium | Session ID in URLurl_session_id | URL carries a session identifier, which creates unlimited duplicates. Fix: Keep sessions in cookies; canonicalise the URL. |
| opportunity | low | Underscoresurl_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. |
| opportunity | low | Parametersurl_parameters | URL includes query parameters, which often create duplicates. Fix: Confirm parameterised URLs are canonicalised or blocked where appropriate. |
| opportunity | low | Over 115 charactersurl_over_115 | Very long URL. Fix: Keep URLs short and descriptive. |
Page Titles
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Missing titletitle_missing | The page has no <title>. Titles are a primary ranking and click-through signal. Fix: Add a unique, descriptive <title> inside <head>. |
| warning | medium | Duplicate titletitle_duplicate | Another page uses the same title. Fix: Give each page a unique title that describes its content. |
| warning | low | Over 60 characterstitle_over_60 | Title is longer than 60 characters and may be truncated in results. Fix: Shorten the title, front-loading the key terms. |
| warning | low | Over 580 pixelstitle_over_px | Title is wider than Google typically displays (~580px). Fix: Shorten the title. |
| warning | medium | Multiple titlestitle_multiple | More than one <title> element found. Fix: Keep a single <title> in <head>. |
| warning | medium | Title outside headtitle_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. |
| opportunity | low | Under 30 characterstitle_under_30 | Short titles may miss relevant terms. Fix: Expand the title with descriptive terms. |
| opportunity | low | Same as H1title_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
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | medium | Missing meta descriptiondesc_missing | No meta description. Google may write its own snippet. Fix: Add a unique description of 70 to 155 characters. |
| warning | medium | Duplicate meta descriptiondesc_duplicate | Another page has the same meta description. Fix: Write a unique description per page. |
| warning | low | Over 155 charactersdesc_over_155 | The description is likely to be truncated. Fix: Shorten to under 155 characters. |
| warning | low | Over 990 pixelsdesc_over_px | The description is wider than typically displayed. Fix: Shorten the description. |
| warning | medium | Multiple meta descriptionsdesc_multiple | More than one meta description found. Fix: Keep one. |
| opportunity | low | Under 70 charactersdesc_under_70 | Short description leaves snippet space unused. Fix: Expand with a useful summary and call to action. |
Meta Keywords
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| info | low | Meta keywords presentmk_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
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | medium | Missing H1h1_missing | No H1 heading on the page. Fix: Add a single descriptive H1. |
| warning | low | Duplicate H1h1_duplicate | Another page uses the same H1. Fix: Make each H1 unique. |
| warning | low | H1 over 70 charactersh1_over_70 | The H1 is long. Fix: Shorten the H1. |
| warning | low | Multiple H1h1_multiple | More than one H1 on the page. Fix: Keep one H1; demote others to H2. |
H2
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| opportunity | low | Missing H2h2_missing | No H2 headings. Subheadings help structure and comprehension. Fix: Break content into sections with H2s. |
| opportunity | low | Duplicate H2h2_duplicate | Another page uses the same first H2. Fix: Vary subheadings per page where sensible. |
| opportunity | low | H2 over 70 charactersh2_over_70 | The first H2 is long. Fix: Shorten the H2. |
| opportunity | low | H2 before H1h2_non_sequential | Heading levels are out of order. Fix: Order headings H1, then H2, then H3. |
Content
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | high | Exact duplicatecontent_exact_duplicate | Visible text is identical to another page. Fix: Canonicalise, redirect or differentiate the duplicates. |
| warning | medium | Near duplicate (≥90%)content_near_duplicate | Visible text is at least 90% similar to another page. Fix: Consolidate or differentiate the pages. |
| warning | high | Soft 404content_soft_404 | Returns 200 but looks like a not-found page. Fix: Return a real 404/410 status, or restore the content. |
| warning | high | Lorem ipsum placeholdercontent_lorem_ipsum | Placeholder text found. Fix: Replace with real copy or noindex the page. |
| warning | high | Mojibake (broken encoding)content_mojibake | Characters like ’ or é indicate UTF-8 shown as Latin-1. Fix: Fix the stored text or the declared charset. |
| opportunity | low | Low 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. |
| opportunity | low | Readability: difficultcontent_readability_difficult | Flesch reading ease under 30 (college-level English). Fix: Shorter sentences and simpler words, if the audience calls for it. |
Content rules
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | high | Banned phrasecontent_banned_phrase | A phrase from your content rules appears on the page. Fix: Rewrite the sentence per your messaging rules. |
Images
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Broken imageimg_broken | The image URL returns an error. Fix: Fix the src or restore the file. |
| warning | medium | Missing alt attributeimg_missing_alt | An <img> has no alt attribute. Fix: Add alt text, or alt="" for purely decorative images. |
| warning | low | Missing width/heightimg_missing_size_attrs | Images without size attributes cause layout shift (CLS). Fix: Add width and height attributes. |
| opportunity | low | Empty alt textimg_alt_empty | An <img> has alt="". Fine for decorative images, missed opportunity otherwise. Fix: Describe meaningful images. |
| opportunity | low | Alt text over 100 charactersimg_alt_over_100 | Very long alt text. Fix: Keep alt text concise. |
| opportunity | low | Image over 100 KBimg_over_100kb | Large image file. Fix: Compress, resize or serve WebP/AVIF. |
Canonicals
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Conflicting canonicalscanonical_conflict | Multiple canonicals point at different URLs; Google ignores all of them. Fix: Keep one canonical. |
| error | high | Canonical to non-indexable URLcanonical_non_indexable | The canonical target redirects, errors or is noindex. Fix: Point the canonical at a 200, indexable URL. |
| warning | medium | Multiple canonicalscanonical_multiple | More than one canonical declared (HTML or HTTP header). Fix: Keep a single canonical. |
| warning | medium | Relative canonicalcanonical_relative | Canonical href is relative. Absolute URLs avoid ambiguity. Fix: Use the absolute URL. |
| warning | medium | Canonical target not linkedcanonical_unlinked | The canonical target has no internal links. Fix: Link to the canonical URL internally. |
| warning | medium | Canonical protocol mismatchcanonical_protocol_mismatch | HTTPS page canonicalises to HTTP or vice versa. Fix: Canonicalise to the HTTPS URL. |
| warning | medium | Noindex with canonicalcanonical_noindex_conflict | The page is noindex but declares a canonical to another URL. Mixed signals. Fix: Use one or the other. |
| opportunity | low | Missing canonicalcanonical_missing | No canonical link. Self-referencing canonicals protect against parameter duplicates. Fix: Add <link rel="canonical"> pointing at the preferred URL. |
| info | low | Canonicalisedcanonicalised | The canonical points at a different URL, so this page is not meant to be indexed. Fix: Confirm the canonical target is correct. |
Pagination
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | medium | Pagination target not indexablepagination_non_indexable_target | rel=next/prev points at a URL that is not 200 and indexable. Fix: Fix the pagination target. |
Directives
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | medium | Nofollowdir_nofollow | Meta robots nofollow stops link equity flowing from this page. Fix: Remove nofollow unless intended. |
| warning | high | Robots "none"dir_none | robots "none" = noindex, nofollow. Fix: Confirm it is intended. |
| warning | low | Multiple robots meta tagsdir_multiple_robots | More than one robots meta tag. Fix: Merge into one tag. |
| info | low | Noindexdir_noindex | Page carries noindex (meta or X-Robots-Tag). Fix: Confirm it should be excluded from search. |
| info | low | Noarchive / nosnippet / noimageindexdir_noarchive | Restrictive snippet directives present. Fix: Confirm they are intended. |
| info | low | Unavailable_afterdir_unavailable_after | Page sets an expiry for indexing. Fix: Confirm the date. |
Hreflang
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Missing return linkshl_missing_return_links | A page this URL references via hreflang does not reference it back; Google ignores one-way hreflang. Fix: Add reciprocal hreflang annotations. |
| error | high | Hreflang to non-200 URLhl_non_200 | An hreflang target redirects or errors. Fix: Point hreflang at final 200 URLs. |
| error | high | Invalid language codehl_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. |
| warning | medium | Missing self referencehl_missing_self | The page does not include itself in its hreflang set. Fix: Add a self-referencing hreflang. |
| warning | medium | Hreflang to non-canonical URLhl_noncanonical | An hreflang target canonicalises elsewhere. Fix: Point hreflang at canonical URLs. |
| warning | medium | Hreflang to noindex URLhl_noindex_target | An hreflang target is noindex. Fix: Remove it from the set or make it indexable. |
| warning | medium | Multiple entries for one languagehl_multiple_same_lang | The same language code points at different URLs. Fix: Keep one URL per language-region. |
| warning | medium | Inconsistent language confirmationhl_inconsistent_lang | The hreflang target declares itself (html lang) as a different language. Fix: Align hreflang and html lang. |
| opportunity | low | Missing x-defaulthl_missing_x_default | No x-default alternate. Fix: Add x-default for unmatched languages. |
JavaScript
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| warning | high | Noindex only in rendered HTMLjs_noindex_only_rendered | JavaScript injects noindex. Google may index the page before rendering it. Fix: Put noindex in the raw HTML or HTTP header. |
| warning | medium | Canonical only in rendered HTMLjs_canonical_only_rendered | Canonical is added by JavaScript. Fix: Put the canonical in the raw HTML. |
| warning | high | Canonical mismatch raw vs renderedjs_canonical_mismatch | JavaScript changes the canonical URL. Fix: Make raw and rendered canonicals agree. |
| warning | low | Title updated by JavaScriptjs_title_updated | The rendered title differs from the raw HTML title. Fix: Server-render the final title. |
| warning | low | Meta description updated by JavaScriptjs_desc_updated | The rendered description differs from the raw one. Fix: Server-render the description. |
| warning | low | H1 updated by JavaScriptjs_h1_updated | The rendered H1 differs from the raw one. Fix: Server-render the H1. |
| warning | medium | Render timed outjs_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. |
| info | low | Content only in rendered HTMLjs_content_only_rendered | Rendered word count is substantially higher than raw. Content depends on JavaScript. Fix: Server-side render or pre-render key content. |
| info | low | Links only in rendered HTMLjs_links_only_rendered | Internal links exist only after JavaScript runs. Fix: Output primary navigation in raw HTML. |
| info | low | JavaScript errorsjs_console_errors | Page errors were logged during rendering. Fix: Fix the script errors. |
| info | low | Failed resource requests during renderjs_failed_requests | Some resources failed to load while rendering. Fix: Check the failing URLs. |
Links
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Links to localhost or staginglinks_to_localhost | Links point at localhost, 127.0.0.1 or a dev host. Fix: Fix the hrefs. |
| warning | low | Crawl depth over 3links_high_crawl_depth | Page is 4 or more clicks from the start page. Fix: Add internal links from shallower pages. |
| warning | low | Internal outlinks with no anchor textlinks_no_anchor_text | Some internal links have no anchor text, alt or aria-label. Fix: Add descriptive anchor text. |
| warning | low | Internal nofollow outlinkslinks_internal_nofollow | Internal links marked nofollow. Fix: Remove nofollow from internal links. |
| warning | medium | No internal outlinkslinks_no_internal_outlinks | The page links to no other internal page (dead end). Fix: Add navigation or contextual links. |
| warning | high | Orphan URLlinks_orphan | Found in a sitemap but with no internal inlinks. Fix: Link to the page from relevant pages, or remove it from the sitemap. |
| warning | medium | Only nofollow inlinkslinks_only_nofollow_inlinks | Every internal link to this page is nofollow. Fix: Add at least one followed link. |
| warning | low | Internal links to redirectlinks_to_redirect | Internal pages link to this redirecting URL. Fix: Update the links to the final URL (see Inlinks). |
| opportunity | low | Non-descriptive anchor textlinks_non_descriptive_anchor | Anchors such as "click here" or "read more". Fix: Use anchors that describe the target. |
| opportunity | low | Over 100 external outlinkslinks_high_external_outlinks | Many outbound links. Fix: Review for link quality. |
| opportunity | low | Over 500 internal outlinkslinks_high_internal_outlinks | Very many internal links dilute each link. Fix: Trim navigation or paginate. |
| opportunity | low | Only one inlinklinks_single_inlink | The page has a single internal inlink. Fix: Add more internal links to important pages. |
Security
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Mixed contentsec_mixed_content | HTTPS page loads HTTP resources, which browsers block or flag. Fix: Load all resources over HTTPS. |
| error | high | Form posts to HTTPsec_insecure_form_action | Form action uses http://. Fix: Post to HTTPS. |
| warning | low | Unsafe cross-origin linkslinks_unsafe_cross_origin | target="_blank" links without rel="noopener". Fix: Add rel="noopener" (modern browsers default it, legacy ones do not). |
| warning | high | HTTP URLsec_http_url | Internal page served over HTTP. Fix: Serve over HTTPS and redirect HTTP. |
| warning | medium | Form on HTTP pagesec_form_on_http | A form on an insecure page. Fix: Serve the page over HTTPS. |
| warning | low | Missing HSTS headersec_missing_hsts | No Strict-Transport-Security header. Fix: Add HSTS once HTTPS is stable. |
| warning | low | Missing X-Content-Type-Optionssec_missing_xcto | No X-Content-Type-Options: nosniff. Fix: Add the header. |
| warning | low | Missing X-Frame-Options / frame-ancestorssec_missing_xfo | Page can be framed by any site (clickjacking). Fix: Add X-Frame-Options or CSP frame-ancestors. |
| warning | low | Missing secure Referrer-Policysec_missing_referrer_policy | No Referrer-Policy header. Fix: Add Referrer-Policy: strict-origin-when-cross-origin. |
| warning | low | Protocol-relative resource linkssec_protocol_relative | Resources referenced with "//host/path". Fix: Use https:// explicitly. |
| warning | low | Missing or wrong Content-Typesec_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. |
| opportunity | low | Missing Content-Security-Policysec_missing_csp | No CSP header. Fix: Add a CSP that fits your scripts. |
Structured Data
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Structured data parse errorsd_parse_error | JSON-LD could not be parsed. Fix: Fix the JSON syntax. |
| error | high | Structured data missing required propertysd_validation_error | A rich result type lacks a required property, so Google will not show the rich result. Fix: Add the missing property. |
| warning | low | Structured data missing recommended propertysd_validation_warning | A recommended property is missing. Fix: Add it where you have the data. |
| info | low | Mixed formatssd_microdata_and_jsonld | Both microdata and JSON-LD present. Fix: Prefer JSON-LD only, to avoid conflicting values. |
Sitemaps
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | Non-200 URL in sitemapsm_non_200_in_sitemap | A sitemap URL redirects or errors. Fix: List only final, live URLs. |
| warning | medium | Noindex URL in sitemapsm_noindex_in_sitemap | A noindex page is listed in an XML sitemap. Fix: Remove it from the sitemap. |
| warning | medium | Canonicalised URL in sitemapsm_canonicalised_in_sitemap | A sitemap URL canonicalises to another URL. Fix: List the canonical URL instead. |
| warning | medium | No XML sitemap foundsm_sitemap_missing | No sitemap in robots.txt or at /sitemap.xml. Fix: Publish a sitemap and reference it in robots.txt. |
| warning | medium | Sitemap could not be fetched or parsedsm_sitemap_error | A referenced sitemap returned an error or was invalid. Fix: Fix the sitemap URL or XML. |
| warning | medium | Sitemap URL on another hostsm_foreign_url_in_sitemap | A sitemap lists URLs outside the crawled host. Fix: Sitemaps may only list URLs on their own host. |
| opportunity | low | Indexable URL not in sitemapsm_not_in_sitemap | An indexable page is missing from the sitemaps. Fix: Add it to a sitemap. |
Validation
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | HTML over 15 MBval_html_over_15mb | Googlebot stops reading HTML after 15 MB. Fix: Reduce page size. |
| error | high | Missing headval_missing_head | No <head> element. Fix: Add a head with title and meta tags. |
| warning | low | Missing doctypeval_missing_doctype | No <!DOCTYPE html>, so browsers use quirks mode. Fix: Add the doctype as the first line. |
| warning | low | Charset declared after 1024 bytesval_charset_after_1024 | The charset meta appears late in <head>. Fix: Declare charset in the first 1024 bytes. |
| warning | medium | Missing viewport metaval_missing_viewport | No viewport meta, so the page is not mobile friendly. Fix: Add <meta name="viewport" content="width=device-width, initial-scale=1">. |
| warning | medium | Invalid element in headval_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>. |
| warning | low | Missing html langval_missing_lang | The <html> element has no lang attribute. Fix: Add lang="en" (or the page language). |
| warning | medium | Multiple head or bodyval_multiple_head | More than one <head> or <body>. Fix: Keep one of each. |
Crawl
| Severity | Priority | Check | What it means and how to fix it |
|---|---|---|---|
| error | high | robots.txt server errorcrawl_robots_5xx | robots.txt returned 5xx. Google treats this as "crawl nothing". Fix: Make robots.txt return 200 or 404. |
| error | high | Rate 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. |
| info | low | robots.txt missingcrawl_robots_missing | No robots.txt (404). Everything is crawlable, but you cannot declare sitemaps. Fix: Publish a robots.txt. |
| info | low | Crawl limit reachedcrawl_too_many_urls | The crawl stopped at the configured URL limit. Fix: Raise the limit for a complete audit. |