TL;DR: We measured the homepages of 191 companies that sell websites to small businesses. 56% emit no structured data at all. 26% have no H1. 16% have no meta description. 30% take more than a second to respond. These are the people selling SEO.
There is a particular kind of claim that is easy to make and hard to check: that the average small agency does not practise what it sells.
So we checked. On 2026-08-15 we fetched the homepage of 191 companies that build websites for small and local businesses, and recorded what came back. This is what the raw HTML says.
What we measured and what we did not
One HTTPS GET per homepage, from one machine, following redirects, with a 15 second timeout. We read the response headers and the HTML that came back. We did not run JavaScript, we did not log in, and we did not crawl beyond the homepage.
Not running JavaScript is deliberate rather than lazy. The AI crawlers that increasingly decide who gets cited, including GPTBot, ClaudeBot and PerplexityBot, have been observed across hundreds of millions of fetches doing no JavaScript execution at all. Anything that only exists after hydration is invisible to them. Measuring the raw response is measuring what those crawlers see.
The universe: 191 companies, drawn from a lookalike set seeded from our own site, so every one sells custom websites to small businesses. Nine parked domains, test hosts and platform subdomains were excluded and are named in the dataset. 17 of the 191 did not respond at all and are reported below rather than quietly dropped, because dropping the unreachable ones would make the survivors look faster than the population is.
That leaves 174 reachable homepages.
The finding that surprised us
97 of 174 homepages, 56%, emit no structured data whatsoever.
Not thin structured data. None. No JSON-LD block of any kind, so no Organization, no LocalBusiness, no BreadcrumbList, nothing telling a search engine what the business is.
Structured data is not a ranking factor and we would not pretend otherwise. Its job is to make an entity legible: this is a company, this is its name, this is where it operates. On a page whose entire purpose is to say "we do SEO", leaving it out is a strange omission.
The rest of the basics
Of the 174 reachable homepages:
| Missing | Count | Share |
|---|---|---|
| No structured data | 97 | 56% |
| No Open Graph tags | 47 | 27% |
| No H1 at all | 45 | 26% |
| No meta description | 27 | 16% |
| More than one H1 | 17 | 10% |
| No compression | 8 | 5% |
| No mobile viewport tag | 5 | 3% |
| Not on HTTPS | 1 | 1% |
The H1 number is the one worth sitting with. 45 homepages have no H1 element at all. That is not a subtle configuration mistake. It is the single most basic on-page signal there is, it takes one line to fix, and a quarter of the field does not have one.
Only 57 of 174, 33%, pass all four of: has structured data, has a meta description, has exactly one H1, has Open Graph tags. Two thirds of the agencies selling this work fail at least one.
22 sites, 13%, have neither structured data nor a meta description.
Response time
Median time to first byte was 716ms. The spread:
| TTFB | |
|---|---|
| 25th percentile | 411ms |
| Median | 716ms |
| 75th percentile | 1,202ms |
| 90th percentile | 1,849ms |
| Slowest | 6,373ms |
52 of 174, 30%, took more than a second. Seven took more than two and a half.
Now the caveat that matters, and it is a real one. This is a single request from a single location on a single day. Response time is the least stable thing we measured. Two of our own pages showed 26 seconds in a third-party crawl and under one second an hour later, which is a cold start rather than a slow site.
So treat the distribution as directional and treat any individual reading as a snapshot. The structural findings, whether a page has an H1 or emits schema, do not move like this. A site without structured data at 9am does not have it at 5pm.
The 17 that did not answer
16 failed to connect and one timed out after 15 seconds. That is 9% of the companies in this set unreachable at the moment we asked.
We are not naming them and we are not calling them dead. A single failed request proves very little: DNS can lag, a host can blip, a firewall can dislike an unfamiliar user agent. What it does mean is that any list of small agencies has real churn in it, and that a study which silently dropped these would be reporting on the survivors while implying it covered everyone.
Where we came out
Wildcore is in the dataset, measured the same way. 579ms, 64th of 174 on response time, against a median of 716ms. Above the middle and nowhere near the top. We are including our own number because a study that grades everyone else and quietly omits the author is not a study, it is an advertisement.
What we deliberately did not conclude
We expected to find that agencies promising fast turnaround have faster sites. The 45 promising 48 hours or less had a median TTFB of 639ms against 511ms for the 29 promising longer.
We are not reporting that as a finding. Those groups are small, the intervals overlap, and the correct description of two overlapping distributions is that they are statistically indistinguishable. It would have made a better headline and it would not have been true.
Similarly, we cannot tell you whether any of this affects those agencies' rankings. We measured what their pages contain. We did not measure their traffic, their clients, or their revenue, and a page can be technically sloppy and commercially excellent.
What it means if you are hiring one
You can run the same checks yourself before you sign anything. View source on the homepage and search for application/ld+json, then for <h1. It takes ten seconds and it tells you whether the person selling you SEO has done the free part on their own site.
That is not a complete test of an agency. Plenty of good designers do not think about schema markup and their clients are perfectly happy. But if the pitch is specifically technical SEO, the homepage is the portfolio.
We built a free tool that runs these ten checks on any site, including ours, if you would rather not read HTML. It compares your result against the numbers above.
Reproducing this
The measurement script and the full dataset, including the excluded domains and the failures, live in our repository. Every figure in this post traces to scripts/data/competitor-audit.json, extracted 2026-08-15. If you re-run it you will get different response times, because response times move, and roughly the same structural numbers, because those do not.
If you find an error in it, tell us and we will correct it visibly. That is the standard we hold ourselves to on everything else here, and it is written up on our methodology page.
Related reading: what schema markup actually does, why page speed matters, and the local SEO checklist.
