How the SEO score works
What we check, how findings are weighted and prioritised, and what the score can and cannot tell you.
What we check
Each audit runs 83 checks in 8 categories. Every check has a weight from 1 to 10 that reflects how much it matters for search visibility.
| Category | Checks | Share of the score |
|---|---|---|
| On-page SEO Titles, descriptions, headings, links and images | 13 | 24% |
| Content Depth, keywords and readability | 8 | 7% |
| Technical SEO Crawling, indexing, redirects and site structure | 15 | 23% |
| Speed Server response, page weight and loading | 14 | 14% |
| Security HTTPS, certificates and security headers | 9 | 10% |
| Social & rich results Open Graph, X cards and structured data | 5 | 4% |
| AI search readiness Access and structure for AI search engines | 6 | 7% |
| Accessibility Labels, names, landmarks and other WCAG basics | 13 | 11% |
How the score is calculated
- A passed check earns its full weight, a warning earns half and an error earns nothing.
- The score is the weighted percentage of all scored checks, from 0 to 100. Category scores use the same formula within each category.
- Informational checks (for example an optional llms.txt file) never lower the score.
- Grades: A from 90, B from 80, C from 65, D from 50, F below 50.
Critical blockers come first
Some problems stop a page from appearing in search at all: an error status code, a noindex directive, or robots.txt blocking the page. These are shown as critical blockers at the top of the report, whatever the overall score. A page can score 90 and still be invisible in search.
How priorities are set
The Decision Centre orders the work using four signals for every error and warning:
- Impact – critical, high, medium or low, based on the check weight and whether it affects indexing.
- Difficulty – easy, medium or hard, an estimate of the effort to fix.
- Confidence – high for direct measurements (a missing title, a noindex tag), medium for heuristics (readability, content depth) and sampled network tests.
- Priority score – combines severity, weight, impact and difficulty. Quick wins are easy fixes with medium or higher impact.
Missing data is not a failure
If we cannot measure something – Google has no real-user speed data yet, or a test times out – the check is reported as unavailable or informational instead of counting against you. Links that answer with 401, 403 or 429 are not reported as broken.
Retesting and history
Run the audit again after making changes. Reports show what was fixed, what is new and what is unchanged since the previous audit, and signed-in users can track every task in the Fix Centre.
Site-wide crawl checks
The site audit (crawler) follows internal links, canonical and hreflang targets and XML sitemaps, then checks 156 issue types in 19 groups. Each affected page loses points by severity: errors 30, warnings 10, notices 2. The site health score is the average page score.
Indexability & status codes (8)
| Issue | Severity |
|---|---|
| Broken pages (4xx) Internal links point to pages that do not exist. | Error |
| Server errors (5xx) and failures These URLs failed to load or returned a server error. Search engines drop pages that keep failing. | Error |
| Soft 404 pages These pages return 200 OK but look like error pages (their title, heading or text says “not found”). Google treats them as soft 404s and wastes crawl budget on them. | Warning |
| Noindex pages These pages ask search engines not to index them. Make sure that is intentional. | Notice |
| Page-level nofollow A robots meta tag or X-Robots-Tag header tells search engines not to follow any link on these pages, so they pass no internal authority. | Warning |
| Noindex pages with many internal links Your own navigation sends visitors and crawlers to pages you have asked search engines not to index, wasting internal link equity. | Warning |
| Noindex combined with a canonical to another URL These pages are noindex and also canonicalise to a different URL. Google may pass the noindex signal to the canonical target. The two directives conflict. | Warning |
| Blocked by robots.txt Internal links point to URLs that robots.txt blocks, so search engines cannot crawl them. | Notice |
Redirects (8)
| Issue | Severity |
|---|---|
| Internal links to redirects Internal links point to URLs that redirect, adding a delay for visitors and crawlers. | Warning |
| Redirect chains These URLs go through two or more redirects before reaching a page. Each hop slows loading, and long chains can stop crawlers before the final URL. | Warning |
| Redirect loops These URLs redirect in a circle and never reach a page. Visitors see an error and search engines give up. | Error |
| Redirects to broken pages These redirects lead to a URL that returns an error, so the redirect sends visitors to a dead end. | Error |
| Temporary redirects (302/307) Temporary redirects tell search engines the move is not permanent, so the old URL may stay indexed. | Notice |
| HTTPS URLs redirecting to HTTP Secure URLs redirect to insecure http:// addresses. Browsers warn visitors and ranking signals are split. | Error |
| Internal URLs redirecting to other domains These internal URLs send visitors to another website. Check that it is intentional (for example a moved section). | Notice |
| Meta refresh redirects These pages use a meta refresh tag. It is slower than a server redirect and handled less reliably by search engines. | Warning |
Canonical tags (11)
| Issue | Severity |
|---|---|
| Canonicalised to another URL These pages point their canonical at a different URL, so that URL will usually be indexed instead. | Notice |
| Missing canonical tag Indexable pages without a canonical tag leave search engines to guess which URL variant (parameters, http/https, trailing slash) to index. | Warning |
| Multiple different canonical tags These pages declare more than one canonical URL. Google may ignore all of them. | Error |
| Canonical points to an error page The canonical target returns an error, so search engines cannot index the preferred version and may ignore the canonical. | Error |
| Canonical points to a redirect The canonical target redirects somewhere else, which sends search engines mixed signals. | Warning |
| Canonical points to a noindex page The preferred URL asks not to be indexed, so neither page may appear in search results. | Error |
| Canonical chains The canonical target itself canonicalises to another URL. Search engines may not follow the chain. | Warning |
| Canonical loops Two pages name each other as canonical. Search engines cannot tell which one to index. | Error |
| Canonical points to another domain These pages canonicalise to a different website, which asks search engines to index that site instead. | Notice |
| Relative canonical URLs The canonical uses a relative path. It works, but absolute URLs avoid mistakes across environments and protocol variants. | Notice |
| Canonical uses http:// on an HTTPS site Secure pages name the insecure http:// version as canonical, asking search engines to index the insecure copy. | Error |
Hreflang & international (8)
| Issue | Severity |
|---|---|
| Invalid hreflang codes These hreflang values are not valid ISO language (and optional region) codes, so search engines ignore them. | Error |
| Missing hreflang return links Page A lists page B as an alternate, but page B does not list page A back. Google ignores hreflang pairs without return links. | Warning |
| Hreflang points to error or redirecting URLs Alternate URLs must return 200. Targets that redirect or fail are ignored. | Error |
| Hreflang points to non-canonical or noindex pages Alternates should be the canonical, indexable version of each page. Otherwise the annotations are ignored. | Warning |
| Hreflang without a self-reference Pages using hreflang should include themselves in the list of alternates. | Notice |
| Hreflang without x-default An x-default alternate tells search engines which page to show visitors whose language is not listed. | Notice |
| Conflicting hreflang entries The same language code points to different URLs on one page, so search engines cannot tell which is correct. | Warning |
| HTML lang differs from the page’s own hreflang The lang attribute on <html> does not match the language this page declares for itself in hreflang. | Notice |
XML sitemaps (11)
| Issue | Severity |
|---|---|
| No XML sitemap found No sitemap was found in robots.txt or at /sitemap.xml. Sitemaps help search engines find new and deep pages. | Warning |
| Sitemap not listed in robots.txt A Sitemap: line in robots.txt lets every search engine find your sitemap, not only the ones you submit it to. | Notice |
| Redirecting URLs in the sitemap Sitemaps should list only final URLs. Redirects waste crawl budget and make the sitemap less trustworthy. | Warning |
| Broken URLs in the sitemap (4xx) The sitemap lists pages that do not exist. | Error |
| Failing URLs in the sitemap (5xx) Sitemap URLs returned server errors or did not respond. | Error |
| Noindex pages in the sitemap The sitemap asks search engines to index pages that say noindex. The signals conflict. | Warning |
| Canonicalised pages in the sitemap The sitemap lists URLs whose canonical points elsewhere. Sitemaps should contain only canonical URLs. | Warning |
| Sitemap URLs blocked by robots.txt URLs in the sitemap are disallowed in robots.txt, so search engines are told to index pages they may not crawl. | Warning |
| Indexable pages missing from the sitemap These indexable pages were found by following links but are not in the XML sitemap. | Notice |
| Orphan pages (in sitemap, no internal links) These pages are listed in an XML sitemap, but no crawled internal page links to them, so they get little internal authority. | Warning |
| http:// URLs in the sitemap of an HTTPS site The sitemap lists insecure URLs that redirect to HTTPS. | Warning |
Internal & external links (13)
| Issue | Severity |
|---|---|
| Internal links to canonicalised pages Internal links point to URLs that canonicalise elsewhere, sending crawlers to non-preferred versions. | Warning |
| Nofollow internal links Internal links marked nofollow stop internal authority flowing to your own pages. | Notice |
| Pages with only one internal link These pages are linked from just one other page. Weakly linked pages are crawled less often and rank lower. | Notice |
| Pages without outgoing internal links These pages do not link to any other page on your site. Visitors and crawlers reach a dead end. | Warning |
| Pages with too many links Pages with hundreds of links dilute the value of each link and can look spammy. | Notice |
| Broken external links Links to other websites return errors. They frustrate visitors and signal neglected content. | Warning |
| Links without anchor text Links with no text, alt text or aria-label give users and search engines no clue about the destination. | Warning |
| Generic anchor text Links such as “click here” or “read more” waste a chance to describe the linked page. | Notice |
| javascript: links Links using javascript: instead of a real URL cannot be followed by crawlers. | Notice |
| Internal links to http:// URLs An HTTPS site links to its own pages over insecure http://, causing extra redirects and mixed signals. | Warning |
| Links to development or staging hosts Pages link to localhost, staging or test domains that visitors and search engines cannot reach. | Error |
| Internal links with tracking parameters Internal links carry utm_ parameters. They create duplicate URLs and overwrite the real traffic source in analytics. | Notice |
| Deep pages (4+ clicks from the homepage) Pages buried deep in the structure get crawled less and receive less internal authority. | Notice |
Titles, descriptions & headings (17)
| Issue | Severity |
|---|---|
| Missing title tag Pages without a title are hard to rank and look broken in search results. | Error |
| Duplicate titles Several pages share the same title, so search engines struggle to tell them apart. | Warning |
| Title too long (over 60 characters) Long titles get truncated in results. | Notice |
| Title too short (under 25 characters) Short titles waste space that could attract clicks. | Notice |
| Multiple title tags These pages have more than one <title> tag. Search engines use one and ignore the rest. | Warning |
| Missing meta description Google will generate a snippet from page text instead, which is often less persuasive. | Warning |
| Duplicate meta descriptions Several pages share the same meta description. | Warning |
| Meta description too long (over 160 characters) Long descriptions are cut off in search results. | Notice |
| Meta description too short (under 70 characters) Very short descriptions miss the chance to persuade searchers to click. | Notice |
| Multiple meta descriptions More than one meta description was found on these pages. | Warning |
| Missing H1 heading Pages without an H1 lack a clear main heading. | Warning |
| Empty H1 heading An H1 exists but contains no text, often because it wraps an image without alt text. | Warning |
| Multiple H1 headings More than one H1 can blur the main topic. | Notice |
| Duplicate H1 headings Several pages use the same H1, which suggests overlapping topics or template headings. | Notice |
| H1 too long (over 70 characters) Very long main headings are hard to scan. | Notice |
| Skipped heading levels Heading levels jump (for example H2 to H4). Outlines are harder to follow, especially for screen-reader users. | Notice |
| Long pages without subheadings Pages with more than 500 words but no H2 are hard to scan and give search engines less structure. | Notice |
Content quality & duplication (6)
| Issue | Severity |
|---|---|
| Thin content (under 200 words) Pages with very little text rarely rank well and give AI answers little to quote. | Warning |
| Duplicate content These indexable pages have identical body text, so search engines pick one and may ignore the rest. | Warning |
| Near-duplicate content These pages are almost identical to another page (over about 95% similar text). | Notice |
| Placeholder text (lorem ipsum) Placeholder text was published on these pages. | Error |
| Low text-to-HTML ratio Under 10% of these pages’ HTML is visible text, which usually means heavy markup or very little content. | Notice |
| Outdated copyright year The footer copyright year is more than a year old, which can make the site look unmaintained. | Notice |
Images (6)
| Issue | Severity |
|---|---|
| Images missing alt text Images without alt text are invisible to screen readers and lose out in image search. | Notice |
| Broken images These images fail to load. Visitors see empty boxes and image search cannot index them. | Error |
| Large images (over 200 KB) Heavy images slow pages down, especially on mobile connections, and hurt Largest Contentful Paint. | Warning |
| Images without width and height Images without dimensions cause layout shifts (CLS) as they load. | Notice |
| No modern image formats These pages serve only JPEG/PNG/GIF images. WebP and AVIF are typically 25–50% smaller. | Notice |
| Many images without lazy loading Pages with more than 10 images load them all up front. | Notice |
Performance (9)
| Issue | Severity |
|---|---|
| Slow server response (over 1.5 s) Slow responses hurt user experience and Core Web Vitals. | Warning |
| Moderately slow response (0.6–1.5 s) These pages start responding later than the 600 ms that keeps Largest Contentful Paint comfortable. | Notice |
| Large HTML (over 500 KB) Heavy HTML is slow to download and parse. | Notice |
| HTML served without compression The HTML is sent uncompressed. Gzip or Brotli typically cuts text size by 70–80%. | Warning |
| Render-blocking scripts Several scripts in <head> block the first paint until they download and run. | Notice |
| Too many JavaScript files Pages load more than 25 script files. Each one adds download and execution time. | Notice |
| Excessive DOM size (over 1,500 elements) Large DOM trees slow down rendering and interaction (INP). | Notice |
| Heavy inline JavaScript More than 100 KB of inline script is downloaded again with every page and cannot be cached. | Notice |
| Many third-party script hosts Scripts from more than 10 outside domains add connections, delay and privacy risk. | Notice |
Security (11)
| Issue | Severity |
|---|---|
| Website not served over HTTPS The site loads over plain http://. Browsers mark every page “Not secure” and HTTPS is a ranking signal. | Error |
| Pages served over insecure HTTP These pages of an HTTPS site load over plain http:// without redirecting. Browsers mark them “Not secure”. | Error |
| Mixed content HTTPS pages load resources over insecure http://. Browsers block or warn about them. | Error |
| Insecure forms Forms submit to http:// addresses, or password fields appear on insecure pages, exposing what visitors type. | Error |
| HSTS header missing Without Strict-Transport-Security, browsers may still try insecure HTTP first. | Notice |
| Content-Security-Policy missing A Content-Security-Policy limits where scripts can load from and reduces the damage of cross-site scripting. | Notice |
| No clickjacking protection Neither X-Frame-Options nor a CSP frame-ancestors directive is set, so other sites can frame your pages. | Notice |
| X-Content-Type-Options missing Without nosniff, browsers may guess file types and run files as scripts. | Notice |
| Server software versions exposed Response headers reveal exact software versions, which helps attackers find known vulnerabilities. | Notice |
| target="_blank" links without rel="noopener" External links that open a new tab without rel="noopener" let the other site control your tab in older browsers. | Notice |
| Plain-text email addresses Email addresses in page text are harvested by spam bots. | Notice |
Structured data (5)
| Issue | Severity |
|---|---|
| Invalid structured data JSON-LD blocks on these pages cannot be parsed, so search engines ignore them. | Error |
| Structured data missing required properties Schema types are present but miss properties needed for rich results. | Warning |
| Pages without structured data No schema.org markup was found. Structured data helps search engines and AI understand the page and can unlock rich results. | Notice |
| No breadcrumb markup on deeper pages Pages two or more levels deep have no BreadcrumbList. Breadcrumbs show your site structure in results. | Notice |
| Homepage has no Organization markup Organization (or LocalBusiness/Person) markup on the homepage helps search engines and AI assistants identify your brand, logo and profiles. | Notice |
Social sharing (4)
| Issue | Severity |
|---|---|
| Missing Open Graph tags Without og:title and og:image, shares on Facebook, LinkedIn, WhatsApp and Slack show a plain or random preview. | Notice |
| Open Graph image missing Pages have Open Graph tags but no og:image, so shares appear without a picture. | Notice |
| og:url differs from the canonical og:url should match the canonical URL so shares are counted for the right page. | Notice |
| Missing X (Twitter) card Without twitter:card, X shows a small preview by default. | Notice |
Mobile & HTML basics (6)
| Issue | Severity |
|---|---|
| Missing mobile viewport Without a viewport meta tag, phones show a zoomed-out desktop layout. Google indexes the mobile version. | Error |
| Zoom disabled on mobile The viewport stops visitors from zooming, which is an accessibility failure. | Warning |
| Missing language attribute The <html> tag has no lang attribute, so screen readers and search engines must guess the language. | Warning |
| Missing HTML5 doctype Without <!DOCTYPE html>, browsers may render in quirks mode. | Notice |
| Missing character encoding No character encoding is declared, so special characters may display incorrectly. | Notice |
| Deprecated HTML tags Obsolete tags such as <font>, <center> or <marquee> were found. | Notice |
Accessibility (10)
| Issue | Severity |
|---|---|
| Form fields without labels Inputs without a label (or aria-label) cannot be identified by screen-reader users. | Warning |
| Buttons without an accessible name Icon-only buttons with no text or aria-label are announced as just “button”. | Warning |
| Iframes without a title Embedded frames need a title so screen-reader users know what they contain. | Notice |
| Duplicate element IDs IDs must be unique. Duplicates break label associations, skip links and ARIA references. | Notice |
| Positive tabindex values tabindex values above 0 change the natural keyboard order and confuse keyboard users. | Notice |
| No main landmark Pages without a <main> element (or role="main") are harder to navigate with screen readers. | Notice |
| Data tables without header cells Tables without <th> headers are read cell by cell with no context. | Notice |
| Invalid ARIA roles Unknown role values are ignored by assistive technology. | Notice |
| Focusable elements hidden from assistive technology aria-hidden="true" is set on links, buttons or fields that keyboard users can still reach, creating “ghost” focus stops. | Warning |
| Alt text that is just a file name Alt text such as “IMG_1234.jpg” tells visitors nothing about the image. | Notice |
AI search readiness (3)
| Issue | Severity |
|---|---|
| AI search crawlers blocked robots.txt blocks crawlers that power AI search answers and citations, which can hide the site from ChatGPT search, Perplexity and similar engines. | Warning |
| Snippets blocked nosnippet or max-snippet:0 stops search engines quoting these pages, including in AI Overviews. | Notice |
| Content depends on JavaScript The raw HTML has an empty app container and little text. Most AI crawlers do not run JavaScript, so they see an empty page. | Warning |
URL structure (9)
| Issue | Severity |
|---|---|
| Long URLs (over 115 characters) Long URLs are harder to share and are truncated in results. | Notice |
| Uppercase letters in URLs URLs are case-sensitive, so uppercase letters can create duplicate versions of a page. | Notice |
| Underscores in URLs Google treats hyphens as word separators but not underscores. | Notice |
| URLs with many parameters URLs with more than two query parameters often create near-duplicate pages and waste crawl budget. | Notice |
| Non-ASCII characters in URLs Unencoded special characters can break when URLs are shared or logged. | Notice |
| Double slashes in URL paths Paths with “//” are usually template mistakes and create duplicate URLs. | Notice |
| Duplicate URL variants The same page is reachable at URLs that differ only in letter case or a trailing slash, and none of them canonicalises to the other. | Warning |
| Session IDs in URLs Session identifiers in URLs create unlimited duplicate URLs. | Warning |
| Pagination links to broken pages rel="next" or rel="prev" points to a URL that returns an error. | Warning |
JavaScript rendering (6)
| Issue | Severity |
|---|---|
| JavaScript rendering failed Chrome could not render these pages, so rendered-DOM checks are incomplete. | Warning |
| Title changes after JavaScript The browser-rendered title differs from the title in the original HTML. Search engines may see different metadata depending on rendering. | Warning |
| Canonical changes after JavaScript JavaScript changes the canonical URL after load, which can create conflicting indexing signals. | Error |
| Robots directives change after JavaScript Robots directives change after JavaScript rendering. | Error |
| Important content depends on JavaScript Much of the visible text is missing from the initial HTML and only appears after JavaScript runs. | Warning |
| Internal links depend on JavaScript Several internal links only appear after JavaScript executes. | Warning |
Search Console insights (5)
| Issue | Severity |
|---|---|
| Pages earning clicks that are not indexable Search Console shows clicks to these URLs, but the crawl found them noindex, canonicalised elsewhere, redirecting or broken. That traffic is at risk. | Error |
| Pages with search impressions that the crawl could not reach Search Console reports impressions for these URLs, but no crawled page links to them, so they get no internal authority. | Warning |
| Indexable pages with no search impressions These indexable pages had no impressions in Google during the last 28 days. They may not be indexed, or they target no real searches. | Notice |
| Page-one rankings with a low click-through rate These pages rank on page one with plenty of impressions but get far fewer clicks than expected for their position. | Notice |
| Striking-distance pages with thin content These pages rank in positions 8–20 with real impressions but have under 400 words. Expanding them is often the quickest ranking win. | Notice |
Versions
Every report stores the methodology version it was produced with (currently version 2), so a score change caused by a change in our rules can be told apart from a change on your website.
Limits
The audit tests what can be measured from outside: the HTML, HTTP headers, robots.txt, sitemaps, links and assets of the page. It does not see rankings, traffic or backlinks, and a high score does not guarantee rankings or AI citations. We never invent search volumes, traffic or authority scores.