Free UX audit

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?

WeightCheck
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 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.
77Total 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?

WeightCheck
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.
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.
44Total 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?

WeightCheck
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 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.
51Total 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?

WeightCheck
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.
48Total weight in this category. A category score is the weighted mean of its checks, 0–100.