Content negotiation
Serve clean markdown and cut token cost by 90%.
Read →Agent view — served from /javascript-and-ai-crawlers.md.
Guide · updated September 2026
Most do not. AI crawlers typically fetch raw HTML and never run your JavaScript, so any content that appears only after the page hydrates is invisible to them. On a single-page React, Vue or Angular application this frequently means the crawler receives an empty shell where your product and pricing should be.
Whatever your server returns before any script executes. If you use server-side rendering or static generation, that is your full page and you are fine. If you render on the client, it is often a div with an id and nothing inside it.
<!DOCTYPE html>
<html>
<head><title>Acme</title></head>
<body>
<div id="root"></div>
<script src="/static/js/main.8f2a1c.js"></script>
</body>
</html>There is no headline, no product description, no price. An assistant asked about your company falls back on whatever else it can find — usually a directory listing, a years-old press release, or a competitor’s comparison page that mentions you unfavourably.
Three ways, in ascending order of effort. Fetch the raw HTML and read it. Disable JavaScript in your browser and reload. Or use our Agent View tool, which shows the rendered page and the crawler’s view side by side.
$ curl -s https://yourdomain.com/pricing | wc -c $ curl -s https://yourdomain.com/pricing | grep -o "<h1>.*</h1>"
If the byte count is small and the grep returns nothing, your H1 does not exist until JavaScript runs. That is the whole diagnosis.
The framework matters less than the rendering mode you chose within it. Next.js and Nuxt render on the server by default and are usually fine; the same frameworks in a fully client-side configuration are not.
| Setup | Default behaviour | Risk |
|---|---|---|
| Create React App / Vite SPA | Client-side only | High |
| Angular without SSR | Client-side only | High |
| Vue SPA without Nuxt | Client-side only | High |
| Next.js App Router | Server components | Low |
| Nuxt 3 universal | Server-rendered | Low |
| Astro / Eleventy / Hugo | Static HTML | None |
| WordPress, Shopify, Webflow | Server-rendered | None |
A common false positive: a mostly server-rendered site with one critical component — pricing tables and product specifications are the usual suspects — loaded client-side after a data fetch. The page passes a casual check and still hides the fact that matters most.
Four options, roughly in order of how much work they are.
If a full migration is not realistic this quarter, static-generate the ten pages that describe what you sell. That captures most of the benefit for a fraction of the work.
Yes, and this is where teams get caught out. Google has run a rendering pipeline that executes JavaScript for years, so a client-rendered site can rank in Google while being invisible to AI crawlers that do not render.
That is precisely why the problem goes undetected: Search Console looks healthy, rankings hold, and AI-sourced traffic quietly never arrives. Your SEO tooling is not lying to you, it is measuring a different crawler.
Crawler capabilities are not published in detail and they change. Some AI crawlers may render JavaScript in some circumstances, and any absolute claim about a specific bot on a specific date should be treated cautiously — including ours.
What is not in dispute is the direction of the risk. Server-rendered content is readable by every crawler including the ones that render. Client-rendered content is readable only by some. There is no scenario where rendering client-side is the safer choice.
Questions
Most AI crawlers fetch raw HTML without executing JavaScript. Capabilities are not published in detail and may change, but content that requires JavaScript to appear is at minimum at risk of being invisible, whereas server-rendered content is readable by every crawler.
Google has executed JavaScript in its rendering pipeline for years. Many AI crawlers do not. A client-rendered site can therefore rank normally while returning an empty page to the crawlers that feed AI assistants.
Not strictly, but it is the most reliable fix. Static generation works equally well for content that does not change per request. Prerendering for bots and markdown mirrors are partial mitigations.
Fetch the page with curl and check whether your headline and body copy are present in the returned HTML, or disable JavaScript in your browser and reload. If the page is empty, crawlers that do not render see the same thing.
No. A mostly server-rendered site with one client-loaded component has the same problem for that component. Pricing tables and product specifications are the most common casualties, and they are usually the pages that matter most.
Eight checks against your domain in about fifteen seconds. No email.