Small-business web presence across eleven verticals.
I measured every independent firm in eleven trades across Mobile and Baldwin County, Alabama — 1,916 of them after deduplication — and asked one question: does this business have a website it controls, and does it work? The answer varies by more than thirty points depending on the trade. It also depends on two biases that run in opposite directions, which is why the one number everybody wants is the one number this study will not give.
N = 1,916 firms · 11 verticals · Mobile and Baldwin County, Alabama · measured August 15, 2026 · 95% Wilson intervals · aggregate data CSV
31.4% have no web presence. Which tells you almost nothing on its own.
602 of 1,916firms have neither a domain of their own nor a page they control on somebody else's platform. A directory listing they did not build and a Facebook page do not count. That is the aggregate, and the aggregate hides a 34.0-point spread between the worst vertical and the best — a gap wider than most of the rates inside it.
| Measure | Count | Rate | 95% Wilson interval |
|---|---|---|---|
| No web presence at all No own domain and no platform page. A directory or social profile alone does not count. | 602 / 1,916 | 31.4% | 29.4% – 33.5% |
| No own domain (a platform page still counts as presence) | 750 / 1,916 | 39.1% | 37.0% – 41.3% |
| No working website — none at all, or one that fails to load | 842 / 1,916 | 43.9% | 41.7% – 46.2% |
| Site broken, among firms that have one Broken means both independent clients failed. Twenty-five further sites are live and blocking automation. | 240 / 1,314 | 18.3% | 16.3% – 20.4% |
| PageSpeed mobile score under 50 Lab measurement, over sites that load. Not a Core Web Vitals verdict. | 193 / 814 | 23.7% | 20.9% – 26.8% |
| PageSpeed mobile score 90 or above | 111 / 814 | 13.6% | 11.4% – 16.2% |
| Origins with any Chrome UX Report field data 97.6% of these origins sit below Google's traffic threshold for field measurement. | 27 / 1,135 | 2.4% | 1.6% – 3.4% |
Every interval on this page is a Wilson score interval at 95%. They cover sampling error and nothing else — they say how far a number would move under resampling from this frame, and they are silent on whether the frame is right. On this study the frame error is the larger one, and section 07 is where it gets bounded.
The number this study will not give you
The one claim this study will not make is a single point estimate for the share of local businesses with no website.
Two biases run in opposite directions. One is measured and one is only bounded, and which of them dominates changes from vertical to vertical. In barber & salon the frame captures roughly 20% of the employer-plus-nonemployer universe, so the coverage bias is very large and almost certainly wins — the true no-presence rate for every barber and stylist in these two counties is above even the 48.1% measured here. In the building trades the frame under-covers the employer universe, so those rates are floors too. The defensible output is a range per vertical with both biases named, and that is what is published above. A single tidy figure would be more quotable and less true.
Barber & salon runs 48.1%. Law runs 14.0%. Same counties, same week.
Eight of the eleven verticals have enough firms to carry a rate. The bar was set before the numbers came back: a rate is publishable when its 95% interval is twenty percentage points wide or narrower. Everything below clears it, except plumbing, which is flagged where it sits.
| Vertical | N | No web presence | 95% CI | No own domain | Platform-only | Broken sites | Median PSI (n) | CrUX |
|---|---|---|---|---|---|---|---|---|
| Barber & salon | 699 | 336 / 699 = 48.1% | 44.4–51.8% | 63.4% | 107 | 25.6% | 60 (n = 218) | 0.0% |
| Spa & aesthetics | 241 | 73 / 241 = 30.3% | 24.8–36.4% | 41.5% | 27 | 17.9% | 60 (n = 88) | 5.4% |
| Plumbing Borderline — interval 21.7 pp wide, over the bar | 62 | 17 / 62 = 27.4% | 17.9–39.6% | 27.4% | 0 | 11.1% | 69 (n = 35) | 0.0% |
| HVAC | 118 | 31 / 118 = 26.3% | 19.2–34.9% | 26.3% | 0 | 11.5% | 65 (n = 73) | 3.5% |
| Lawn & landscape | 161 | 42 / 161 = 26.1% | 19.9–33.4% | 28.6% | 4 | 16.0% | 70 (n = 64) | 1.8% |
| Electrical | 66 | 15 / 66 = 22.7% | 14.3–34.2% | 22.7% | 0 | 17.6% | 66 (n = 32) | 0.0% |
| Roofing | 126 | 18 / 126 = 14.3% | 9.2–21.5% | 15.9% | 2 | 14.8% | 61 (n = 67) | 4.9% |
| Law | 385 | 54 / 385 = 14.0% | 10.9–17.9% | 15.8% | 7 | 15.7% | 65 (n = 203) | 2.9% |
“Broken” is the share of firms with a site whose site failed both independent clients. Median PageSpeed is over sites measured so far and is a ceiling — see section 09.
Three verticals whose rates are not published
Painting, fencing and garage door came in under the sample size that lets a percentage mean anything. Their firm counts and interval widths are below. Their rates are not, and they are not in the downloadable dataset either — those rows carry the N, the width, and an empty value column.
This is the least interesting decision in the study and the one most worth copying. Nine firms will happily produce a percentage. It will be quoted. It will be wrong.
| Vertical | Firms | 95% interval width | Why the rate is withheld |
|---|---|---|---|
| Painting | 26 | 35.0 pp | The 95% interval is 35 points wide — wider than the gap between most verticals in the entire study. A point estimate off 26 firms would be quoted as fact and could not survive one more month of frame work. |
| Fencing | 23 | 30.2 pp | The interval is 30 points wide, and NAICS 238990 is an all-other-specialty-trade catch-all, so there is no usable denominator to bound the frame against either. |
| Garage door | 9 | 48.4 pp | Nine firms. The interval excludes almost nothing. The firm count is the only number here worth reporting. |
Spa & aesthetics. The vertical is spa & aesthetics as Overture categorises it — day spas, beauty-and-spa, skin care, waxing and laser hair removal alongside medical_spa. It is not a med-spa population and is not labelled as one. No coverage ratio is published for it.
Plumbing. The interval is 21.7 points wide — over the 20-point bar. Publishable as a range only, and only alongside HVAC, because NAICS 238220 does not separate the two trades.
HVAC. Reproduces the published pilot on an independently rebuilt frame. The denominator is only interpretable combined with plumbing.
Electrical. The interval is 19.9 points wide — just inside the bar. Never quote the point estimate without it.
15 of 55 vertical comparisons are real. 40 are not.
A difference counts as real only when both gates fire: the two Wilson intervals are disjoint, and the Newcombe (1998) hybrid-score interval for the difference excludes zero. Gate two alone is the correct test and is strictly more powerful, so every difference below is real under either standard.
The result that matters here is the negative one. The building trades are largely indistinguishable from one another. Any claim of the form “painters are worse than plumbers” is unsupported by this data, and 40 of the 55 pairs cannot be told apart at 95% at all.
| Worse | Rate | Better | Rate | Difference | 95% CI on the difference |
|---|---|---|---|---|---|
| Barber & salon | 48.1% | Spa & aesthetics | 30.3% | +17.8 pp | +10.7 to +24.4 |
| Barber & salon | 48.1% | Plumbing | 27.4% | +20.6 pp | +7.9 to +30.9 |
| Barber & salon | 48.1% | HVAC | 26.3% | +21.8 pp | +12.4 to +29.8 |
| Barber & salon | 48.1% | Lawn & landscape | 26.1% | +22.0 pp | +13.8 to +29.2 |
| Barber & salon | 48.1% | Electrical | 22.7% | +25.3 pp | +13.3 to +34.6 |
| Barber & salon | 48.1% | Roofing | 14.3% | +33.8 pp | +25.7 to +40.0 |
| Barber & salon | 48.1% | Law | 14.0% | +34.0 pp | +28.7 to +38.9 |
| Spa & aesthetics | 30.3% | Roofing | 14.3% | +16.0 pp | +7.0 to +23.9 |
| Spa & aesthetics | 30.3% | Law | 14.0% | +16.3 pp | +9.6 to +23.1 |
| Plumbing | 27.4% | Law | 14.0% | +13.4 pp | +3.1 to +26.0 |
| HVAC | 26.3% | Law | 14.0% | +12.2 pp | +4.2 to +21.4 |
| Lawn & landscape | 26.1% | Law | 14.0% | +12.1 pp | +4.8 to +20.0 |
12 of the 15 real differences are shown. The other 3 — Painting against Roofing, Painting against Law, and Barber & salon against Fencing — are real, and printing them would state a rate that section 02 withholds. The differences are counted; the rows are not.
Stated to exactly the strength the data carries
Barber & salon separates from 8 of the other ten verticals, by 17.8 to 34.0 percentage points. It does not separate from Painting or Garage door— those intervals overlap, and on this study's own rule that means no difference is claimed. It is the strongest result here, and “worse than every other vertical” would overstate it.
Law has the lowest no-presence rate, separating from 6 of the other ten. It does not separate from Electrical, Roofing, Fencing, Garage door, so law cannot be called better than those four.
A listed URL is three different things, not two.
The pilot established that a place dataset's websitesfield is wrong in both directions — blank when the firm has a site, populated with a manufacturer's URL when it does not. At eleven verticals the failure has a third shape, and it does not appear in HVAC at all: a URL that resolves to a page the business genuinely uses but did not build and cannot control.
| Class | What it is | Counts as a website? | Firms |
|---|---|---|---|
OWN | A registered domain the business controls. | Yes | 1,156 |
PLATFORM | A page the business controls on somebody else's domain — GlossGenius, Vagaro, Booksy, StyleSeat, Square, Setmore, business.site, a Wix or GoDaddy or Weebly subdomain. | Yes, reported separately | 148 |
DIRECTORY | A listing the business did not build and does not control — Hubbiz, FindUsLocal, CitySmart, Cortera, YellowPages, Avvo, Yelp, BBB. | No | 104 |
SOCIAL | A Facebook, Instagram or Linktree profile and nothing else. | No | 25 |
MANUFACTURER | A brand or dealer-locator site — trane.com, ruud.com, generacdealers.com. | No | 6 |
(none) | The listing carried no URL at all. | No | 477 |
In barber & salon, 107 firms carry a booking-platform page (GlossGenius, Vagaro, Booksy, StyleSeat, Square) and 92 carry nothing but a directory or social profile (Hubbiz, FindUsLocal, CitySmart, Cortera). Together that is 28% of the vertical. A pipeline that treats the field as a boolean — which is what the pilot did, correctly, for HVAC, where the contamination was 4 manufacturer URLs — is wrong by tens of points here.
The most useful thing about that distinction is that it changes the question rather than the answer. A stylist with a Vagaro page has somewhere to send a customer, which is more than nothing. That page is also not a domain, not a search surface under the business's control, and not something that survives the platform changing its terms. Both facts are true, and they are reported separately, because collapsing them into one boolean is what produced the confusion in the first place.
The row that made the classifier necessary
One frame row listed tvnews.vanderbilt.edu— a university television-news archive — as a Mobile hair salon's website. Nothing about that URL is malformed. It resolves, it returns 200, it would have scored a perfectly respectable PageSpeed number, and any pipeline counting non-empty website fields would have filed that salon under “has a website.”
Three things I got wrong while the study was running.
Each of these was caught by auditing a step that had already produced a number I liked. That is the only reliable way they get caught, and it is why the audits are in the article rather than in a footnote.
Algorithmic domain guessing was 85% false positives
For every firm with no own domain, candidate domains were generated from the business name and checked. The pass produced 66 candidate recoveries. An audit found 56 of them rested on business-name tokens alone — a two-word salon name matching the same two words as a dot-com owned by somebody else entirely, a family surname on an electrical contractor matching a surname domain, and in one case two different firms in the frame matching the identical domain, which is proof on its own that the rule was matching words rather than businesses.
The fix. The whole weak tier was discarded. Only the 10 recoveries carrying a page-verified phone-number match were kept.
What it was worth. 56 firms would have been credited with websites belonging to somebody else.
CrUX field-data coverage was contaminated 2.6x
Origin-level field data was being counted for firms whose listed URL was not theirs — shared application hosts, corporate multi-location properties, and platform URLs with no firm-specific subdomain. Before the filter, the present set included amazon.com, groupon.com, cvs.com, marriott.com and quizlet.com.
The fix. An attribution filter now requires the origin to belong to the firm, with a data-driven backstop: any registrable host serving two or more deduplicated firms is, after domain-key deduplication, necessarily a platform, directory or brand host.
What it was worth. 87 origins reported field data before the filter and 27 after. Field-data coverage was overstated by a factor of roughly 2.6.
Government offices were sitting inside the law vertical
Overture's lawyer and legal-services categories had picked up public legal offices, including a US Attorney's office and a county district attorney, alongside court-reporting services.
The fix. Three government records were excluded under their own reason code and the frame was rebuilt.
What it was worth. The rebuild moved the no-presence stratum from 583 firms to 602, which is why the recall sample's allocation is proportional to 583 and the final frame is 602. All 200 sampled firms are still in the stratum, so the results carry over.
The liveness correction, at scale
A naive single-client check calls 29.2% of sites broken — 384 of 1,314. After browser headers, www and apex variants, http and https variants, and PageSpeed arbitration, the real figure is 18.3%. The naive number overstates breakage by 60%. 25 sites are live and blocking automation outright.
The pilot measured this same correction at 89% on 119 HVAC firms. It reappears here at 60%, which means the pilot's headline figure for this correction was itself too high. The direction and the lesson hold. The magnitude was vertical-specific, and the pilot has been corrected to say so.
30.5% of the no-presence set does have a presence.
A no-website finding is only as good as the search that failed to find a website. So 200 firms were drawn from the no-presence stratum — stratified by vertical, proportional allocation, frozen seed 20260814— and re-searched from scratch by an agent with no access to the first pass's conclusions. Every candidate had to clear an identity check — matching phone, matching street address, or matching city plus a distinctive name — before it counted as a recovery.
| Outcome | Count | Share of sample | 95% Wilson interval |
|---|---|---|---|
| Own domain found — a frame miss | 23 | 11.5% | 7.8–16.7% |
| Platform page found — a frame miss | 38 | 19.0% | 14.2–25.0% |
| Any presence found — total miss rate | 61 | 30.5% | 24.5–37.2% |
| Confirmed no presence | 129 | 64.5% | 57.7–70.8% |
| Undetermined | 10 | 5.0% | 2.7–9.0% |
Treating every undetermined case as a miss raises the upper bound to 35.5%. Of the confirmed-no-presence firms, 46 have a Facebook page and nothing else.
The miss is mostly booking platforms, not missing websites. 38 of the 61 misses are platform pages — Fresha, Vagaro, Booksy, StyleSeat, Square, GlossGenius — and only 23are own domains. Overture's listing feeds do not systematically capture salon-booking pages. So the frame's error depends entirely on which question is being asked: does this firm have any web presence, where the miss rate is 30.5%, or does it have its own domain, where the miss rate is 11.5%. That second figure is close to the pilot's own-domain false-negative estimate, which was answering the narrower question in a vertical where booking platforms barely exist.
Applying the measured miss rate to each vertical gives a corrected rate. Both are printed here, side by side, because the naive figure is the measured one and the corrected figure is the estimate — and the gap between them is large enough that showing only one would be a choice about what to advocate.
| Vertical | No web presence — naive | Corrected | No own domain — naive | Corrected |
|---|---|---|---|---|
| Barber & salon | 48.1% | 33.2% | 63.4% | 60.8% |
| Spa & aesthetics | 30.3% | 19.8% | 41.5% | 40.2% |
| Plumbing | 27.4% | 19.1% | 27.4% | 24.3% |
| HVAC | 26.3% | 18.3% | 26.3% | 23.2% |
| Lawn & landscape | 26.1% | 18.1% | 28.6% | 25.6% |
| Electrical | 22.7% | 15.8% | 22.7% | 20.1% |
| Roofing | 14.3% | 9.9% | 15.9% | 14.2% |
| Law | 14.0% | 9.7% | 15.8% | 14.2% |
| All 11 verticals | 31.4% | 21.8% | 39.1% | 35.5% |
Every value in the two corrected columns: Agent-validated. Human phone validation outstanding. Painting, fencing and garage door are absent for the same reason they are absent from section 02.
| Vertical estimated from its own stratum | Sampled | Misses | Miss rate |
|---|---|---|---|
| Spa & aesthetics | 23 | 8 | 34.8% |
| Barber & salon | 110 | 34 | 30.9% |
Every other stratum came in under twenty sampled firms, so those verticals take the pooled 30.5% rather than their own observed rate. Law is the weakest of them: seventeen firms sampled, and its observed miss rate ran higher than pooled, so its corrected figure is probably too favourable.
Every corrected rate on this page is agent-validated and not final
Both passes were run by agents, and both share one failure mode: they can only find what a search index will surface. A business whose site no index has crawled, or whose site is reachable only through a link neither pass encountered, is invisible to both. The second pass is independent of the first pass's conclusions. It is not independent of the first pass's sensing apparatus. Neither pass can telephone a business, and calling the shop is the only method that actually settles the question. Until that happens, the naive rates are the measured, publishable ones and the corrected rates are an internal estimate carrying this label wherever they appear.
The pilot carried the same limitation. Scaling the sample from 26 firms to 200 narrowed the interval. It did not change what kind of evidence this is.
Two biases, pointing opposite ways.
It would be convenient to stop at “every rate here is a floor.” The pilot said that, and for the pilot it was the honest read. It is no longer the whole story, because this study measured the second bias and it runs the other way.
| Bias | Mechanism | Effect on the published rate | Size |
|---|---|---|---|
| Frame coverage | A business enters Overture by having been listed somewhere, and being listed correlates with being digital. The unlisted are disproportionately the non-digital. | Pushes the measured rate DOWN — the published rate is too low | Unmeasured. Bounded by the coverage ratios against CBP, QCEW and NES. |
| Recall miss | 30.5% of the no-presence stratum turns out to have a web presence the frame never recorded — mostly booking-platform pages the listing feeds do not capture. | Pushes the measured rate UP — the published rate is too high | Measured: 30.5%, 95% interval 24.5–37.2. |
The recall bias is measured. The coverage bias is bounded but not measured. So the naive rates in section 02 are biased upward by a known, quantified amount and downward by an unquantified one. The corrected rates in section 06 remove the measured upward bias and leave the unquantified downward one, which makes them a better estimate of the listed population and still a floor for the whole one.
Here is what the coverage bound looks like, restricted to the verticals whose NAICS mapping is clean enough for the ratio to mean something.
| Vertical | Frame N | Employer establishments | Coverage | Employer firms the frame does not see |
|---|---|---|---|---|
| Electrical | 66 | 172 | 38% | 106 |
| Lawn & landscape | 161 | 219 | 74% | 58 |
| Law | 385 | 327 | 118% | 0 — the frame exceeds CBP |
| Roofing | 126 | 59 | 214% | 0 — the frame exceeds CBP |
| Barber & salon | 699 | 127 | 550% | 0 — the frame exceeds CBP |
| HVAC + plumbing | 180 | 261 | 69% | 81 |
That table says two different things in two different places. In the building trades the frame under-covers the employer universe — HVAC and plumbing together catch 69% of the 261 establishments Census counts, electrical 38%. The firms it misses are, on the listing-feed argument, more likely than average to be the ones with no web presence, so those rates are floors and the true figure for the employer universe is higher.
In personal care the frame over-covers the employer universe — 699 barber and salon firms against 127 employer establishments — because the vertical is dominated by nonemployers, of which Census counts 3,399 in these two counties. Measured against employer plus nonemployer combined, the frame sees 20%. Since the 20% that are listed skew toward the digitally present, the true no-website rate for every barber and stylist in these counties is well above the 48.1% measured here.
The one claim this study will not make is a single point estimate for the share of local businesses with no website.
Two biases run in opposite directions. One is measured and one is only bounded, and which of them dominates changes from vertical to vertical. In barber & salon the frame captures roughly 20% of the employer-plus-nonemployer universe, so the coverage bias is very large and almost certainly wins — the true no-presence rate for every barber and stylist in these two counties is above even the 48.1% measured here. In the building trades the frame under-covers the employer universe, so those rates are floors too. The defensible output is a range per vertical with both biases named, and that is what is published above. A single tidy figure would be more quotable and less true.
A caution on the nonemployer denominator: it counts every Schedule C filer, including side income. It is a genuine upper bound on the business universe, not an estimate of it. The truth sits between the employer count and the combined one, which is why both are shown rather than whichever is more convenient.
The frame, measured against official establishment counts.
The pilot could only call its no-website rate a floor and leave it there. This is the single most valuable thing the scale-up adds: three independent government denominators, all free and keyless except one, that put a bound under the frame.
| Source | Vintage | What it counts | Access |
|---|---|---|---|
| Census County Business Patterns | 2023 | Employer establishments | Bulk cbp23co.zip, keyless |
| BLS QCEW | 2023 annual average | UI-covered private establishments | data.bls.gov CSV, keyless |
| Census Nonemployer Statistics | 2023 | Nonemployer establishments | api.census.gov, variable NESTAB |
| AL Examiners of Public Accounts, Sunset Report 25S-05 | Licensees as of 2024-05-16 | Statewide licensed roofers | alison.legislature.state.al.us, public PDF |
QCEW is an independent cross-check on County Business Patterns, and it corroborates: across the 11 verticals where both resolve, QCEW runs from -4% to +41% relative to CBP, median +14%, and never disagrees on order of magnitude. QCEW counts unemployment-insurance-covered establishments, so running slightly above CBP is what you would expect.
| Vertical | Frame N | CBP employer | QCEW | NES nonemployer | Coverage vs employer | NAICS fit |
|---|---|---|---|---|---|---|
| HVAC | 118 | 261 | 298 | 431 | 45% | Shared code |
| Plumbing | 62 | 261 | 298 | 431 | 24% | Shared code |
| Electrical | 66 | 172 | 208 | 314 | 38% | Good |
| Painting | 26 | 66 | 75 | 1443 | 39% | CBP good, NES broad |
| Roofing | 126 | 59 | 83 | 796 | 214% | CBP good, NES broad |
| Fencing | 23 | 74 | 93 | 1394 | not published | Poor |
| Garage door | 9 | 45 | 43 | — | not published | Poor |
| Lawn & landscape | 161 | 219 | 263 | 2367 | 74% | Good |
| Spa & aesthetics | 241 | 37 | 36 | 319 | not published | Moderate |
| Barber & salon | 699 | 127 | 143 | 3399 | 550% | Good |
| Law | 385 | 327 | 390 | 522 | 118% | CBP good, NES broad |
| HVAC + plumbing combined | 180 | 261 | 298 | 431 | 69% | Combined 238220 |
Where a ratio is missing it is missing on purpose. Fencing and garage door map to NAICS catch-alls — all-other-specialty-trade and finish carpentry — whose denominators are far broader than the vertical, so their ratios are not coverage figures. Spa and aesthetics is worse: the vertical bundles day spas, beauty-and-spa, skin care, waxing and laser hair removal alongside medical_spa, and strict medical_spa alone is fifteen listings. The 812199 denominator also misses physician-supervised practices, which file under 621399. That coverage ratio should not be quoted, so it is not printed, and the vertical is never called “med spas.”
Roofing gets a fourth denominator, because it is the only vertical in this study with a dedicated Alabama licence. Every occupational board in the state is CAPTCHA- or WAF-gated, but the Examiners of Public Accounts Sunset Report 25S-05 publishes licensee totals as of 2024-05-16: 8,298 home builders and 913 roofers, 9,211 licensees in total. Scaling by population share — 653,107of Alabama's 5,054,253, or 12.9% — gives roughly 118 licensed roofers in the two counties.
| Roofing denominator | Count | Frame coverage |
|---|---|---|
| CBP 2023 employer establishments | 59 | 214% |
| BLS QCEW 2023 establishments | 83 | 152% |
| State roofer licensees, population-scaled | 118 | 107% |
| CBP + NES, broad NAICS 2381 | 855 | 15% |
Population scaling is a weak assumption here and probably flatters the frame. The Gulf Coast is a hurricane-exposed roofing market, so these two counties almost certainly hold more than their population share of the state's roofers. The true denominator is above 118 and the true coverage below 107%. No roofing claim in this study rests on it.
A median of 63, a ceiling, and a verdict I am not entitled to.
PageSpeed Insights has scored 814 of the 1,314 sites with a presence — 62% of the queue. The run is not finished. It is checkpointed and resumable, and the remaining rows are the slowest sites in the frame, which is why it tails off. That matters for how the number below should be read.
| Statistic | Value |
|---|---|
| Minimum | 4 |
| 25th percentile | 50 |
| Median | 63 |
| 75th percentile | 76 |
| 90th percentile | 97 |
| Maximum | 100 |
| Mean | 63.4 |
| Median, each vertical reweighted to its share of sites | 63 |
| n | 814 scored of 1,314 sites |
Two reasons every performance figure here is optimistic
187 sites hard-failed in PageSpeed and carry no score at all. They are not a measurement artefact: 172 of those 187 are sites the independent curl pass also could not reach. They are the broken ones. The median is therefore computed over sites that load.
The unmeasured remainder is not random. The queue drains fastest for sites that respond quickly, so what is left is disproportionately the slow and the timing-out. Completing the run moves the median down, not up.
Both effects point the same way. Every performance number on this page is a ceiling, and it should be read alongside the 18.3% breakage rate rather than on its own.
What I will not claim
No business in this study fails Core Web Vitals, and this study cannot say that any of them does. Core Web Vitals is assessed on field data. 97.6% of these origins — 1,108 of 1,135 — have none. The assessment is not bad, or borderline, or failing. It does not exist.
Lab LCP under Lighthouse's simulated throttling has a median of 7,069 ms and a 75th percentile of 12,918 ms, with 87% above the 2,500 ms “good” threshold. Writing “87% fail Core Web Vitals” would be the most quotable sentence on this page and it would be false.
Lab CLS is reported at the 75th percentile rather than the median, because 41% of pages score exactly zero and the median is therefore uninformative: p75 CLS 0.053, with 17% above the 0.1 threshold. Layout stability is broadly fine. What fails is load time.
Field data is the finding, not the footnote. Only 27 of 1,135origins clear Google's traffic threshold — 2.4% [1.6–3.4]. The rest are below it. A site can be perfectly built and still sit below the threshold, because the constraint there is demand, not code. The pilot found the same thing in one vertical and it survives the scale-up untouched.
What this contradicts in my own published work.
This study is a scale-up of a 119-firm HVAC pilot published one day earlier. The pilot measured one vertical and, on its own terms, measured it correctly. Scaling to eleven shows how much of it was HVAC-specific. The pilot now carries a dated correction notice pointing back here.
| Measure | HVAC pilot (N=119) | HVAC here (N=118) | All 11 (N=1,916) | Verdict |
|---|---|---|---|---|
| No website | 21.8% | 26.3% | 31.4% | Not directly comparable — see below |
| Site broken | 9.7% | 11.5% | 18.3% | Higher at scale |
| Median PageSpeed mobile | 66 | 65 | 63 | Inside measurement noise |
| CrUX field data absent | 96.8% | 96.5% | 97.6% | Holds |
The pilot's headline was an HVAC number read as a market number
Barber & salon runs 48.1% with no web presence against HVAC's 26.3%, a gap of 21.8 percentage points that clears both significance gates. HVAC is one of the better verticals in this study, not a representative one. Anyone who read the pilot as “about a fifth of local businesses have no website” was generalising a single trade.
The websites field has a third failure mode HVAC never showed
HVAC's contamination was manufacturer URLs, four firms' worth. In barber & salon, 79 firms carry a directory profile, 14 carry only a social profile, and 107 carry a booking-platform page. Together that is 28% of the vertical. A pipeline that treats the websites field as a boolean — which is what the pilot did, correctly, for HVAC — is wrong by tens of points here.
The two no-website figures are not directly comparable
The pilot's 21.8% was measured after an agent search-recovery pass over its entire no-website stratum. This study ran that kind of search only on a 200-firm sample, as recall validation; the frame-based rates here include only the machine domain-recovery pass. The comparable pair is this study's recall-corrected HVAC figure against the pilot's 21.8%, and those land close. The broken-site row carries the same asymmetry: the pilot's eight search-recovered HVAC sites were all live, which pulled its breakage denominator down.
Breakage is higher than the pilot found
18.3% of sites with a URL fail both independent clients, against the pilot's 9.7%. The naive-versus-corrected lesson survives; the pilot's 89% overstatement figure does not generalise, because at 1,916 firms the same correction is worth 60%.
CrUX absence is the one pilot finding that survives untouched
97.6% of origins have no Chrome field data at all — 1,108 of 1,135. The pilot's 96.8% was not an HVAC artefact. Small-business sites in these two counties are, with very few exceptions, below Google's traffic threshold for field measurement.
Five things this study will not print.
These were fixed before the analysis finished, which is the only time such a rule is worth anything. Each one costs a number that would have been quoted.
- No recall-corrected rate appears anywhere without the agent-validated, phone-validation-outstanding label.
- No coverage ratio is published for spa & aesthetics — it is an artefact of a NAICS code that does not fit the vertical.
- No no-website rate is published for painting, fencing or garage door. Their sample sizes cannot carry a percentage.
- No business in this study fails Core Web Vitals, because 97.6% of these origins have no field data and Core Web Vitals is field-assessed.
- No business is named. Every finding is aggregate.
The rule that decides which rates ship is arithmetic, not judgment: a rate is publishable when its 95% Wilson interval is 20 percentage points wide or narrower. Seven verticals clear it outright, plumbing sits 1.7 points over and is published as a range with that stated, and three fall far enough short that a percentage would be theatre. The aggregate figures across all 1,916 firms clear it comfortably — the all-vertical interval is 4.1 points wide — provided they are labelled as covering these eleven verticals in these two counties and not as a statement about small business generally.
What this study cannot support.
The frame is a listing frame, and listing correlates with being digital
Overture Places is assembled from business-listing feeds. A firm enters this study by having been listed somewhere first. That selection runs in exactly the direction that matters: firms with no website and no listing cannot appear in the denominator. Against employer establishment counts the frame catches 38% of electricians and 69% of HVAC and plumbing contractors, so the trade rates here are floors. The size of the gap is bounded, not measured.
The recall correction was performed by agents, not humans
Two hundred no-presence firms were re-searched from scratch by an agent with no access to the first pass's conclusions. 30.5% turned out to have some web presence. That number is real and it is measured — but both passes can only see what a search index surfaces, and neither can telephone a business. Every corrected rate on this page carries that label, and none of them should be quoted as authoritative until the phone validation is done.
The PageSpeed run is incomplete, and what is left is the slow tail
814 of 1,314 sites with a presence have a score, 62% of the queue. The queue was round-robin interleaved across verticals so a partial run still covers every vertical, but completion is not proportional and results return out of order. What remains is disproportionately the slow and the timing-out, so finishing the run would move the median down. A further 187 sites hard-failed in PageSpeed and carry no score at all, and 172 of those 187 are sites the independent curl pass could not reach either. Every performance figure here is a ceiling.
Wilson intervals cover sampling error and nothing else
Every interval on this page answers one question: if this frame were the population, how far would the number move under resampling? It says nothing about frame bias, about category-assignment error inside Overture, or about my own inclusion judgments. On this study the frame bias is larger than any interval shown.
Every inclusion and exclusion is a judgment I made
All 1,127 distinct primary categories in the two counties were enumerated and read, then assigned to verticals by hand. 592 tier-B and tier-C records were adjudicated one at a time; 393 were rejected because the business name did not corroborate the category. Someone else drawing the contractor-versus-distributor line, or the salon-versus-spa line, would get a different N. Every decision carries a written reason in the working files.
Two counties, eleven verticals, one day of measurement
This is Mobile and Baldwin County, Alabama, in August 2026. The verticals are the ones a local-services studio actually encounters, not a random draw from the economy. Nail salons, massage, tanning, retail and training categories were deliberately left out rather than folded in. Nothing here is a statement about American small business.
Everything needed to run it again.
The frame cost nothing and required no account. Overture publishes its releases as Parquet on an anonymous S3 bucket and DuckDB reads them in place. The bounding-box pull returned 36,852 places, 33,973 of which fell inside one of the two county polygons.
| Parameter | Value |
|---|---|
| Source | Overture Maps Foundation, theme = places overturemaps.org, accessed 2026-08-15 |
| Release | 2026-07-22.0 Verified current against labs.overturemaps.org/data/releases.json and the S3 release listing. The STAC catalog returns HTTP 404 and could not be used. |
| Access | Anonymous S3 parquet, no key, no account |
| Engine | DuckDB 1.4.5 with the spatial extension Python module; no CLI installed. |
| Geography | Mobile County (FIPS 01097) and Baldwin County (FIPS 01003), Alabama |
| County assignment | Point-in-polygon spatial join against TIGER/Line 2024 Overture's locality strings are not used — the query bbox spills into Mississippi and Florida. |
| Extract | 2,673 candidate listings from 36,852 places in the bbox, 33,973 of which fell inside one of the two counties |
| Record filters | confidence ≥ 0.6; operating_status null or not permanently_closed |
| Vertical assignment | All 1,127 distinct primary categories enumerated and read, then hand-assigned Tier A definitive, tier B alternate-category, tier C adjacent primary. Tier B and C admitted only when the business name corroborates. |
| Deduplication | Union-find on normalised phone, normalised name, and own-domain Manufacturer, directory, social and platform domains excluded from the domain key. Redirect-confirmed merges applied on top. |
| Liveness | Three curl passes per URL — naive client, full browser headers, then www/apex and https/http variants curl 8.7.1 is the engine of record. macOS system Python's LibreSSL reports false TLS failures. WAF challenge responses are classified live-but-blocking. |
| Liveness arbitration | PageSpeed Insights as an independent second client Live if either client reached it; broken requires both to fail. |
| Speed | PageSpeed Insights API, mobile strategy, concurrency 14, retry-on-429 with exponential backoff The client must negotiate gzip — adding Accept-Encoding was the single largest throughput fix in the run. |
| Field data | Chrome UX Report API, origin-level, PHONE form factor A 404 means the origin sits below Google's traffic threshold. Absence is itself the finding. |
| Intervals | Wilson score, 95%. Differences by Newcombe (1998) hybrid score. |
| Metered API spend | $0.00 PageSpeed Insights, CrUX, Census CBP and NES, BLS QCEW, and Overture on anonymous S3 are all free. |
Google Places was not used for any part of this study
Maps Platform terms 3.2.3(a)(iii) forbid copying or saving business names and addresses, and 3.2.3(d)(iii) forbid use in a listings or directory service. Building this frame on Google Places would have made the study unpublishable. That constraint is the reason Overture is here at all, and it is the most portable thing about the method.
Of the 2,673 candidate listing records, 496 were excluded with a written reason and 2,177 kept. Those kept records collapse to 1,916 firms — 13.6% listing inflation — and 13 firms span more than one vertical, each counted once, in the vertical holding the most of its definitive listings.
| Exclusion code | Records | Rule |
|---|---|---|
TIER_BC_NOT_CORROBORATED | 393 | An alternate or adjacent category matched the vertical, but the business name did not corroborate it. Never admitted. |
CHAIN | 73 | A national franchise or corporate brand operating on a corporate domain. A franchise unit does not choose its own web presence, so including it measures the franchisor. |
DISTRIBUTOR | 12 | Wholesale supply house selling to the trade, not a contractor a customer hires. |
NOT_TRADE | 6 | The category tag is spurious; the core business is something else entirely. |
NON_BUILDING | 4 | Automotive, marine, or transport refrigeration — does not service buildings. |
RETAIL | 3 | A store selling into the trade rather than performing it. |
GOVERNMENT | 3 | Government legal offices found sitting inside the law vertical — a US Attorney's office and a county district attorney among them. |
MANUFACTURER | 1 | Makes equipment; not a local service business. |
RENTAL | 1 | Temporary equipment rental. |
The large majority of exclusions — 393 of 496 — are tier-B and tier-C records whose alternate or adjacent category was never corroborated by the business name. They were never in a vertical to begin with. The remaining 103 are structural: national franchises on corporate domains, wholesale supply houses, manufacturers, equipment rental, non-building refrigeration, training schools, and the government legal offices from section 05. A franchise unit does not choose its own web presence, so including it would measure the franchisor.
The PageSpeed pass is checkpointed and resumable. To finish it and refresh every figure here, re-run PSI_CONC=14 python3 measure_psi.py psi urls_psi_queue.csv psi_overture.json and then the pipeline script — it skips everything already recorded, so it can be stopped and restarted freely. If you want the scripts for a replication, email me and I will send them.
Take the data.
The aggregate dataset behind every number on this page is a single CSV: one row per measured quantity, with section, numerator, denominator, value, unit, and both bounds of the 95% Wilson interval where a proportion is involved. It is generated from the same module this page renders from, so the published numbers and the downloadable numbers cannot drift.
Download cds-gulf-coast-web-presence-2026-08-15.csv
Why the per-firm data is not published
The working files name 1,916 real companies alongside a judgment about whether their website works and how fast it is. Publishing that as a list would be a reputational claim about named small businesses, made by someone who sells them websites, with no right of reply and no legal review. The published file carries no business name, no firm hostname, and no phone number. Every finding on this page holds at the aggregate level, which is the level the findings are about.
The withheld rates are withheld in the file too. Painting, fencing and garage door appear with their firm count and interval width and an empty value column, so a consumer parsing the CSV gets the same refusal a reader gets.
Cite this
Campbell, Peyton. “Small-business web presence across eleven verticals: 1,916 firms, two counties, and the number I will not give you.” Campbell Digital Studio, 2026-08-15. www.campbelldigitalstudio.com/research/gulf-coast-small-business-web-presence.
Dataset and article licensed CC BY 4.0. Reuse anything here with attribution, including the numbers, the refusals, and the limits — particularly the limits.
Frame data © Overture Maps Foundation, release 2026-07-22.0, accessed 2026-08-15, used under its own licence terms. County boundaries from US Census TIGER/Line 2024. Establishment counts from Census County Business Patterns 2023, Census Nonemployer Statistics 2023, and BLS QCEW 2023. Roofer licensee counts from the Alabama Department of Examiners of Public Accounts, Sunset Report 25S-05. Performance measurements from the Google PageSpeed Insights and Chrome UX Report APIs.
Measured and published August 15, 2026. Metered API spend for this study: $0.00. Corrections and replications welcome — if a number here is wrong, I would rather know.
The pilot this corrects, and the same discipline applied elsewhere.
The 119-firm HVAC pilot that came first and now carries a correction notice pointing here, the public grading rubric, a market audit run under it, and the sourced statistics pages that follow the same rule about what a number is allowed to claim.
Want this run on your market?
The method transfers to any set of trades in any county. The frame is free, the measurement is free, and the hard part is the adjudication, not the code. If you want the same study for your industry and your market, or you want to argue with the numbers above, send the details. The second one is more interesting to me.