A tactical guide to JavaScript rendering for AI crawlers: testing, SSR/SSG/ISR choices, blind spots and CI checks.
JavaScript rendering for AI crawlers decides whether ChatGPT, Claude, and Perplexity can read your pages at all. GPTBot, ClaudeBot, and PerplexityBot fetch your raw HTML and stop there. They never run your scripts. If your pricing, feature tables, or customer proof load through React, Vue, or Angular after the first response, those crawlers receive an empty shell and cite someone else.
This guide shows you how to test what each AI crawler sees, which rendering strategy fixes the gap, and which page elements stay invisible even after you switch to server-side rendering.
No. The dedicated crawlers behind ChatGPT, Claude, and Perplexity read static HTML only. Google's Gemini, which draws on Googlebot's rendered index, and Apple's AppleBot are the two exceptions.
Vercel and MERJ analyzed crawler traffic across nextjs.org and two job board sites in December 2024. They found that none of OpenAI's crawlers (GPTBot, OAI-SearchBot, ChatGPT-User), Anthropic's ClaudeBot, PerplexityBot, Meta-ExternalAgent, or Bytespider executed JavaScript. GPTBot downloaded JavaScript files in 11.50% of its requests and ClaudeBot in 23.84%, but neither ran them.
searchVIU tested 32 AI crawlers across 1.3 billion requests in November 2025 and reached the same result: only Googlebot, Google-Extended, and Applebot render JavaScript. A January 2026 server-log study from EdgeComet found GPTBot's script execution "extremely limited" rather than zero, which changes nothing in practice.
You should plan as if every non-Google AI crawler sees your page with JavaScript switched off.
Googlebot renders JavaScript before indexing, so a client-rendered page can rank well in Google while ChatGPT and Claude see nothing on it. Your Google rankings measure Google's renderer. They tell you nothing about crawlers that skip rendering.
RESONEO ran a sentinel test in January 2026. The team built a page with 15 content injection methods, each carrying a unique string, then asked each AI assistant to fetch it and report what it found. ChatGPT-User, Claude-User, and Gemini's on-demand fetcher all read static HTML and <noscript> content. None of them saw inline JavaScript, delayed JavaScript, or content loaded through fetch() calls.
The same study found that Google AI Mode does not fetch URLs live. It answers from the Google Search index alone. That means two separate fixes apply: get indexed by Google for AI Mode and AI Overviews, and serve readable HTML for every other engine.
You lose the content buyers ask AI about most: pricing, feature comparisons, customer proof, and review scores. On a typical SaaS site, those modules load after the page shell, through API calls or third-party widgets.
searchVIU tested whether five AI systems could extract pricing that only appeared through JavaScript (October 2025). Gemini succeeded 50% of the time, ChatGPT 37.5%, Google AI Mode 25%, Perplexity 12.5%, and Claude 0%.
Audit these elements first on your site:
Adobe scored retail page types for machine readability in April 2026: homepages reached 75% and product pages 66%. The pages closest to a buying decision were the hardest for machines to read.
Content on a JavaScript-heavy page falls into three tiers: rendered HTML, embedded script JSON, and content absent from the response. Only the first tier is reliable for AI crawlers.
MarketerFirst defined these tiers in an August 2026 test of product pages from Best Buy, Home Depot, Wayfair, and Target:
Between 49% and 89% of the visible text blocks on those four pages sat outside Tier 1. Target scored worst: only 22 of 194 text blocks (11%) appeared in readable HTML, and the price was missing from both the HTML and the structured data. Vercel's 2024 study adds one nuance: JSON in the initial response "may still be indexed," which is why Tier 2 counts as unreliable, not invisible.
Fetch your page the way a crawler does, without a browser, and search the raw response for the phrases that matter. You can run the full check in five minutes.
curl -s -A "GPTBot" https://yoursite.com/pricing | grep -i "per month". No output means GPTBot cannot read your pricing.Some CDNs and WAFs return different responses by user agent, so test with each crawler token you care about.
Choose static site generation for content that changes on a release cycle, server-side rendering for pages with live data, and incremental static regeneration for large page sets. All three put full text in the first HTML response.
| Strategy | What AI crawlers see | Best fit for B2B sites |
|---|---|---|
| Client-side rendering (CSR) | Page shell, empty containers | Logged-in app views only |
| Server-side rendering (SSR) | Full content on every request | Pricing pages, integration directories with live data |
| Static site generation (SSG) | Full content, fastest response | Blog posts, docs, comparison pages, landing pages |
| Incremental static regeneration (ISR) | Full content, refreshed on a timer | Large template sets such as use-case or industry pages |
| Hydration payload only | Unreliable (Tier 2) | Avoid for any text you want cited |
Vercel's 2024 guidance draws the line at critical content: articles, product information, documentation, titles, descriptions, and navigation belong in server output. View counters, chat widgets, and social feeds can stay client-side. Next.js, Nuxt, SvelteKit, and Astro all support these modes, so the fix sits in configuration and routing.
Fix the highest-value templates first and move only the text that buyers ask about into server output. Most teams can close the gap in three moves.
Then rerun the curl test from your terminal and confirm each phrase appears in the raw response.
Monitor your progress with Nobori. Track citation rates for your pricing and comparison prompts before and after each template fix, so you can see which engines start citing the pages you repaired.
Shadow DOM content, iframes, hidden modals, and content delayed past a crawler's timeout stay invisible to most AI fetchers, even on a server-rendered page. These patterns break extraction for reasons unrelated to JavaScript execution.
RESONEO's January 2026 sentinel test documented each blind spot:
The same test found that Perplexity-User sent empty Accept-Encoding headers and failed to decode compressed responses. RESONEO recommends serving uncompressed HTML to requests with an empty Accept-Encoding header.
No. JSON-LD helps Google's systems and may help indexing bots, but user-triggered AI fetchers skip it. Every fact in your schema needs a visible HTML twin.
RESONEO found that ChatGPT-User, Claude-User, and Gemini's fetcher did not extract JSON-LD from script tags in January 2026. searchVIU reported that zero of five AI systems extracted information that existed only in JSON-LD across eight schema scenarios. Microdata, which lives inside visible HTML elements, passed the RESONEO test for every HTML-only agent.
Treat schema as a reinforcement layer. Keep your schema markup for AEO in place, and confirm that the price, plan names, ratings, and FAQ answers it declares also appear as text on the page. When the two disagree, the visible text is what AI fetchers quote.
Fix stale asset paths, keep sitemaps current, and collapse redirect chains. AI crawlers hit broken URLs far more often than Googlebot, and every failed fetch is a page they did not read.
Vercel's December 2024 data showed ChatGPT spending 34.82% of its fetches on 404 pages and Claude 34.16%. ChatGPT spent another 14.36% following redirects. Googlebot, by comparison, spent 8.22% of fetches on 404s and 1.49% on redirects. Many of the failed AI requests targeted outdated files in /static/ folders.
Run this cleanup each quarter:
Pair this with the crawl-to-refer ratio to see which crawlers turn fetches into referrals.
Add a no-JavaScript check to your deployment pipeline. Rendering regressions produce no error message, so a release can erase your pricing from AI crawlers and nobody notices until citations drop.
Build the check in three parts:
Structure still matters once the text is readable. Apply the chunk-first framework so each section survives extraction as a standalone answer.
Monitor your progress with Nobori. Daily citation tracking shows whether a release changed how ChatGPT, Claude, Perplexity, Gemini, and Google AI Overviews describe your product.
Rendering fixes happen in your codebase, but the proof shows up in AI answers. Nobori tracks your brand across ChatGPT, Google AI Overviews, Perplexity, Gemini, and Claude every day, using the prompts your buyers ask. When you move pricing or comparison content into server output, you see which engines start citing those pages and which still ignore them.
Engine-level data tells you where to look. If Gemini cites your pricing page and ChatGPT never does, the gap points to a rendering problem, because Gemini draws on Google's rendered index while ChatGPT reads raw HTML. Nobori's competitive view shows which rival pages get cited for the same prompts, so you can compare your raw HTML against theirs.
Nobori turns those gaps into tasks your team can ship. Each task links a prompt, an engine, and the page that should win it.
See if AI engines are citing you → nobori.ai