The checklist
This is the whole thing. 54 checks in four categories. Every report is scored against exactly this list and nothing else — no model, no vibes, no changing goalposts.
Version 1.0.0. Each report records the version it was scored with, so an old report always explains itself.
How the maths works
Each check returns a score between 0 and 1 from a measured value. A category score is the weighted mean of its checks × 100. The overall score is the weighted mean of the four categories: Usability 35%, Copy 20%, Trust 20%, Conversion 25%.
A check is shown as Pass at 0.85 or above, Needs work from 0.5, and Fail below that.
Usability 35% of the overall score
Can people actually use the page — on a phone, with a keyboard, with a screen reader, and without waiting?
| Weight | Check |
|---|---|
| 5 |
Responsive viewport meta tag
viewport-meta
A <meta name="viewport" content="width=device-width..."> tag is present and does not block zooming.
Fix: Add <meta name="viewport" content="width=device-width, initial-scale=1"> to <head>. Never set user-scalable=no or maximum-scale=1.
|
| 5 |
No horizontal scrolling on mobile
mobile-no-overflow
document.scrollWidth is not wider than window.innerWidth at 390×844.
Fix: Find the element wider than the screen (usually a fixed width, a wide table, or an unwrapped <pre>) and give it max-width:100% or overflow-x:auto.
|
| 4 |
Tap targets are at least 44×44px on mobile
tap-targets
Share of visible links/buttons/inputs whose rendered box is at least 44px on its smaller side.
Fix: Give small links and icon buttons padding until they are 44px tall and wide, and leave 8px of space between neighbouring targets.
|
| 4 |
No text under 12px on mobile
mobile-font-size
Count of visible text elements with a computed font-size below 12px at 390×844.
Fix: Set a base font-size of 16px and keep small print at 12px or larger. Legal text is still text people have to read.
|
| 6 |
No critical accessibility violations
axe-critical
axe-core nodes with impact "critical" (WCAG 2 A/AA rule set).
Fix: Fix critical axe violations first — they usually block screen-reader or keyboard users entirely.
|
| 4 |
No serious accessibility violations
axe-serious
axe-core nodes with impact "serious".
Fix: Serious violations are usually contrast, missing names, or landmark problems — each one is a small, mechanical fix.
|
| 2 |
Few moderate accessibility violations
axe-moderate
axe-core nodes with impact "moderate" or "minor".
Fix: Work through the moderate list after the critical and serious ones.
|
| 4 |
Images have alt text
images-alt
Share of <img> elements with an alt attribute (empty alt counts as intentional for decorative images).
Fix: Describe what the image shows, or use alt="" if it is purely decorative. Never leave the attribute off.
|
| 4 |
Form inputs have labels
form-labels
Share of visible inputs/selects/textareas with a <label>, aria-label or aria-labelledby.
Fix: Wire every field to a visible <label for="…">. Placeholder text is not a label — it disappears the moment someone types.
|
| 4 |
Buttons have an accessible name
button-names
Buttons and role="button" elements with no text, aria-label, title or image alt.
Fix: Give every icon-only button an aria-label describing the action ("Close menu", not "button").
|
| 3 |
Heading levels do not skip
heading-order
Number of places where the heading level jumps by more than one (h2 → h4).
Fix: Use headings for structure, not size. Style them with CSS instead of skipping levels.
|
| 3 |
Exactly one H1
single-h1
Count of <h1> elements in the document.
Fix: One page, one H1 — it is the page's name. Demote the extras to H2.
|
| 2 |
HTML lang attribute set
lang-attribute
<html lang="…"> is present and non-empty.
Fix: Add lang="en" (or your language) to <html> so screen readers pick the right voice.
|
| 3 |
No JavaScript errors in the console
console-errors
console.error() calls plus uncaught exceptions during load and scroll.
Fix: Open DevTools, reproduce, and fix. Console errors mean something on the page did not run.
|
| 1 |
Few console warnings
console-warnings
console.warn() calls during load and scroll.
Fix: Warnings are usually deprecations or misconfigured third-party scripts. Clear them so real errors stay visible.
|
| 4 |
No broken or failing requests
broken-requests
Sub-resource requests that failed outright or returned 4xx/5xx.
Fix: Every 404 is a missing image, font or script. Fix the URL or remove the reference.
|
| 5 |
Largest Contentful Paint under 2.5s
lcp
LCP from PerformanceObserver on the desktop run.
Fix: Compress and size the hero image, preload the LCP element, and stop render-blocking scripts in <head>.
|
| 4 |
Cumulative Layout Shift under 0.1
cls
CLS accumulated during load and the scripted scroll.
Fix: Give images and ad slots explicit width/height, and reserve space for anything injected after load.
|
| 3 |
Time to First Byte under 800ms
ttfb
responseStart − requestStart from the Navigation Timing API.
Fix: Cache pages at the edge, cut slow database queries, and turn on compression.
|
| 3 |
Page finishes loading in under 5s
load-time
The load event, from the Navigation Timing API.
Fix: Defer non-critical scripts, lazy-load below-the-fold images, and drop unused third-party tags.
|
| 2 |
No overlay swallowing the first screen
consent-overlay
Fixed/sticky elements (cookie banners, modals) covering more than 30% of the viewport at load.
Fix: Keep consent and promo banners small and dismissible. Do not cover the content someone came to read.
|
| 2 |
Favicon present
favicon
A <link rel="icon"> (or shortcut icon / apple-touch-icon) is declared.
Fix: Add a favicon — it is how people find your tab among twenty others.
|
| 77 | Total weight in this category. A category score is the weighted mean of its checks, 0–100. |
Copy 20% of the overall score
Does the writing tell a visitor what this is, in plain language, fast?
| Weight | Check |
|---|---|
| 6 |
Page title is 15–60 characters
title-length
Length of <title>.
Fix: Write a title that names the thing and the benefit, in under 60 characters, so search results do not truncate it.
|
| 6 |
Meta description is 50–160 characters
meta-description
Length of <meta name="description">.
Fix: Write one sentence that would make a stranger click. This is the only copy most people read before deciding.
|
| 5 |
H1 says something specific
h1-text
The H1 exists and is between 10 and 90 characters.
Fix: Replace "Welcome" or "Home" with what you actually do for the person reading.
|
| 4 |
Enough copy to explain the offer
word-count
Visible word count in <body>.
Fix: Under 150 words a stranger cannot tell what you sell, who it is for, or why it is better.
|
| 5 |
Average sentence under 22 words
sentence-length
Mean words per sentence across the visible body copy.
Fix: Split long sentences at the first "and" or comma. Short sentences get read; long ones get skimmed.
|
| 5 |
Reading level at or below grade 12
reading-level
Flesch–Kincaid grade level of the visible body copy.
Fix: Swap jargon for the words your customers use. Aim for grade 8–10 on marketing pages.
|
| 3 |
No shouting blocks of ALL CAPS
all-caps
Visible text blocks of 15+ characters that are entirely uppercase.
Fix: All-caps is 10–20% slower to read. Use weight and size for emphasis instead.
|
| 4 |
No "click here" style link text
generic-links
Links whose text is a generic phrase (click here, read more, learn more, this, here).
Fix: Make the link text describe the destination — it is what screen-reader users hear out of context.
|
| 3 |
No empty links
empty-links
Anchors with an href but no text, image alt or aria-label.
Fix: Give the link text, or an aria-label if it is an icon.
|
| 3 |
Open Graph tags for sharing
og-tags
og:title, og:description and og:image are all present.
Fix: Add og:title, og:description and a 1200×630 og:image so shared links do not look broken.
|
| 44 | Total weight in this category. A category score is the weighted mean of its checks, 0–100. |
Trust 20% of the overall score
Does the page give a stranger reasons to believe you are real and safe to deal with?
| Weight | Check |
|---|---|
| 8 |
Served over HTTPS
https
The final URL uses the https scheme.
Fix: Get a certificate (Let's Encrypt is free) and redirect all HTTP traffic to HTTPS.
|
| 6 |
No mixed content
mixed-content
Sub-resources loaded over http:// on an https:// page.
Fix: Change every http:// asset URL to https:// (or a protocol-relative path). Browsers block or flag the rest.
|
| 5 |
Privacy policy linked
privacy-policy
A link whose text or href mentions privacy.
Fix: Link a privacy policy in the footer. It is a legal requirement in most markets and a trust signal everywhere.
|
| 3 |
Terms or legal page linked
terms-link
A link whose text or href mentions terms, conditions, legal or imprint.
Fix: Add a terms page to the footer alongside privacy.
|
| 5 |
A way to contact a human
contact-link
A contact link, mailto:, or tel: on the page.
Fix: Put a contact route in the header or footer. A site with no way to reach anyone reads as abandoned.
|
| 3 |
About / who-we-are page linked
about-link
A link whose text or href mentions about, team, or company.
Fix: Add an About link. People buy from people; say who you are.
|
| 3 |
Copyright / owner line present
copyright
A © or "copyright" string in the visible text.
Fix: Add "© 2026 Your Company" to the footer — cheap, and its absence reads as an unfinished site.
|
| 3 |
Social profiles linked
social-links
Outbound links to at least one major social network.
Fix: Link the profiles you actually maintain. A dead profile is worse than none.
|
| 3 |
Canonical URL declared
canonical
<link rel="canonical"> is present.
Fix: Declare the canonical URL so duplicate paths and tracking parameters do not split your ranking.
|
| 4 |
Page is indexable
indexable
<meta name="robots"> does not contain noindex.
Fix: Remove noindex from any page you want found. This is the single most common accidental traffic killer.
|
| 3 |
At most one redirect
redirect-chain
Number of redirects between the submitted URL and the final URL.
Fix: Point links straight at the final URL. Each hop costs a round trip and leaks referrer data.
|
| 5 |
Final response is 200 OK
http-status
HTTP status of the final document response.
Fix: Anything other than 200 means visitors and crawlers are hitting an error or a soft redirect.
|
| 51 | Total weight in this category. A category score is the weighted mean of its checks, 0–100. |
Conversion 25% of the overall score
Is there one obvious next step, and is it easy to take?
| Weight | Check |
|---|---|
| 8 |
A call to action above the fold (desktop)
cta-above-fold
At least one button or prominent link with an action verb in the top 900px.
Fix: Put the primary action in the first screen. If a visitor has to scroll to find the next step, most will not.
|
| 6 |
A call to action above the fold (mobile)
cta-mobile
At least one action button or link visible in the first 844px at 390px wide.
Fix: Mobile hero sections often push the button below the fold. Shorten the headline or move the button up.
|
| 4 |
Between one and five calls to action above the fold
cta-focus
Count of distinct action buttons/links in the first screen.
Fix: Competing buttons split attention. Pick one primary action and make everything else visually quieter.
|
| 4 |
CTA wording is specific, not "Submit"
cta-wording
Above-the-fold CTAs whose text is a vague default (submit, go, ok, click here, more).
Fix: Name the outcome: "Get my free audit" beats "Submit" — it tells the visitor what happens next.
|
| 6 |
A value proposition in the first screen
value-prop
A heading of four or more words in the top 900px that is not just the brand name.
Fix: State what you do for whom in the first heading. "Design that ships" tells me nothing; "UX audits for SaaS teams in 48 hours" does.
|
| 4 |
A way to convert on the page
lead-capture
A form, mailto: link or tel: link exists somewhere on the page.
Fix: Give the visitor something to do — a form, a booking link, a phone number. A page with no next step cannot convert.
|
| 4 |
Forms ask for five fields or fewer
form-length
Largest visible field count of any form on the page.
Fix: Every extra field costs conversions. Ask for what you need to make the next contact, and nothing else.
|
| 5 |
Social proof on the page
social-proof
Testimonial, review, rating, case-study, client-logo or "trusted by" signals in the visible text.
Fix: Add one real quote with a name and a face. Social proof is the cheapest conversion lift there is.
|
| 4 |
First screen paints in under 2s
speed-conversion
First Contentful Paint on the desktop run.
Fix: Every extra second before first paint costs conversions. Inline critical CSS and stop blocking render.
|
| 3 |
No pop-up blocking the first visit
no-blocking-interstitial
A modal or overlay covering more than 50% of the first screen at load (mobile).
Fix: Delay pop-ups until someone has read something, and never cover the whole screen on mobile — Google penalises it.
|
| 48 | Total weight in this category. A category score is the weighted mean of its checks, 0–100. |