We audited 483 UK trade websites. Nearly half are invisible as local businesses.
We have run technical audits on 483 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. One row per website, our own sites removed, every one re-audited on 16 September 2026.
It was re-audited because we got it wrong the first time, in two ways.
Our own parser was not reading structured data that sat inside a
@graph block or in microdata, so it reported sites as
having none when they had some. And the set had 62 websites in it that
are not trade businesses at all: a supermarket, a newspaper, a charity,
a couple of Swedish map sites, and twenty lead-generation marketplaces.
Those last ones matter most, because a marketplace is built by
marketers and beats a real trade on every check we run, so leaving them
in quietly flattered every figure on this page. They are named in the
tool that produces these numbers.
The headline is not the one we expected, and it is not “everything is broken”. The average site scored 8.1 out of 10. Only nine sites out of 483 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 almost half.
The one almost nobody has
229 of 483 sites, 47%, 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. Almost half have not.
Wider than that, 124 sites (26%) 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 483 sites, re-audited 16 September 2026:
| What we checked | Sites affected | Share |
|---|---|---|
| No LocalBusiness schema | 229 | 47% |
| No HSTS security header | 363 | 75% |
| No structured data at all | 124 | 26% |
| Images with no alt text | 285 | 59% |
| Multiple H1 headings | 81 | 17% |
| No meta description | 83 | 17% |
| No H1 heading at all | 50 | 10% |
| No robots.txt we could read | 19 | 4% |
| No mobile viewport tag | 9 | 2% |
| No sitemap we could reach | 87 | 18% |
| Blocking at least one AI crawler | 15 | 6% |
| TLS certificate expiring within 30 days | 6 | 2% |
| HTTPS not working properly | 0 | 0% |
The two crawl rows are counts now rather than an upper bound. An earlier version of this study recorded a server that refused our crawler the same way as a server with no such file, so those rows included sites that had both and simply would not show us. The audit tells the two apart, and 19 of these 483 refused us outright.
The ones that would not answer us
Some sites did not return a usable page to our crawler at all. They open fine in a browser. The owners have no idea, because their own browser is never the thing being refused.
The last version of this study would not put a number on that, because a server refusing a crawler and a server with nothing to give it looked identical in our records. We changed the audit so a refusal is recorded as a refusal, with the status and the server that sent it, and said the next run could count it honestly. This is that run.
We tried 604 websites and could not measure 58 of them. Forty-six answered with a security challenge instead of the page: not broken, not down, simply refusing anything that is not a person with a browser. The rest returned an error of their own or failed at our end.
This is the one that costs real money, and it is worth being precise about whose fault it is. A site a search engine cannot fetch is not ranked lower, it is absent. In almost every case here the owner has done nothing wrong and has no idea, because their own browser is never the thing being refused. It is a setting on their hosting.
Those 58 are not in any figure on this page. Counting a site we could not read as a site that failed a check is the exact mistake this study exists to avoid.
The mobile one turned out to be rare
9 sites (2%) 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, so those nine businesses are serving that person a page they have to fight. But an earlier version of this study, on a smaller and dirtier set, reported fourteen percent. On 483 real trade websites it is two. We would rather correct that in public than keep the more alarming number.
The AI blocking number is smaller than anyone says, including us
4 sites (1%) block at least one AI crawler. One blocks GPTBot, the one ChatGPT uses. One blocks ClaudeBot. The most blocked of the lot is CCBot, on two.
We expected higher, and last time we published a higher number. On a re-audit it fell from fifteen sites to four, and the reason is us: our own reading of robots.txt was wrong. Eleven sites we had recorded as blocking six crawlers each turned out to block nothing at all when we fetched their files by hand. There is a lot of noise about trade websites being invisible to AI assistants. On this evidence it is about one site in a hundred, not 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 four is four, and we would rather publish that than a number that sounds better.
The AI problem that is real
Blocking is rare. Being unreadable is not. We also measure how much of a page exists before any JavaScript runs, because an assistant reads what the server sends rather than what a browser paints.
Thirty-three sites have half or more of their words appearing only after JavaScript has run, and 57 have a third or more. An assistant asked about one of those businesses is working from a fraction of the page. Nobody blocked anything. The content is simply not there at the moment it is looked for.
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. There is a free plan with no card on it, and it is not a trial that runs out.
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.
You can run the same checks on your own site now, without an account. No sign-up, no email to look, about a minute.