Accessibility, Best Practices and SEO scores explained
How Lighthouse scores accessibility, best practices and SEO: the weights, what each check looks for, which failures cost most and what a perfect score misses.
In this guide
How the three scores are made
Each Lighthouse category is a list of checks, which Lighthouse calls audits. Every audit has a weight inside its category. In these three categories an audit nearly always scores exactly 0 or 1. The category score is the weight of the audits that passed, divided by the weight of the audits that apply to the page, times 100. Three rules follow from that.
- There is no partial credit. If half of the buttons on a page have names and half do not, the buttons audit fails in full. Lighthouse's own scoring page says the same about accessibility.
- A check that does not apply is left out. A page with no video has no use for the captions check, so that check leaves both the top and the bottom of the fraction. When few checks apply, each failure costs more.
- Weight 0 means shown, not scored. The report lists these for your information, or as manual checks that only a person can do.
Older sources disagree with the numbers on this page. Lighthouse's own scoring page still says that every audit in best practices and SEO has the same weight, and it gives accessibility weights "for v7". The configuration of Lighthouse 13.5, the version I installed and tested, matches neither statement. It gives some audits far more weight than others. The configuration is what actually runs, so the numbers below come from it, and the next section checks them against real reports. PageSpeed Insights may run a different version, so its weights can differ a little. Every Lighthouse report prints its version number.
A check by hand: three test pages
To see the average at work, I wrote three tiny pages, ran Lighthouse 13.5 on each in mobile mode, and worked out the scores from the weights. Most checks did not apply to such small pages, so the weight that applied is far below the full total.
| Test page | Category | Failed (weight) | Applied | Passed | Score |
|---|---|---|---|---|---|
An image with no alt attribute, and an SVG with role="img" and no text | Accessibility | Image has no alt (10), SVG image has no text (1) | 15 audits, weight 94 | 83 of 94 = 0.883 | 88 |
No <title>, and a heading that jumps from H1 to H3 | Accessibility | No title (7), heading order (3) | 8 audits, weight 54 | 44 of 54 = 0.815 | 81 |
| The same page | SEO | No title (1), no meta description (1) | 7 audits, weight 10.04 | 8.04 of 10.04 = 0.801 | 80 |
Links that use javascript:void(0) or have no href | SEO | Links not crawlable (1) | 7 audits, weight 10.04 | 9.04 of 10.04 = 0.900 | 90 |
The reported scores matched my arithmetic in all four cases. One missing alt and one SVG without text cost 12 points on a page where only 94 units of weight applied. On a page where all 58 accessibility checks applied, the same two failures would cost under 3 points (11 of 416). So compare a score with the same page last month, not with a different page.
The SEO runs also show the third rule. The checks for robots.txt, the canonical link and image alt text did not apply, because the test server had no robots.txt and the pages had no canonical link and no images. A page with no canonical link is not marked down.
Accessibility
The category has 58 scored audits with a total weight of 416. They sit in eight groups. The group called "Best practices" here is Lighthouse's label for a few accessibility checks. It is not the separate Best Practices category further down.
| Group | Audits | Share of weight | What it checks |
|---|---|---|---|
| ARIA | 22 | 42% | That role and aria-* attributes are valid, spelled right and in the right place, and that custom widgets have names |
| Names and labels | 12 | 23% | That images, buttons, links, form fields, frames and the page title have a name a screen reader can speak |
| Tables and lists | 6 | 10% | That lists and tables are built from the right elements |
| Best practices | 7 | 8% | Zoom not blocked, no automatic refresh, touch target size, a main landmark |
| Navigation | 4 | 6% | A way to skip repeated blocks, heading order, no positive tabindex, unique access keys |
| Language | 4 | 6% | A valid lang on the page and on parts in another language |
| Contrast | 2 | 3% | Text contrast, and links that differ from the text around them by more than color |
| Audio and video | 1 | 2% | Captions on video |
The weights come in four steps.
| Weight | Audits | What is in the step |
|---|---|---|
| 10 | 18 | Images with no alt. Buttons, input buttons, image inputs, select menus and form fields with no name. Video with no captions. Zoom blocked in the viewport tag. Automatic refresh by meta tag. Nine ARIA checks, such as invalid roles, misspelled attributes and aria-hidden on the body |
| 7 | 31 | Links with no name. No <title>. No lang on <html>. Low-contrast text. Small touch targets. No way to skip repeated content. Lists built wrongly. ARIA widgets with no name |
| 3 | 5 | Heading order. A field with more than one label. A skip link that cannot be focused. No main landmark. A lang and xml:lang that disagree |
| 1 | 4 | Deprecated ARIA roles. Wrong autocomplete values. Conflicting presentation roles. An SVG with role="img" and no text |
Eighteen more audits have weight 0. Ten are manual checks, such as tab order, focus traps and custom controls, which Lighthouse asks you to review yourself. The rest run but do not change the score, for example empty headings and redundant alt text.
Fix these first
| What the report says | Weight | The fix |
|---|---|---|
Image elements do not have [alt] attributes | 10 | Describe what the image shows or does. Use alt="" when it is only decoration. See image SEO and speed |
| Buttons do not have an accessible name | 10 | Put text inside the button, or add aria-label to an icon-only one |
| Form elements do not have associated labels | 10 | Add a label tied to the field with for. A placeholder is not a label |
user-scalable="no" is used, or maximum-scale is less than 5 | 10 | Remove those limits from the viewport tag, so people can zoom |
| Links do not have a discernible name | 7 | Give the link text, or alt text when the link is an image |
| Background and foreground colors do not have a sufficient contrast ratio | 7 | WCAG level AA asks for at least 4.5 to 1 for normal text and 3 to 1 for large text |
Document doesn't have a <title> | 7 | Add a short title that fits the page |
<html> element does not have a [lang] attribute | 7 | Add lang="en", or the language of the page |
| Heading elements are not in a sequentially-descending order | 3 | Do not skip levels: H1, then H2, then H3 |
What real sites look like
The 2025 Web Almanac reports on the HTTP Archive's monthly crawl of 17 million sites, which uses Lighthouse. The median accessibility score was 85, up from 83 in 2019. Only 31% of mobile sites met the minimum text contrast. Of mobile sites, 19% limited zooming. About a quarter of form inputs had no accessible name at all: 24.65% on desktop and 24.93% on mobile. Those problems match the contrast, viewport and label checks above, which is why those three are worth fixing early.
Best practices
The category has 13 scored audits with a total weight of 27.
| Group | What it flags | Weight |
|---|---|---|
| Trust and safety | The page does not use HTTPS, including mixed content | 5 |
| Trust and safety | HTTP traffic is not redirected to HTTPS | 1 |
| Trust and safety | The page asks for the location permission as it loads | 1 |
| Trust and safety | The page asks for the notification permission as it loads | 1 |
| User experience | Inputs block pasting, which also blocks password managers | 3 |
| User experience | Images are shown at the wrong aspect ratio | 1 |
| User experience | Images have too low a resolution for the space they fill | 1 |
| Browser compatibility | The page has no doctype, so the browser uses quirks mode | 1 |
| Browser compatibility | The character set is missing or comes too late | 1 |
| General | The page uses deprecated APIs | 5 |
| General | The page uses third-party cookies | 5 |
| General | Errors were logged to the browser console | 1 |
| General | Issues were logged in the Issues panel of Chrome DevTools | 1 |
- Three checks make up more than half the score. HTTPS, deprecated APIs and third-party cookies weigh 5 each, which is 15 of the 27 units.
- Security headers are shown, not scored. The checks for a strong content security policy, HSTS, the cross-origin opener policy, clickjacking protection and Trusted Types all have weight 0. A site with none of these headers can still score 100. They are still worth a look: see HTTPS and security headers. Lists of Baseline features, detected JavaScript libraries and missing source maps are unscored too.
- The lists name the culprit. The deprecated API check gives the file and line where each API was used. The third-party cookie check gives each cookie's name and the address it came from. When that address belongs to another company, read third-party scripts.
- The image checks are the reverse of an oversize warning. "Low resolution" means the file is too small for the space, while the speed advice is to avoid files that are too large. Responsive images cover both, and image width and height covers the aspect ratio.
SEO
The category has 10 scored audits with a total weight of 13.04. The check for a page blocked from indexing carries 4.04 of that, about 31%. Each of the other nine carries about 7.7%.
| Check | Share | What makes it fail |
|---|---|---|
| Page is blocked from indexing | 31% | noindex or none in a robots meta tag or an X-Robots-Tag header, or a robots.txt rule that disallows the page |
| Page has unsuccessful HTTP status code | 7.7% | The page itself answered with a status from 400 to 599 |
Document doesn't have a <title> | 7.7% | No title element, or an empty one |
| Document does not have a meta description | 7.7% | No description tag, or an empty one |
| Links do not have descriptive text | 7.7% | Link text from a list of vague phrases |
| Links are not crawlable | 7.7% | Anchors that rely on script instead of a real href |
| robots.txt is not valid | 7.7% | Syntax errors in the file, or a server error when it is requested |
Image elements do not have [alt] attributes | 7.7% | The same check as in accessibility |
| Document doesn't have a valid hreflang | 7.7% | An hreflang link with a language code Lighthouse does not know, or an href that is not a full address |
| Document does not have a valid rel=canonical | 7.7% | A canonical link that is relative, invalid, conflicting or pointing at the wrong place |
- The indexing check fails only when everything is blocked. It looks in three places: the robots meta tag, the
X-Robots-Tagheader and robots.txt. It tests a generic crawler, Googlebot, Bingbot, DuckDuckBot and the Internet Archive's crawler. It fails only if all of them are blocked. If at least one is allowed, it passes and lists the blocked ones as a warning. See robots.txt, noindex and the tags that control search. - A passing links check is not proof. In my test it flagged a link with
href="javascript:void(0)"and a click handler, and anatag with a click handler and nohref. It did not flag a link withhref="#"or an emptyhref, and it cannot see aspanthat acts like a link. See internal linking. - Vague link text is a short list. English entries include "click here", "here", "learn more", "more", "read more" and "see more". Other languages have their own lists, Spanish among them.
- Canonical and robots.txt can be not applicable. With no canonical link, or a robots.txt that answers 404, the check is left out. A robots.txt that answers with a server error fails. See canonical tags and hreflang for English and Spanish.
- Structured data has weight 0. Lighthouse lists it as a manual check. See structured data basics.
- Title and description checks are only about presence. They do not judge wording. See titles, descriptions and headings.
Lighthouse says in its own description of the category that many factors it does not score may affect search ranking, including performance on Core Web Vitals. Older articles mention font size and tap target checks in the SEO category. The 13.5 SEO category has neither. Touch target size now sits in accessibility as a check with weight 7.
What a good score leaves out
| Score | What it cannot show | What to do next |
|---|---|---|
| Accessibility 100 | Lighthouse says automatic detection finds only a subset of issues. Whether alt text is accurate, whether headings and landmarks are marked up correctly, whether focus order makes sense and whether video has transcripts all need a person | Put the mouse aside and tab through the page. Zoom in. Read it with a screen reader. See the web.dev guide in the sources |
| Best practices 100 | It is not a security audit. Five header checks are unscored | Test headers on their own with curl or a header checker |
| SEO 100 | It does not know whether Google has indexed the page or how it ranks | Use Search Console for indexing, and read page speed and Google rankings |
The Web Almanac adds a warning of its own. It cites a comparison in which every popular automated accessibility tool found less than half of accessibility errors, and it treats a Lighthouse score as a starting point, not a goal. It also notes that when a metric becomes a target, it stops being a reliable metric.
Fix in this order
- Accessibility: names first (images, buttons, links, form fields), then zoom,
langand title, then contrast, then ARIA errors. Prefer plain HTML elements to ARIA where one exists. - Best practices: HTTPS everywhere with a redirect, then console errors and Issues panel entries, then the script behind a deprecated API or a third-party cookie.
- SEO: make sure the page is not blocked, check its status code, then the title and description, then the links, then canonical and hreflang if you use them.
- Last: test by hand what the scores cannot see.
Mistakes to avoid
- Calling a page accessible because the score is high. The check for alt text sees that an attribute exists, not whether it helps. The Web Almanac found that about 8.5% of alt texts end in a file extension such as .jpg, and that about half of images have empty alt text or text under 10 characters.
- Comparing two pages by score. Different pages have different checks that apply.
- Treating unscored items as optional. Security headers and manual accessibility checks matter even at weight 0.
- Chasing 100 in every category. Fix what helps real visitors first, as the weights suggest.
- Trusting an old tutorial. Weights and checks change between Lighthouse versions.
Check your own page
Run the free audit and read the SEO findings, then open the same page in PageSpeed Insights and note its accessibility, best practices and SEO scores. For each failed check, find it in the tables above to see its weight, and fix the heaviest one first. Then tab through the page with the keyboard. See PageSpeed Insights explained for how to read the report.
Sources
- The default configuration of Lighthouse 13.5: categories, audit weights and groups. The audit files in the same repository, such as the SEO audits, say what each check tests.
- Lighthouse's scoring page: pass or fail audits and no partial credit; it still states equal weights for best practices and SEO.
- Accessibility chapter, Web Almanac 2025: the median score, contrast, zoom, input names, alt text and the limits of automated tools.
- Manual accessibility testing on web.dev: what automated tools can and cannot check, and the keyboard, visual and content checks to do by hand.
Start here
Free website audit
Live Google data for any public page: mobile and desktop.
Mobile + desktop · Lighthouse lab test · Real-user Chrome data when Google has it
Rather have this done for you? Speed optimization · Book a call