TL;DR - the 8 checks that decide whether your site ranks, gets cited, and converts:
- Core Web Vitals - LCP, INP, CLS at Google's 2026 thresholds
- Mobile experience - viewport, tap targets ≥24×24 CSS px, font sizing
- SEO technical basics - title, meta description, canonical, hreflang, JSON-LD
- Crawlability - robots.txt, sitemap freshness, soft-404 detection
- Heading hierarchy + semantic HTML - one h1, no skipped levels, real
<main>/<nav> - Image optimisation - WebP/AVIF,
loading="lazy", width/height, descriptive alt - Resource loading - render-blocking scripts, preconnect, modulepreload, font-display
- Accessibility (WCAG 2.2) - the 9 new success criteria from Oct 2023
If your site passes 6+, you're in the top quartile of SMB sites. Sub-4 and you're losing rankings, conversions, and AI citations. Start Full Audit → Account required.
Why technical health is downstream of every other audit
Three things happen when your site is technically broken:
- Google ranks you lower. Core Web Vitals are explicit ranking factors. INP - which replaced FID in March 2024 - is unforgiving: anything above 200ms degrades rankings.
- AI engines stop citing you. ChatGPT, Claude, and Perplexity preferentially cite pages they can actually load. Sites that fail Lighthouse mobile <50 drop out of AI citation candidate pools.
- Visitors leave before reading. Per Google's mobile page-speed research, bounce probability jumps 32% as page load goes from 1s to 3s, and 90% as it goes from 1s to 5s. The site in the worked example below is at 7.1s.
The 8 checks
1. Core Web Vitals - the metrics Google actually uses
The three metrics in Google's 2026 ranking algorithm, per web.dev's Core Web Vitals reference:
- LCP (Largest Contentful Paint) - ≤2.5s good, 2.5-4s needs improvement, >4s poor.
- INP (Interaction to Next Paint) - replaced FID March 2024. ≤200ms good, 200-500ms needs improvement, >500ms poor.
- CLS (Cumulative Layout Shift) - ≤0.1 good, 0.1-0.25 needs improvement, >0.25 poor.
What to check:
- Run PageSpeed Insights on your homepage and 3 key pages
- Look at Field data (real user metrics from the Chrome User Experience Report (CrUX)), not Lab data. Field data is what Google ranks on.
- Test on mobile, not desktop - mobile is the ranking signal
What most tools miss: the lab-vs-field distinction. Lighthouse can score 95 with green Field data that's actually red. AuditHQ pulls CrUX data via the PSI API, not Lighthouse-only.
2. Mobile experience - the WCAG 2.2 target size update
Since WCAG 2.2 (October 2023), tap targets must be ≥24×24 CSS px under success criterion 2.5.8 Target Size (Minimum).
<meta name="viewport" content="width=device-width, initial-scale=1">present (NOTmaximum-scale=1.0, user-scalable=no)- Buttons, links, form controls measure at least 24×24 CSS pixels on mobile
- No horizontal scrolling on 360px-wide viewport
- Base font size ≥16px on mobile (smaller triggers Safari's zoom-to-input)
3. SEO technical basics
Reference: Google's Search Central documentation.
<title>50-60 chars, unique per page, primary keyword in first 30 chars<meta name="description">140-160 chars, unique per page<link rel="canonical">- points to itself unless deliberate duplicatehreflangtags for international sites (withx-default)- JSON-LD schema (Organization, Article, BreadcrumbList, FAQPage)
What most tools miss: unique meta-description per page. Most SMB sites have the homepage description copied across every page.
4. Crawlability - robots.txt, sitemap, soft-404
robots.txtat the root - allows public pages, blocks app routes- AI crawler rules (GPTBot, ClaudeBot, PerplexityBot, Google-Extended) explicitly handled
sitemap.xmlreferenced in robots.txt- Sitemap is current -
<lastmod>dates within the last 30 days for active content - No soft 404s - pages that return 200 with "Sorry, page not found" content
- No broken internal links → quick crawl with Screaming Frog
5. Heading hierarchy + semantic HTML
- Exactly one
<h1>per page <h2>through<h6>in sequence, no skipped levels- Real semantic elements:
<main>,<nav>,<header>,<footer>,<article>,<section>,<aside>- per the MDN HTML elements reference - Lists as
<ul>/<ol>, not<div>stacks. Tables as<table>, not CSS grids.
6. Image optimisation
Images are typically 60-70% of page weight per the HTTP Archive Web Almanac.
- Format: WebP or AVIF. AVIF saves ~50% vs WebP, which saves ~30% vs JPEG.
loading="lazy"on every image below the fold.fetchpriority="high"on the LCP image - see the fetchpriority web.dev guide.widthandheightattributes set explicitly - prevents CLS.alttext descriptive (>5 words), not "image".- Responsive variants via
srcsetandsizes.
The single highest-leverage one-line change in this entire article is the LCP preload hint. Put this in index.html <head>:
<link rel="preload" as="image" href="/assets/hero.avif" fetchpriority="high">Typically shaves 0.5-1s off LCP. Free.
7. Resource loading - what blocks the render
<script>tags should haveasyncordeferunless critical inline- Use
type="module"for modern JS <link rel="preconnect">for critical third-party origins<link rel="preload">for the hero image + critical fonts<link rel="modulepreload">for critical ES modules- Fonts use
font-display: swap - Critical CSS inlined; non-critical loaded async with
media="print"swap pattern - Speculation Rules API for likely-next-page prerender (Chrome 121+)
8. Accessibility - WCAG 2.2
- 2.4.11 Focus Not Obscured (Minimum)
- 2.4.13 Focus Appearance - focus indicator has minimum contrast ratio
- 2.5.7 Dragging Movements - drag has a single-pointer alternative
- 2.5.8 Target Size (Minimum) - 24×24 CSS px
- 3.2.6 Consistent Help - help links in consistent location
- 3.3.7 Redundant Entry - don't re-ask for info already provided
- 3.3.8 Accessible Authentication (Minimum) - no cognitive function test required
For the AI-search side of technical health, see the AI Citation audit guide; for the security-header side (HSTS, CSP, X-Frame-Options), see the security audit guide.
Worked example - a real SMB we audited
Composite score: 58/100 - Grade C
The site is a Vite + React SPA with SSG pre-rendering, hosted on Netlify behind Cloudflare. Schema.org markup, per-page canonical and meta, hreflang en-AU, robots.txt friendly to AI crawlers, sitemap with lastmod dates. Above average.
But the audit found:
- Performance: 32/100. PSI returns a Performance score of 46/100 with LCP at ~7.1 seconds on mobile. Google's threshold is 2.5s. Fails by almost 3×. With Google's own 90%-bounce-at-5s research, the site is structurally losing traffic before any visitor sees the work.
- All 21 images are JPG. Zero WebP. Zero AVIF. The primary LCP driver. Converting via vite-imagetools typically delivers 30-50% LCP improvement.
- No
<link rel="preload">for the hero image. Adding one line typically shaves 0.5-1s off LCP for free. - No explicit
width/heighton<img>tags. Causes CLS - page jumps as images load. - 3 of 6 security headers stripped at the edge. Both
vercel.jsonandpublic/_headerscorrectly define CSP, X-Frame-Options, Permissions-Policy. Cloudflare strips them before they reach the browser. Fix is a Cloudflare Transform Rule in the dashboard - 30-min config change. - Blog posts not pre-rendered. The SSG build (
build-ssg.mjs) pre-renders 10 core routes but omits the 14 blog post slugs. Google crawls/blog/{slug}and sees<div id="root"></div>. Asite:search returns ~1 indexed page despite a 22-URL sitemap. - No
prefers-reduced-motionsupport. Framer Motion ships withuseReducedMotion()but it's not used. - Cache-Control:
no-cache, must-revalidateon everything, including content-hashed static assets that should be cached for a year.
Score breakdown
| Category | Score | Key finding |
|---|---|---|
| Page Speed & Performance | 32/100 | LCP 7.1s; all 21 images JPG |
| Mobile Responsiveness | 82/100 | Fully responsive; no reduced-motion support |
| SEO Technical Health | 75/100 | Strong schema; blog routes invisible to Google |
| Security & SSL | 48/100 | HTTPS + HSTS; 3 headers stripped by Cloudflare |
| Accessibility | 72/100 | Solid foundation; contrast unverified |
| Code Quality | 62/100 | Clean TS; dep bloat; bad cache policy |
The three fixes that move this site from C to B in a developer-day:
- Image pipeline (~4 hours). Convert all 21 images to WebP + AVIF via
vite-imagetools. Add explicitwidth/heightto every<img>. Add the LCP preload tag shown earlier. Expected LCP: 7.1s → under 3s. - Cloudflare Transform Rules (~45 min). Add CSP, X-Frame-Options, Permissions-Policy as Response Header Modification rules. Verify with securityheaders.com. No code change.
- Blog SSG (~90 min). Add the 14 blog slugs to the
routesarray inbuild-ssg.mjs. Rebuild. Submit the sitemap in Google Search Console.
Run it on your site automatically
Start Full Audit → Create an account to review public website findings, supporting evidence, and a prioritised action plan in a Full Audit. Pulls Field CWV data from PSI's CrUX dataset, not synthetic Lighthouse runs.
FAQ
Q: How often should I re-run a technical audit?
A: Monthly is reasonable for active sites. After any deploy that changes the homepage or main service pages. After Google announces new ranking-factor changes (twice yearly historically).
Q: My Lighthouse score is 95. Why does AuditHQ score me lower?
A: Lighthouse runs a simulated lab test on a fast desktop. AuditHQ uses Field data from PSI's CrUX dataset - real visitors on real devices. A 95 Lab can routinely correspond to a 50 Field if your hosting / images / scripts perform differently in the wild. Field data is what Google actually ranks on.
Q: Do Core Web Vitals matter for B2B SaaS where buyers are patient?
A: Yes. INP failure (>500ms) is a B2B SaaS-killer - every form, dropdown, and button feels broken. CWV failure correlates with churn even when first-touch conversion looks fine.
Q: What's the single biggest technical win for SMBs?
A: Convert hero images from JPEG to WebP/AVIF, add loading="lazy" to below-fold images, add fetchpriority="high" to the hero. Three ~10-minute changes that typically shave 1-2s off LCP.
Q: Does AI search visibility (GEO) overlap with technical health?
A: Yes - about 60% overlap. Crawlability, schema, semantic HTML, page speed all matter for both. The other 40% (llms.txt, AI crawler access, passage citability) is GEO-specific.
Written by Adam Savage, Founder of AuditHQ - 17 years building digital products. Last updated 13 May 2026.
Related checks, explained
- Page load performance below recommended target →
- SPA shell serves the homepage canonical on every route →
- Broken internal links point to missing or error pages →
- Site is serving empty page shells instead of built content →
- Canonical tag points to a different website →
- Canonical tag downgrades a secure page to an insecure http address →
- Canonical tag points to a page that is itself blocked from search results →
- Cumulative Layout Shift is in Google's needs-improvement range →