We checked 259 trade websites. Four out of five are invisible as local businesses.
Over the past few months we have run technical audits on 259 real trade websites — roofers, fencers, landscapers, driveway installers, builders. Not a survey. Not a sample of the worst ones. Every site we happened to check, whatever we found.
The headline is not the one we expected, and it is not “everything is broken”. The average site scored 7.8 out of 10. Only four sites out of 259 scored below six. Most trade websites are competently built and load perfectly well.
What is striking is how consistent the gaps are. The same handful of things are missing from nearly all of them, and one in particular is missing from four out of five.
The one almost nobody has
208 of 259 sites — 80% — have no LocalBusiness schema.
Schema is a small block of structured data in the page that states, in a form a machine can read without guessing: this is a business, it is called this, it is here, this is the phone number, these are the hours. Google does not have to infer any of it.
Without it, a search engine is reading your page the way a stranger skims a leaflet — working out from context that you are probably a roofer, probably in Leicester, and that the number near the bottom is probably yours. It usually gets there. It does not always, and it has no reason to be confident.
For a business whose customers search “roofer near me”, that is the single least glamorous and most consequential thing on the page. It takes about ten minutes to add. Four out of five have not.
Wider than that, 171 sites (66%) have no structured data of any kind — not a business, not a service, not a review, nothing.
Everything else we measured
All figures are out of 259 sites, most recent audit of each:
| What we checked | Sites affected | Share |
|---|---|---|
| No LocalBusiness schema | 208 | 80% |
| No HSTS security header | 191 | 74% |
| No structured data at all | 171 | 66% |
| Images with no alt text | 146 | 56% |
| No meta description | 52 | 20% |
| No robots.txt | 48 | 19% |
| Multiple H1 headings | 43 | 17% |
| No reachable sitemap | 41 | 16% |
| No mobile viewport tag | 37 | 14% |
| No H1 heading at all | 36 | 14% |
| Blocking at least one AI crawler | 19 | 7% |
| HTTPS not working properly | 13 | 5% |
| Would not load for a crawler at all | 12 | 5% |
| TLS certificate expiring within 30 days | 6 | 2% |
The twelve that could not be read at all
Twelve sites did not return a usable page to our crawler. They open fine in a browser. The owners have no idea, because their own browser is never the thing being refused.
This is the one that costs real money. A site a search engine cannot fetch is not ranked lower; it is absent. Twelve businesses are paying for a website that, as far as Google is concerned, is not there.
The mobile one is worse than it looks
37 sites (14%) have no viewport meta tag. That single missing line is what tells a phone to lay the page out for a phone. Without it, a mobile browser renders the desktop layout and shrinks it, so the visitor gets a page they have to pinch and zoom to read.
For trades, most searches happen on a phone, often stood in the garden looking at the problem. Fourteen percent of these businesses are serving that person a page they have to fight.
The AI blocking number is smaller than you have been told
19 sites (7%) block at least one AI crawler. 18 block GPTBot, the one ChatGPT uses. 18 block ClaudeBot.
We expected higher. There is a lot of noise about trade websites being invisible to AI assistants, and on this evidence it affects about one site in fourteen rather than half of them.
It is still worth knowing which one you are, because the failure is total rather than partial — a blocked site is not ranked lower by an assistant, it simply cannot be recommended. But 7% is 7%, and we would rather publish that than a number that sounds better.
How we checked
Each site was fetched as a search engine would fetch it, and the returned HTML parsed for the things above: schema blocks, meta tags, heading structure, image alt attributes, viewport, canonical. We read robots.txt for the AI crawler rules and checked whether the declared sitemap actually resolves. TLS was checked by connecting and reading the certificate.
No estimates, no proxies, no “industry averages”. Every figure above is a count of pages that did or did not contain a specific thing. Where a check could not complete, the site is counted in the “would not load” row rather than quietly dropped — which is why that row exists.
What we would fix first
In this order, because this is the order that changes anything:
- Make sure the site actually loads for a crawler. Nothing else matters if this fails, and you cannot detect it in your own browser.
- Add LocalBusiness schema. Ten minutes, and it is the gap 80% share.
- Add the viewport tag if it is missing. One line.
- Give every page a single H1 and a meta description. Basic, and a third of sites get one or both wrong.
Alt text and security headers matter, but they are further down. A missing HSTS header has never lost anybody a job.
Check your own
Ospry Suite runs every one of these checks. It is invite-only while we work through, and it is free while we are invite only.
If you run an agency, the interesting version of this is running it across your whole client list at once and seeing which of the fourteen rows above you are carrying without knowing.