Over the last few weeks I built a website audit tool and ran it on 200+ small business and service websites — dental practices, plumbing companies, landscapers, law firms, real estate agents. Not Fortune 500 pages optimized by dedicated teams. The sites that actually serve local customers.
I expected some issues. I did not expect this.
Here's the raw data, the patterns I found, and what you can actually do about it.
The Scorecard
I grade sites across five dimensions on a 0–100 scale. Here are the averages from 200+ audits:
| Dimension | Average Score | Worst Score |
|---|---|---|
| Speed | 56 | 11 |
| SEO | 68 | 29 |
| Mobile usability | 61 | 18 |
| Accessibility | 52 | 8 |
| Security | 70 | 17 |
SEO and security tend to be passable (automated checks from Google Search Console and automatic SSL help). Speed and accessibility are consistently neglected — probably because the feedback loop is invisible. A slow or inaccessible site loses visitors silently, and the owner never knows why.
Finding #1: 67% of Sites Ship >50% Unused CSS
This was the single most surprising data point by far.
When a browser loads a page, it downloads every byte of CSS, parses it, builds style rules for every selector, and only then paints. If 60% of those rules never get applied (because they target a contact form behind a click, or a mobile menu at 768px+), the browser still processed them.
Worst case: a dental practice shipped 287 KB of CSS. Only 31 KB was used on first paint. That's 256 KB of unnecessary render-blocking weight that delayed First Contentful Paint by roughly 1.4 seconds.
The fix: If you're using Tailwind, make sure tree-shaking is enabled. If you're writing vanilla CSS, open DevTools > Coverage tab > Reload. Anything over 40% unused is worth addressing. Most bundlers handle this — you just need to turn it on.
Finding #2: Average Image Payload Is 1.8 MB — Way Too High
Average image payload across all scanned sites: 1.8 MB per page. Only 34% serve WebP or AVIF (modern formats that cut file size by 30-50%). Only 28% serve responsive sizes.
The correlation was direct: every 100 KB of unnecessary image weight added ~0.6 seconds to Largest Contentful Paint. One landscaping site served a 4 MB hero photo at 2400×1800px — displayed at 800×600 in a 50% viewport. That single image was costing them ~3 seconds of load time.
The fix: Serve WebP at responsive sizes. Tools like sharp, Squoosh, or built-in Next.js image optimization handle this. If you're on shared hosting, ShortPixel or Imagify plugins do it automatically.
Finding #3: 82% Have Render-Blocking Scripts
Render-blocking JS/CSS adds an average of 1.8 seconds to First Contentful Paint.
Most common offenders:
- Google Tag Manager loading synchronously in
<head>— alone adds ~1.2s. Addasyncor defer by 3 seconds. - Web font files blocking render — the browser downloads the font before it paints any text. Preload or use
font-display: swap. - Analytics scripts without
deferorasync— your analytics provider is valuable, but not more valuable than the first impression.
The fix: This is a one-line change for most sites — add async or defer to script tags that aren't critical for first paint. It's free and takes minutes.
Finding #4: 83% Can't Reliably Receive Email
This one surprised me most because it directly affects revenue.
I checked every domain for SPF records (authorized senders), DKIM signatures (cryptographic verification), and DMARC policies (what to do with failures). 83% failed at least one check.
Most common failure: no SPF record at all. That means your emails go to spam (or bounce silently) for anyone with strict DMARC policies — which includes Gmail and Microsoft 365 recipients.
The fix: A single TXT DNS record. Google provides the exact record to add. Costs nothing. Takes 10 minutes.
Finding #5: 44% Fail Basic Color Contrast Checks
Nearly half the sites had text that was genuinely hard to read for people with low vision (or anyone in direct sunlight). The broader accessibility picture: 28% had missing image alt text (which also hurts SEO), 16% had keyboard focus traps, and poorly-marked-up sites averaged 1,400+ DOM nodes (Google recommends under 1,500 for performance).
The fix: Run axe DevTools or Lighthouse's accessibility audit. The recommendations are concrete and actionable.
Finding #6: "Looks Good, Runs Bad" Is the Most Common Pattern
Sites with fresh designs (hero image, smooth scroll, animations, template framework at full weight) consistently scored WORSE on performance than older, simpler sites. The reason is straightforward: a modern design loads a template framework, a hero image, custom fonts, and multiple JS libraries. An older site built with plain HTML loads in under a second but looks dated.
The takeaway: If you paid for a redesign in the last two years and didn't check the PageSpeed score before and after, there's a real chance your new site is slower than your old one.
What Actually Moves the Needle
If I had to pick the changes that help the most sites in the least time:
- Defer non-critical JavaScript (30 min, free) — improves FCP ~35% on average
- Serve WebP images at responsive sizes (1 hour, free-$30/mo)
- Set up SPF/DKIM/DMARC (10 min, free) — prevents business email from going to spam
- Audit unused CSS (2 hours, free)
- Move email capture to post-value, not pre-value — don't ask for an email before someone has seen why your tool is useful
How I Got This Data
I built the audit tool because I couldn't find anything that checked performance, SEO, accessibility, mobile, security, AND email auth in one pass without requiring an account or credit card.
If you want to run your own URL through it: outboundautonomy.com — enter any URL, get your scores in about 30 seconds. Free, no email, no account.
I'd love honest feedback on what else I should measure. A few things I'm considering: cumulative third-party script weight per page, CLS from web fonts, and HTTPS redirect chains. If you run your own site through the tool and find something it misses, let me know — I'm still iterating.
Drop your URL in the comments if you want me to run an audit and post your scores.
Top comments (0)