No major AI crawler runs your JavaScript. Here is how to check in one command.
Summary
Vercel and MERJ reported in December 2024 that no major AI crawler executes JavaScript: GPTBot requested JavaScript files 11.5% of the time and ClaudeBot 23.8%, and neither ran them. Gemini and Applebot are exceptions because they reuse existing rendering infrastructure. The practical consequence is that whatever appears in the initial HTML response is the entire content of the page as far as most AI crawlers are concerned. A single curl command with a crawler user-agent tells you which situation you are in, and the fix is usually smaller than a rebuild.
What did Vercel and MERJ actually find?
In December 2024, Vercel and MERJ published an analysis of AI crawler behaviour and reported that none of the major AI crawlers execute JavaScript. GPTBot requested JavaScript files 11.5% of the time and ClaudeBot 23.8%, but neither ran them — they downloaded the files and treated them as text. Google's Gemini and Applebot were the exceptions, because both reuse rendering infrastructure that already existed for classic search.
That is a narrower claim than "AI cannot read your site", and the difference matters. It does not mean your site is invisible. It means that whatever a crawler receives in the initial HTML response is the entire content of your page as far as that crawler is concerned.
Why this outranks almost every other technical fix
Most technical work moves a page's chances at the margin. This one is binary. If your content is injected by JavaScript after load, a crawler that does not run scripts receives a near-empty document — a shell, a loading state, maybe a navigation menu. There is nothing to chunk, nothing to embed, nothing to retrieve and nothing to cite.
It also fails silently. Your analytics look normal because human browsers render fine. Your rankings may be unaffected, because Googlebot does render JavaScript. The only symptom is absence from answers you were never watching in the first place.
How to check, in one command
Request the page with a crawler's user-agent, do not execute anything, and search the returned HTML for a phrase you know is on the page:
curl -A "GPTBot/1.2 (+https://openai.com/gptbot)" https://example.com/your-page -s | grep -i "a phrase from your page"If the phrase comes back, the content exists in the initial response. If nothing comes back, it does not — and that is the whole finding. Run it against your homepage, one service page, and one blog post, because different templates often render differently.
Two notes on interpreting it. Use a phrase from the body copy rather than the title, since titles are often server-rendered even when body content is not. And check a page that loads content on scroll separately, because lazy-loaded sections frequently fail even when the top of the page passes.
What to do with each outcome
| Result | What it means | What to do |
|---|---|---|
| Phrase found on every template | Content is server-rendered. This is not your problem. | Move on to entity and passage structure. |
| Found on some templates, not others | Mixed rendering — common when a marketing site and an app share a framework | Identify which templates fail and convert those to static or server rendering. |
| Nothing found anywhere | Client-rendered. Most AI crawlers see an empty page. | Fix rendering before any content work. Everything else is premature. |
The fix is usually smaller than it sounds
"Server-side rendering" sounds like a rebuild and usually is not. Next.js, Nuxt, SvelteKit and Astro all have static-generation or server-rendering modes for exactly this, and marketing pages are typically the easiest part of an application to convert because they rarely depend on user state. The expensive scenario is a hand-rolled single-page application with no framework support, and even then the pages that matter for retrieval are usually the static ones.
On a hosted platform — Shopify, Webflow, WordPress — templates are server-rendered by default, and the usual culprit is a third-party app or widget injecting content client-side. Check what is inside the missing region before assuming the platform is at fault.
What this test does not tell you
It does not tell you whether you will be cited. It tells you whether you are eligible to be. A page that passes this test can still be ignored for being generic, poorly structured, or attached to an organisation the engine cannot identify. But a page that fails it cannot be cited at all, which is why it is worth spending ten minutes on before anything else.