The UX audit checklist
This is the whole thing. 54 checks in four categories. Every free UX audit 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. |
Download the PDF
The UX audit checklist as a print-ready PDF (A4). Everything in it is also free to read on this page.
More checklists for AI features: AI UX checklists and templates.