Stop serving blanks to bots An analysis of the HTTP Archive's 1 August 2026 mobile crawl, covering 17.2 million pages, found that about 32% of pages serve incomplete content to non-rendering AI crawlers, with roughly 9% delivering under half their content and 21% delivering under 80%. The study attributes the gap to client-side JavaScript rendering, which AI systems such as those feeding ChatGPT, Claude, Perplexity and Google's AI answers ignore, taking only the initial server response. The author concludes that sites should ensure the representation given to AI systems is "complete, traversable and economical to consume" before worrying about ranking or citations. It may change in the future but nearly all sites today are built for people - you click a link, a browser does a bunch of work and a page appears. This has been the way for thirty plus years but times are rapidly changing while you yearn for a revival of Geocities… A large and growing share of the requests hitting our sites now come from AI systems: the crawlers that feed ChatGPT, Claude, Perplexity and Google’s AI answers along with the assistants that fetch a page on the spot because someone asked them a question. These aren’t browsers and they don’t behave like them, for most sites what these bots come away with isn’t what you’d actually want them to have probably . I went down a bit of a rabbit hole this weekend and I decided to try to measure what agents might be getting using publicly available data via the HTTP Archive https://httparchive.org/ project for some initial data and I also looked at a few external studies as well for good measure. I wanted to see what happens for an agent/bot when a page arrives in the state that the data says it does and how widespread that is or isn’t. TL/DR: Before worrying about whether an AI system ranks or cites you, make sure the representation you’re giving it is complete, traversable and economical to consume. I used data from the HTTP Archive https://httparchive.org/ August 2026 crawl httparchive.crawl.pages and httparchive.crawl.requests , used under CC BY 4.0. I looked at the 1 August 2026 crawl as a snapshot for mobile and clean test runs only. This gave me content for 17.2 million pages and links on 21 million. I then excluded any failed test runs 21.8% , pages rendering under 100 words and pages where the raw HTML held more than the rendered page. My filters deliberately narrow this to content bearing pages where the rendered version adds text and so the results shouldn’t be read as a measurement of every type of web page. This isn’t a new problem and I’m building on work others have already done. HTTP Archive’s Web Almanac has looked at raw vs rendered content for years, SearchVIU did a rendered vs source study back in 2020 and Vercel/MERJ and others have done a lot of the groundwork on rendering and crawler behaviour. I’m joining some of those pieces together out of curiosity to see how widespread they might be. I’m also only measuring structure and not quality so the actual content on a site may be utter rubbish. For example, things like word count will tell me how much text differs but not whether the missing text is important. A lot of modern websites don’t arrive as finished pages, they instead start as an empty frame with a set of instructions for the visitor’s browser to follow to build the page - this is client side rendering typically using JavaScript in whatever flavour of framework you want. It’s what most site platforms do today by default and for a human with a browser it works just fine. AI readers don’t follow those instructions, instead they ask for the page, take whatever comes back in that first response and then leave assuming they got everything. They more or less ignore the JavaScript so your site may be super quick for us humans but you’re serving blanks to these crawlers. HTTP Archive crawls millions of sites a month and gives me both the HTML the server sent and the page after the JavaScript has run. This allows us to see the difference for what a non-rendering bot may see vs a human and how widespread it is. All told, about 32% of all pages should probably have a look taken at them by varying degrees of urgency. There’s definitely also a grey area here with cloaking since you can be showing bots one thing and a human another. Most of the web is fine with about two thirds of pages serving 90% of the content to bots. But, ~9% of the pages serve under half their content and 21% serve under 80% which is to say any optimisation being done is not being seen. For the bot a partial page doesn’t look partial even if there’s a heading and nothing beneath it or a sentence that stops halfway, they can’t really tell if anything is missing. There’s no error or warning so the crawler has no reason to think it received anything but the whole thing. Vercel and MERJ went through over 500 million requests https://vercel.com/blog/the-rise-of-the-ai-crawler from OpenAI’s crawler and found no evidence that it ever ran the JavaScript. Anthropic’s, Perplexity’s and Meta’s crawlers behave in the same way. The only real exceptions are Apple who use a browser based crawler and Google who’ve spent a decade and a great deal of money building the ability to do this and even then it takes a second pass and a delay. So if the content, product descriptions, prices, etc only appear after the browser has done its work then there’s a good chance that the AI systems that everyone is now optimising for are looking at a blank frame where your content should be. Instead, have the server send a finished page also known as server side rendering . It depends on how this is implemented and it may not cost much in visitor experience but it’s worth doing whether or not you care about anything else in this article. The issue with this is speed or more precisely, the perception of speed, as rendering from the server can feel slower than if it happened on the client e.g. Time to First Byte . Crawlers find pages by following links so if a page’s links are built in the browser, a crawler that doesn’t run JavaScript may miss parts of the site. This can also show up in an agents query fan out process or a RAG ingestion pipeline where a non-rendering crawler can’t traverse onward from this HTML response using links contained in that response. Around 39% of pages are probably worth checking for how their internal linking is or isn’t being seen and some pages more so than others. Additionally, in this view, one in fifteen pages is a dead end and 1.36 million pages have no crawlable links in their HTML with 169,377 of those serving their text perfectly well. For an agent this may be the one that does the most damage as it can’t distinguish a genuine dead end from a page whose navigation didn’t show up. It stops as there’s nothing about the page to suggest that anything went wrong and then depending on the page, it then may not discover large amounts of your site. The obvious objection to this is that the missing links are just navigation, repeated everywhere and reachable from another page anyway. When I restricted to internal links then the figure only dropped from 6.5% to 5.9%, meaning that they’re likely genuinely missing but I would need full crawls of each site to validate this. Quantity doesn’t equal importance, losing 10% of the links may remove the only route into an entire section of the site or irrelevant boilerplate and that can’t be stated from this data. Let’s say we’ve solved that rendering issue and the AI system can now read the page. Great What it receives though is the article or product description wrapped in an enormous amount of scaffolding: navigation, menus, footers, cookie banners, tracking pixels, styling and so on. None of it’s of any interest though to a machine that has to answer my inane late night questions. AI systems have a budget for how much they can take in at once and that scaffolding gobbles it all up. Cloudflare’s figures https://blog.cloudflare.com/markdown-for-agents/ suggest a blog post that costs around 16,180 tokens as a normal web page instead costs about 3,150 tokens as plain text which is roughly an 80% saving for the identical information based on that data. A sophisticated crawler can already strip HTML, boilerplate and scripts by itself so this isn’t necessarily an 80% context window saving at inference time. The inefficiency is that every consumer has to download and perform that extraction independently. But what about semantic markup? Yes it’s good to use