For the trades
Nearly 1 in 5 pest-control websites are invisible in Google: they rank for zero local searches.
okaybabe research
The State of Home-Services Contractor Websites 2026
By Bradley · okaybabe · June 2026
The short version: most of these sites are missing the basics that get a contractor found by Google and by AI. The good news is the fixes are mostly small.
We measured 617 working contractor websites in HVAC, roofing, kitchen & bath remodeling, and pest control. We kept 572 after cleaning out 45 off-trade sites. Each one was checked the way Google and an AI assistant actually read it: how it ranks, what it tells search engines about itself, whether AI can read it at all, and how fast it loads. If your site is somewhere in here, you’re not named: we only ever publish the totals.
How to read these numbers. Every figure comes from a study of 572 real contractor websites, rounded here to whole numbers. Exact values, sample sizes, and margins of error (about ±4 points overall) are in the methodology, the downloadable data, and the full PDF report. It’s a careful industry sample, not a national census. So read each number as “about.”
For the trades
Nearly 1 in 5 pest-control websites are invisible in Google: they rank for zero local searches.
For search & AI press
Contractors left the door wide open to AI: only 3% block an AI search crawler. Yet 6% serve a near-empty page to those crawlers.
And just 13% use a vertical schema type AI search can resolve.
For Show HN
We measured 617 real contractor websites (572 after cleaning), and 88% are too small for Google’s real-user dataset.
Only 3% run on a modern web framework. Open methodology, downloadable data + a full PDF.
Search visibility
rank for zero local searches: no sign of them when someone nearby looks for their trade. (Search-ranking estimates from DataForSEO, a third-party tool, not Google’s own numbers.)
The spread is the story: 75% of HVAC sites hold at least one #1 result versus 43% of pest-control sites. That’s a 32-point gap between the best and worst trades.
AI-readiness
serve a near-blank page to AI: the words load in a way the AI can’t see, so the crawlers behind ChatGPT, Claude, and Perplexity get an empty page and have nothing to quote.
The flip of the 2026 publisher story: big news sites are racing to block AI; contractors almost never do. But almost none have built anything for AI to quote either.
Real-world speed · Field data
are too small for Google to have real-world speed data on them: they don’t get enough visitors to register. (A “no data” response from Google is how we measure it.)
Only 71 of the 572 sites get enough traffic for Google to track at all, and just 39 of those have all three speed scores measured. So these field numbers describe a small, higher-traffic minority. It’s a coverage fact, not a quality verdict, and we never mix it with the lab scores below.
Lab speed · Lighthouse
score under 50 on Google’s 0-to-100 mobile speed test: a single simulated run on Google’s own tools, kept separate from the real-visitor data above.
Structured data
have no structured data: the hidden code that spells out a business’s name, address, phone, and hours so Google and AI can read them directly.
HVAC leads at 24%; Kitchen & Bath sits at 0%, partly because there’s no standard code tag for remodelers (a limit we note in the method).
The phone
have a one-tap way to call on a phone, so the other 1 in 4 force someone with a burst pipe to copy the number down by hand.
On-page basics
have a homepage title the right length to show in full on Google. That title is the headline searchers see. The other half are cut off, or too thin to say anything.
The rare but fatal one: 2% of homepages carry an accidental “noindex” or equivalent block. That setting can quietly keep Google from listing the page.
Platforms
run on WordPress. Most lean on a drag-and-drop page builder that tends to slow the site down. Almost none use the newer, faster web tech.
Most of these platform choices are also price choices. What each one actually costs, and what the money buys, is written up in what a website costs.
Methodology
A small team focused on website care, hosting, search visibility, and reputation for growing businesses. We got tired of guessing how bad the baseline really was. So we measured it. Here’s exactly how, in enough detail to check our work.
Collection. Site measurements and the ranking pull were run in June 2026. The Core Web Vitals reproducibility snapshot is pinned to Google’s public CrUX BigQuery release 202605 (May 2026).
Frame. Independent US home-services contractors in four verticals (HVAC, roofing, kitchen & bath remodeling, and pest control) operating with their own website. The sampling frame was built from commercial business databases cross-checked against state license registries, across 13 metros stratified by four Census regions × three population tiers (seeded random draw, seed 20260611; Texas held under a 40% home-bias cap). No Google Maps, Places, or Business Profile data is used anywhere in the pipeline: that data is prohibited from export by the Google Maps Platform Terms.
| HVAC | 162 |
| Roofing | 158 |
| Kitchen & Bath | 97 |
| Pest control | 155 |
| All trades | 572 |
| Domains sourced | 668 |
| − dead / unreachable | 47 |
| − social / directory only (no real website) | 4 |
| Live sites | 617 |
| − off-trade contamination | 45 |
| Analyzed (clean frame) | 572 |
At 572 sites the pooled margin of error is roughly ±4% (95% CI, worst case); per vertical at ~150 sites it is roughly ±8%. Each statistic on this page carries its own denominator and ±. Margins of error (±) are computed under a simple-random-sampling assumption. This is a stratified, non-probability frame drawn from commercial business databases, so every ± is indicative precision, not formal statistical inference. Between-vertical differences are only called out where the gap clears ~17 points, the level a 150-per-group sample can detect.
Field data is real Chrome users (CrUX, 28-day p75, opted-in Chrome only). Lab data is a single simulated load on Google’s infrastructure (Lighthouse via PageSpeed Insights, emulated mid-tier mobile, throttled 4G). They are reported in separate sections and never combined in one number or chart. CrUX-covered sites skew toward higher-traffic, likely-healthier sites, so field-only figures overstate the health of the whole population. That is exactly why the two cohorts are split.
| Check | Definition | Source |
|---|---|---|
| Organic visibility (ranking) | Ranked organic keyword count + position distribution for each own-domain site, intersected with a committed local-intent lexicon ({trade} / {trade} {metro} / {trade} near me / {service} {city}). Organic positions only; never map-pack. Estimated via DataForSEO Labs, indexed June 2026; a third-party model, never blended with the CrUX/PSI data. | DataForSEO Labs |
| Field Core Web Vitals | Pass = p75 LCP ≤ 2500 ms AND p75 INP ≤ 200 ms AND p75 CLS ≤ 0.10, from real Chrome users (CrUX, phone). A 404 from the CrUX API = the origin has no field data, which is itself the coverage measurement. | web.dev/vitals |
| Lab performance | Lighthouse mobile performance score 0–100 via the PageSpeed Insights API (emulated mid-tier mobile, throttled 4G, single load). Total Blocking Time is reported as the lab interactivity proxy (lab has no INP). Never combined with field numbers. | PageSpeed Insights API |
| Structured data | JSON-LD + microdata parsed from the rendered DOM (extruct). "Valid LocalBusiness" requires name + address + telephone + (geo OR areaServed). Vertical subtype = HVACBusiness / RoofingContractor / PestControl; Kitchen & Bath has no dedicated schema.org subtype, reported with that limit disclosed. | schema.org / Google LocalBusiness docs |
| JS-shell to AI crawlers | Raw server HTML visible-word count ÷ rendered-DOM visible-word count, with an absolute raw-word floor. A near-empty raw shell is effectively invisible to GPTBot / ClaudeBot / PerplexityBot, which do not execute JavaScript. Directly reproducible by fetching the raw HTML. | own dual-pass fetch |
| AI-crawler robots policy | robots.txt parsed for the most-specific matching group against a committed bot dictionary, reported as citation-crawler blocking (OAI-SearchBot / PerplexityBot / ClaudeBot / Google-Extended …) separately from training-bot blocking. robots.txt is advisory, so this measures declared policy. | OpenAI / Perplexity / Anthropic bot docs |
| Click-to-call | Presence of an a[href^="tel:"] link in the mobile-rendered DOM. | own definition (rendered DOM) |
| Title health | A <title> present and within the 30–60-character render-safe heuristic band (Google truncates by pixel width, not characters; published as a heuristic), plus whether the homepage title contains the site’s metro/state token. | Google title-link docs |
| Indexability faults | Accidental noindex via <meta name="robots"> or X-Robots-Tag header; home-path Disallow to our user-agent; canonical pointing to a different/broken URL; non-200 home status. Reported precisely (e.g. "home path disallowed to our UA"), never as "told Google not to index." | Google block-indexing docs |
| Platform / CMS fingerprint | wappalyzergo + the enthec/webappanalyzer fingerprint database over headers + rendered DOM; WordPress is split by page-builder (Elementor / Divi / Beaver / WPBakery). Builder subdomains (wixsite, godaddysites …) are tagged and never counted as an "own website." | projectdiscovery/wappalyzergo + enthec/webappanalyzer |
Fetches were polite and robots-respecting: an identifying user-agent (okaybabe-research/1.0), no more than one request per host every few seconds, at most two pages per site (homepage + one service/contact page), each fetched twice (raw HTML + rendered DOM). Only aggregate statistics are published: no per-site results, no screenshots, no personal data.
SELECT yyyymm, origin, rank,
p75_lcp, p75_inp, p75_cls,
fast_lcp, avg_lcp, slow_lcp,
phoneDensity, desktopDensity
FROM `chrome-ux-report.materialized.metrics_summary`
WHERE yyyymm = 202605
AND origin IN UNNEST(@origins)Cite & reuse
This study is released under CC BY 4.0: quote any number, embed any chart, with a link back. Each finding above has a one-click citation. Embed snippets are tagged rel="nofollow" by convention.
Example embed
<blockquote> 12.4% of US home-services contractor websites rank for zero local-intent organic keywords. <cite>— okaybabe, <a rel="nofollow" href="https://okaybabe.com/research/state-of-contractor-websites-2026">The State of Home-Services Contractor Websites 2026</a></cite> </blockquote>
Download the report + data
About this study
This study was researched and published by okaybabe. We update it on the same URL each year. Questions or corrections: [email protected].
More of what we publish, written for businesses, lives in our resources library.