How the State of Small Business Web Design data gets collected
No survey panel. No purchased list. No vendor with something to sell. Every number in the report comes from code we run against real businesses and real websites. Every step of that pipeline is described below.
The sampling frame
The target is 24 North American cities crossed with 47 industries: 1,128 city-industry markets in total. 407 are collected so far, and the pipeline keeps sweeping until all of them are in. The frame for each market is every business with a Google listing inside the city’s bounding box. So far that census has found 127,157 businesses.
Markets with fewer than 15 listed businesses get skipped rather than published, because a rate computed on a dozen businesses is noise pretending to be a statistic.
Step 1: The census
For each market we sweep the city’s bounding box with Google’s Places API (New) Text Search, subdividing dense areas into smaller rectangles until the whole city is covered. The sweep returns (nearly) every listed business of that category and gives us the population count. In extremely dense blocks the per-cell API cap can undercount, and those markets carry a flag saying the population is a lower bound.
Step 2: The random sample
Auditing every business in every market would cost a fortune in API fees, so each market gets an equal-probability random cluster sample of about 150 businesses. The random draw uses a deterministic seed, which makes the sample reproducible: run it again and you get the same businesses. Nobody can quietly re-roll until the numbers look better.
In small markets the sample covers the whole population, a full census. Across all markets so far the sample holds 47,097 businesses.
Step 3: The website audit
Every sampled business that lists a real website gets its homepage fetched server-side and parsed: HTTPS and redirect behavior, viewport, title, meta description, H1, canonical tag, schema markup, Open Graph tags, image alt coverage, contact forms, blog links, social links, analytics tags, and the underlying platform. Sites that only link a Facebook page or a directory count separately as “social only”, not as websites. So far 33,184 sites have been audited.
Sites that block automated visitors are excluded from rate denominators instead of being counted as failures. Client-side rendered sites get their SEO checks backfilled from Lighthouse’s rendered-DOM audits where available, and are left out of those rates otherwise.
Step 4: Lighthouse performance runs
A random subsample of audited sites in each market (up to 80) goes through Google’s PageSpeed Insights API with mobile settings, which runs a full Lighthouse audit: performance score, Core Web Vitals, and mobile checks (viewport plus tap-target size). 10,764 sites have full Lighthouse runs so far. Where the Lighthouse mobile sample for a market is big enough, it replaces the cruder HTML viewport check in that market’s mobile-friendly rate.
The score
Each market’s overall score out of 100 is a weighted average of ten checks. A metric with no data yet (usually page speed before Lighthouse runs finish) is excluded and the weights renormalize, with the market flagged as preliminary.
| Check | Weight |
|---|---|
| Mobile-friendly | 15 |
| Page speed (Lighthouse mobile) | 15 |
| Has Google reviews | 15 |
| HTTPS enabled | 10 |
| Publishes a blog | 10 |
| Links social profiles | 10 |
| Schema markup | 10 |
| Title tag | 5 |
| Meta description | 5 |
| Analytics installed | 5 |
Confidence intervals
Every published rate carries its own sample size and a Wilson 95% confidence interval. Cross-market aggregates on the report page pool each market’s rate weighted by its per-metric sample size. One honest caveat: the sampling is cluster-based (we sample map cells, then businesses inside them), so pooled intervals slightly understate true uncertainty compared to a simple random sample of the same size.
Chains vs independents
Chain and franchise locations are flagged, and every market publishes a chain-free sub-aggregate for claims about independent small businesses. The chains comparison in the report only uses checks where both groups were checked the same way. Mobile and speed come from the Lighthouse subsample, which isn’t split by chain status, so they stay out of that comparison.
Limitations
Every dataset has biases. Ours are listed here so you can judge the numbers fairly:
- The frame is businesses with a Google listing. A business with no Google presence at all isn’t represented, so true averages are likely a bit lower than reported.
- City bounding boxes include edges of adjacent municipalities.
- Population counts include listings later found permanently closed; sampled data excludes them.
- In extremely dense blocks the per-cell API cap can bias the census toward well-known listings. Affected markets are flagged.
- Lighthouse scores vary run to run; treat single-site scores as estimates and aggregates as reliable.
- Markets with fewer than 15 listed businesses are excluded entirely.
Verify everything
The explorer on the report page pulls up any collected market, and the whole per-market dataset is downloadable as CSV or JSON, confidence intervals included. Found something that looks wrong? Email patrick@rapidweblaunch.com and it gets investigated.
License
The dataset and report are published under a Creative Commons Attribution 4.0 license. Cite freely with a link back to the report.
Back to the Report