DocsReference
Site audit checks
Every issue the crawler reports, its severity, what it means and how to fix it, and how the health score is worked out.
The site audit reports 117 kinds of issue. This list is generated from the crawler's own catalog, so it always matches what an audit can report. The code in each row is the issue type used by the REST API and the MCP tools.
How the health score is worked out
- It counts every URL the crawler tried, except those blocked by
robots.txt, since the crawler never fetched them. - The score is the share of those URLs without an error (a critical issue), rounded. Warnings and notices do not lower it. One broken link in the footer puts an error on every page, so it can take the score to 0.
- If no page answered with a success status, the score is 0.
Links and Content issues are reported twice, once for indexable pages and once for pages that are not (noindex, canonicalised to another URL or not returning 200). On a non-indexable page they count one severity lower: a broken link on a noindex page is a warning, not an error.
Issues that apply to the whole site, such as a missing sitemap or missing security headers, are reported once, on the start page or the first page of each origin. Checks that compare pages with each other (duplicates, broken internal links, orphan pages) are only as complete as the crawl; orphan pages are reported only when the crawl finished without hitting its page limit.
Critical (18)
Problems that stop pages being crawled, indexed or shown.
| Issue | What it means | How to fix it |
|---|---|---|
Page blocked the crawlerblocked-page | The server answered 401/403 or a bot challenge, so the page content could not be audited. | Allow the crawler user agent or IP in your firewall/WAF, or confirm the page is meant to be private. |
Server error (5xx)server-error | The page returned a 5xx status. Search engines drop URLs that keep failing. | Check server logs for the failing request and fix the application or infrastructure error. |
404 pagepage-404 | The URL returned 404 Not Found. It is counted under 4XX page too; this list is only the pages that are missing. | Restore the page, 301-redirect it to the closest equivalent, or update the links that point to it. |
4XX pagebroken-page | The URL returned a 4xx status such as 404 or 410, so search engines drop it and links to it are wasted. | Restore the page, redirect it to the closest equivalent, or remove references to it. |
robots.txt returns a server errorrobots-txt-unavailable | robots.txt answered 5xx or 429. Google then treats the whole site as disallowed, so the crawler did too. | Make /robots.txt return 200 (or 404 if you have none) reliably. |
HTTP version does not redirect to HTTPShttp-not-redirected-to-https | The http:// version of the site answers without redirecting to https://, so two copies of the site can be indexed. | Add a permanent (301) redirect from every http:// URL to its https:// version. |
Broken redirectbroken-redirect | The redirect ends at a URL that returns a 4xx or 5xx status or no response. | Point the redirect at a live page, or restore the destination. |
HTTPS to HTTP redirecthttps-to-http-redirect | An https:// URL redirects to an http:// one, downgrading visitors to an insecure connection. | Redirect to the https:// version of the destination. |
Canonical URL has no incoming internal linkscanonical-no-incoming-links | Other pages name this URL as their canonical, but no crawled page links to it, so search engines get mixed signals about which URL matters. | Link to the canonical URL instead of the canonicalised variants. |
Missing titlemissing-title | The page has no <title> or it is empty. | Add a unique, descriptive title element. |
Duplicate pages without canonicalduplicate-without-canonical | The page has the same visible text as other pages and no canonical tag, so search engines have to guess which version to index. | Add a canonical tag on every copy pointing at the preferred version, or redirect the copies to it. |
Page has links to broken pagebroken-internal-link | The page links to internal URLs that return a 4xx or 5xx status. | Update or remove the links, or restore or redirect the targets. |
Orphan page (has no incoming internal links)orphan-page | The indexable page is in the sitemap but no crawled page links to it. | Link to the page from relevant pages, or remove it from the sitemap if it is obsolete. |
3XX redirect in sitemapredirect-in-sitemap | The sitemap lists a URL that redirects. | Replace it in the sitemap with the redirect destination. |
4XX or 5XX page in sitemapbroken-in-sitemap | The sitemap lists a URL that returns an error. | Remove the URL from the sitemap or restore the page. |
Noindex page in sitemapnoindex-in-sitemap | The sitemap lists a URL that tells search engines not to index it: two signals that contradict each other. | Remove the URL from the sitemap, or remove the noindex if the page should rank. |
3XX page receives organic trafficredirect-receives-traffic | Search Console shows Google still sending clicks to this URL, but it redirects. Google has not moved its ranking to the target yet, or links and sitemaps keep pointing here. | Keep the redirect permanent (301), point internal links, canonicals and sitemaps at the target, and check the target matches what searchers wanted. |
4XX page receives organic trafficbroken-page-receives-traffic | Search Console shows Google sending clicks to this URL, but it returns a 4xx error, so those visitors land on an error page. | Restore the page, or 301-redirect it to the closest page that answers the same need. |
Warnings (58)
Problems that hold pages back.
| Issue | What it means | How to fix it |
|---|---|---|
Page was rate-limitedrate-limited-page | The server kept answering 429 Too Many Requests, so the page was not audited. | Re-run with a larger delay or lower concurrency, or raise the rate limit for the crawler. |
Crawl stopped by rate limitingcrawl-rate-limited | Too many consecutive 429 responses; the crawl gave up early and results are partial. | Re-run with a larger delay, or allowlist the crawler on the server. |
Page could not be fetchedfetch-failed | The request failed before a response arrived (timeout, DNS, connection, TLS, or a refused target). | Check that the URL resolves and responds within the timeout; fix DNS, TLS or server availability. |
Slow pageslow-page | Time to first byte plus downloading the HTML took longer than the slow-page threshold. | Cache the HTML at the edge, cut server work per request and reduce the size of the document. |
Slow server response for AI crawlersslow-response-ai-crawlers | The indexable page took so long to start answering that AI crawlers, which use short timeouts, may give up on it. | Serve this page from a cache or CDN so the first byte arrives within about a second. |
AI search crawlers blocked by robots.txtai-search-bots-blocked | robots.txt stops crawlers that fetch pages for AI search answers (such as OAI-SearchBot, ChatGPT-User, PerplexityBot or Claude-SearchBot), so those assistants cannot cite the site. | Allow the AI search and user agents in robots.txt. Blocking training crawlers (GPTBot, ClaudeBot, Google-Extended) is separate and does not affect citations. |
Redirect chainredirect-chain | The URL goes through two or more redirects before reaching its destination. | Point the first URL straight at the final destination. |
Redirect loopredirect-loop | Following the redirects returns to a URL already visited, so the page never loads. | Fix the redirect rules so the chain ends at a page returning 200. |
Page has links to redirectinternal-link-to-redirect | The page links to internal URLs that redirect elsewhere, which costs crawl budget and a little link equity. | Update the links to the final destination URLs. |
3XX redirectredirect-3xx | The internal URL redirects. Fine on its own, but every link and sitemap entry pointing at it should point at the destination instead. | Update links to this URL so they point straight at the redirect target. |
302/307 temporary redirecttemporary-redirect | The URL redirects with a temporary status, so search engines may keep the old URL indexed instead of the destination. | Use a 301 or 308 if the move is permanent. |
Meta refresh redirectmeta-refresh-redirect | The page redirects with a <meta http-equiv="refresh"> tag, which search engines treat less reliably than an HTTP redirect. | Replace the meta refresh with a server-side 301 redirect. |
Redirect to a non-indexable pageredirect-to-non-indexable | The redirect ends at a page that is noindex or canonicalised to another URL, so the authority it passes on is not used. | Point the redirect at the indexable, canonical version of the page. |
Redirect to the home pageredirect-to-homepage | An inner URL redirects to the home page. Google usually treats this as a soft 404, so the old page’s links and rankings are lost. | Redirect it to the closest matching page, or let it return 404 or 410 if nothing replaces it. |
Redirected page has no incoming internal linksredirect-no-incoming-links | The redirecting URL was found through the sitemap or a canonical, not through links. It is likely an old URL left in a sitemap. | Remove the URL from the sitemap and list the destination instead. |
Noindex pagenoindex-page | A robots meta tag or X-Robots-Tag header tells search engines not to index the page. | Remove the noindex directive if the page should appear in search results. |
Nofollow pagenofollow-page | The robots meta tag or header says nofollow, so search engines ignore every link on the page. | Remove nofollow from the robots directive unless the links really should be ignored. |
Conflicting canonical signalscanonical-conflict | The HTML canonical and the Link header canonical name different URLs. | Send a single canonical URL, or make both sources agree. |
Multiple canonical tagsmultiple-canonical | The page has more than one rel="canonical" link element; search engines may ignore all of them. | Keep exactly one canonical link element in the head. |
Canonical points to a broken URLcanonical-to-broken | The canonical target returns a 4xx or 5xx status. | Point the canonical at a URL that returns 200. |
Canonical points to a redirectcanonical-to-redirect | The canonical target redirects instead of returning the page directly. | Point the canonical at the final destination URL. |
Canonical points to a non-indexable pagecanonical-to-non-indexable | The canonical target is noindex, blocked by robots.txt, or canonicalised to yet another URL. | Point the canonical at an indexable, self-canonical page. |
Canonical points from HTTPS to HTTPcanonical-to-http | An https:// page names an http:// URL as its canonical. | Point the canonical at the https:// version. |
Multiple title tagsmultiple-titles | The page has more than one <title> element; search engines pick one, not necessarily yours. | Keep exactly one title element in the head. |
Title too longtitle-too-long | The title is longer than the recommended maximum and will be truncated in results. | Shorten the title to about 60 characters with the key phrase first. |
Missing meta descriptionmissing-meta-description | The page has no meta description, so search engines pick their own snippet. | Add a meta description summarising the page in 70-160 characters. |
Multiple meta descriptionsmultiple-meta-descriptions | The page has more than one meta description tag. | Keep exactly one meta description. |
Meta description too longmeta-description-too-long | The meta description exceeds the recommended maximum and will be truncated. | Trim the description to about 160 characters. |
Meta description too shortmeta-description-too-short | The meta description is too short to be a useful snippet. | Expand the description to at least 70 characters. |
Missing viewport meta tagmissing-viewport | Without a viewport meta tag the page is not rendered as mobile-friendly. | Add <meta name="viewport" content="width=device-width, initial-scale=1">. |
Open Graph tags incompletemissing-open-graph | One of the four required Open Graph tags (og:title, og:type, og:image, og:url) is missing, so shared links get a poor preview. | Add og:title, og:type, og:image and og:url meta tags. |
Open Graph URL not matching canonicalopen-graph-url-mismatch | og:url names a different URL from the canonical (or the page itself), so shares are counted against the wrong URL. | Set og:url to the canonical URL. |
Thin contentthin-content | The indexable page has very little visible text. | Add useful content, merge the page into a stronger one, or set it to noindex. |
Missing alt textimages-missing-alt | One or more images have no alt attribute. | Add descriptive alt text; use alt="" for decorative images. |
Page has broken imagesbroken-image | The page shows internal images that return a 4xx or 5xx status. | Fix the image URLs or restore the missing files. |
Page has broken CSSbroken-css | A stylesheet the page loads returns a 4xx or 5xx status, so the page may render without its styles. | Fix the stylesheet URL or restore the file. |
Page has broken JavaScriptbroken-js | A script the page loads returns a 4xx or 5xx status, so features that depend on it break. | Fix the script URL or restore the file. |
No outgoing linksno-outgoing-links | The indexable page has no links, making it a dead end for users and crawlers. | Add navigation or contextual links to related pages. |
Content needs JavaScript renderingjavascript-rendering-suspected | The HTML is an empty app shell, so content checks were skipped for this page. | Server-render or pre-render the page, or run the audit with JavaScript rendering enabled. |
Mixed contentmixed-content | The HTTPS page loads resources over plain HTTP. | Load every resource over HTTPS. |
Duplicate titleduplicate-title | Several indexable pages share the same title. | Give each page a unique title, or canonicalise true duplicates. |
Duplicate meta descriptionduplicate-meta-description | Several indexable pages share the same meta description. | Write a unique description for each page. |
Duplicate contentduplicate-content | Several indexable pages have identical visible text. | Consolidate the pages with a redirect or canonical, or differentiate their content. |
Page has broken external linksbroken-external-link | The page links to external URLs that return a 4xx status or do not resolve. | Update or remove the links. |
Non-canonical page in sitemapnon-indexable-in-sitemap | The sitemap lists a URL that is canonicalised to another URL or blocked by robots.txt. | List only indexable, canonical 200 URLs in the sitemap. |
Sitemap cannot be readsitemap-unreachable | A sitemap named in robots.txt returns an error or is not valid XML. | Fix the sitemap URL in robots.txt or make the sitemap return valid XML with status 200. |
Sitemap too largesitemap-too-large | A sitemap exceeds 50 MB (uncompressed), the most search engines will read, so it was skipped. | Split it into several sitemaps of at most 50,000 URLs and 50 MB each, listed in a sitemap index. |
Invalid hreflang valuehreflang-invalid-code | An hreflang value is not a valid language or language-region code. | Use ISO 639-1 language codes with optional ISO 3166-1 region, or x-default. |
Hreflang without return linkhreflang-missing-return-link | The page references an alternate that does not reference it back, so the annotation is ignored. | Add a reciprocal hreflang annotation on the alternate page. |
Hreflang points to a non-200 URLhreflang-broken-target | An hreflang alternate redirects or returns an error. | Point hreflang annotations at final URLs that return 200. |
Hreflang points to a non-canonical pagehreflang-to-non-canonical | An hreflang alternate is canonicalised to another URL, so the annotation is ignored. | Point hreflang annotations at the canonical version of each alternate. |
Hreflang points to a noindex pagehreflang-to-noindex | An hreflang alternate is noindex, so it cannot be shown to searchers in that language. | Remove the noindex from the alternate or drop it from the hreflang set. |
Invalid JSON-LDstructured-data-parse-error | A JSON-LD block is not valid JSON and is ignored by search engines. | Fix the JSON syntax; validate with a JSON linter or the Rich Results Test. |
Structured data has schema.org validation errorstructured-data-invalid | A JSON-LD item lacks @context or a property its type requires. | Add the missing properties listed in the issue detail. |
Site served over HTTPinsecure-http | Pages on this origin are served without HTTPS. Reported once per origin. | Serve the site over HTTPS and redirect HTTP to it. |
Indexable page became non-indexablebecame-non-indexable | The page was indexable in the previous audit and is not now (noindex, canonicalised, redirected or an error). | Confirm the change was intended; otherwise undo it so the page can keep its rankings. |
Noindex page receives organic trafficnoindex-page-receives-traffic | Search Console shows clicks to this page, but it is noindex, so it will drop out of Google and lose that traffic. | Remove the noindex if the page should rank; otherwise expect the traffic to stop. |
Non-canonical page receives organic trafficnon-canonical-receives-traffic | Search Console shows clicks to this URL, but its canonical points to another URL. Google is ranking the page you asked it not to. | Check the canonical is right. If it is, make the canonical URL the stronger page: link to it internally and list only it in the sitemap. |
Notices (41)
Smaller improvements and things worth knowing.
| Issue | What it means | How to fix it |
|---|---|---|
Blocked by robots.txtblocked-by-robots | robots.txt disallows this URL for the crawler, so it was not fetched. | Remove the Disallow rule if the page should be crawled and indexed. |
Slow server responseslow-response | Time to first byte exceeded the slow-response threshold. | Add caching, reduce server work per request, or move closer to users with a CDN. |
No robots.txtrobots-txt-missing | The site has no robots.txt, so crawlers get no sitemap location or crawl rules from it. | Publish /robots.txt with at least a Sitemap: line. |
No llms.txtllms-txt-missing | The site has no /llms.txt, the emerging file that points AI assistants to the pages that matter. | Publish /llms.txt listing your key pages with one-line summaries. |
AI training crawlers blocked by robots.txtai-training-bots-blocked | robots.txt stops crawlers that collect training data (such as GPTBot, ClaudeBot, Google-Extended or CCBot). That is a choice, not an error, but it is worth knowing. | Nothing to do if the block is deliberate; remove the Disallow rules if it is not. |
URL too longurl-too-long | The URL is longer than the recommended length, which makes it hard to read and share. | Use shorter, descriptive slugs and drop needless folders and parameters. |
URL contains uppercase lettersurl-uppercase | URLs are case-sensitive, so uppercase paths invite duplicate URLs and broken links. | Use lowercase URLs and redirect uppercase variants to them. |
Large HTML documentlarge-html | The HTML is unusually large or was cut at the body size limit. | Reduce inline scripts, styles and data; paginate or lazy-load long content. |
HTTP to HTTPS redirecthttp-to-https-redirect | An internal http:// URL redirects to https://. The redirect is right, but links to the http:// URL should be updated. | Change internal links and sitemap entries to the https:// URL. |
Redirect to another siteredirect-to-external | A URL on this site redirects to another host. Fine for deliberate outbound links; a mistake when content was meant to stay on the site. | Check the target is intended. Link to the other site directly instead of through a redirect. |
Noindex follow pagenoindex-follow-page | The page is noindex but its links are followed. Google eventually stops following links on long-term noindex pages. | Make sure the pages it links to are reachable through indexable pages too. |
Canonical points to another URLcanonicalized-page | The canonical URL differs from the page URL, so this page is not the indexed version. | Confirm the canonical target is the intended version; otherwise make the canonical self-referencing. |
Title too shorttitle-too-short | The title is too short to describe the page. | Expand the title to describe the page topic. |
Missing lang attributemissing-lang | The <html> element has no lang attribute. | Set lang on the html element, for example <html lang="en">. |
Twitter card missingtwitter-card-missing | The page has no twitter:card tag, so X shows a plain link when it is shared. | Add <meta name="twitter:card" content="summary_large_image">. |
H1 tag missing or emptymissing-h1 | The page has no H1 heading with text. | Add one H1 that states the page topic. |
Multiple H1smultiple-h1 | The page has more than one H1 heading. | Keep a single H1 and demote the others to H2 or lower. |
Heading levels skippedheading-order-skip | A heading jumps more than one level down (for example H2 to H4). | Use heading levels in order without skipping. |
Image file size too largeimage-too-large | The page uses internal images larger than the size threshold, which slows it down. | Compress the images, serve WebP or AVIF, and size them to how they are displayed. |
Page has only one dofollow incoming internal linksingle-dofollow-inlink | Only one crawled page links to this indexable page with a followed link, so it gets little internal link equity. | Link to it from more relevant pages. |
Page has nofollow outgoing internal linksnofollow-internal-links | The page marks links to your own pages as nofollow, which wastes the link equity they would pass. | Remove rel="nofollow" from internal links. |
Page has links with no anchor textlinks-without-anchor | Some internal links have no text and no image alt, so neither people nor search engines know where they lead. | Give every link descriptive text, or an aria-label and an image alt. |
Page is deep in the sitedeep-page | The page is many clicks away from the start URL. | Link to it from higher-level pages to reduce click depth. |
Page in multiple sitemapspage-in-multiple-sitemaps | The URL is listed in more than one sitemap. | List each URL in one sitemap only. |
Indexable page not in sitemappage-not-in-sitemap | The page is indexable but not listed in any discovered sitemap. | Add the URL to the XML sitemap. |
No XML sitemap foundsitemap-missing | No sitemap was found in robots.txt or at /sitemap.xml. | Publish an XML sitemap and reference it from robots.txt. |
Hreflang without self-referencehreflang-missing-self-reference | The page lists alternates but not itself. | Add an hreflang annotation for the page itself. |
Hreflang without x-defaulthreflang-missing-x-default | The page has hreflang alternates but no x-default for searchers whose language is not listed. | Add an x-default alternate, usually the language picker or the main version. |
HTML lang does not match hreflanghreflang-lang-mismatch | The page language in <html lang> differs from the language its own hreflang annotation declares. | Make the html lang attribute and the self-referencing hreflang agree. |
Structured data without @typestructured-data-missing-type | A JSON-LD item has no @type, so it cannot be interpreted. | Add an @type from schema.org to each item. |
Missing Strict-Transport-Security headermissing-hsts | The HTTPS origin does not send HSTS. Reported once per origin. | Send Strict-Transport-Security: max-age=31536000; includeSubDomains. |
Missing Content-Security-Policy headermissing-content-security-policy | No CSP header is sent. Reported once per origin. | Add a Content-Security-Policy header, starting in report-only mode. |
Missing X-Content-Type-Options headermissing-x-content-type-options | The nosniff header is not sent. Reported once per origin. | Send X-Content-Type-Options: nosniff. |
No clickjacking protectionmissing-x-frame-options | Neither X-Frame-Options nor a CSP frame-ancestors directive is sent. Reported once per origin. | Send X-Frame-Options: SAMEORIGIN or Content-Security-Policy: frame-ancestors 'self'. |
Missing Referrer-Policy headermissing-referrer-policy | No Referrer-Policy header is sent. Reported once per origin. | Send Referrer-Policy: strict-origin-when-cross-origin. |
HTTP status code changedstatus-code-changed | The URL returns a different status code from the previous audit. | Confirm the change was intended, especially a 200 that became a 3xx, 4xx or 5xx. |
Title tag changedtitle-changed | The title of this indexable page differs from the previous audit. | Nothing to fix if the change was intended. Watch the page’s rankings and click-through rate. |
Meta description changedmeta-description-changed | The meta description of this indexable page differs from the previous audit. | Nothing to fix if the change was intended. Watch the page’s click-through rate. |
H1 tag changedh1-changed | The H1 of this indexable page differs from the previous audit. | Nothing to fix if the change was intended. Watch the page’s rankings. |
Word count changedword-count-changed | The amount of visible text on this indexable page changed by at least 10% since the previous audit. | Nothing to fix if the change was intended. A large drop can mean content failed to load. |
Organic traffic droppedorganic-traffic-dropped | Clicks from Google to this page in the last 28 days fell by half or more against the 28 days before (pages with at least 10 clicks before). | Compare its rankings and the search results for its main queries; check for content, title or indexability changes in this audit. |