October 2, 2026

JavaScript Rendering for AI Crawlers: Make Your Site Readable to ChatGPT and Claude (2026)

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.

Do AI crawlers support JavaScript rendering in 2026?

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.

Why doesn't a strong Google ranking prove AI crawlers can read your page?

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.

What content do B2B sites lose to client-side rendering?

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:

  • Pricing tables that render from a pricing API or a plan selector
  • G2, Capterra, or Trustpilot review widgets embedded through third-party scripts
  • Customer logo strips and testimonial carousels
  • FAQ accordions that fetch answers when a visitor opens them
  • Comparison tables built by a frontend component from JSON

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.

What are the three tiers of AI crawler visibility?

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:

  • Tier 1, rendered markup: text inside real HTML elements in the server response. Strip the tags and the text remains.
  • Tier 2, script JSON only: text inside a hydration payload, such as a Next.js data blob. Some extraction pipelines discard <script> contents, so treat this tier as unreliable.
  • Tier 3, absent: text the browser requests after load through a separate API call. Non-rendering crawlers never receive it.

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.

How do you test JavaScript rendering for AI crawlers on your own site?

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.

  1. Request the page as GPTBot. Run curl -s -A "GPTBot" https://yoursite.com/pricing | grep -i "per month". No output means GPTBot cannot read your pricing.
  2. Strip the tags. Pipe the same response through a text extractor and read what remains. If you see navigation links and empty headings, your page fails.
  3. Disable JavaScript in Chrome. Open DevTools, press Cmd/Ctrl+Shift+P, type "Disable JavaScript", and reload. Anything that disappears depends on client-side execution.
  4. Check Tier 2 exposure. Search the raw HTML for your key phrase inside <script> tags. If it appears only there, move it into visible markup.
  5. Repeat across templates. Test one homepage, one pricing page, one comparison page, one docs page, and one blog post. Rendering bugs live in templates, so one test per template covers every URL built on it.

Some CDNs and WAFs return different responses by user agent, so test with each crawler token you care about.

Which rendering strategy should you choose for AI search: SSR, SSG, or ISR?

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.

StrategyWhat AI crawlers seeBest fit for B2B sites
Client-side rendering (CSR)Page shell, empty containersLogged-in app views only
Server-side rendering (SSR)Full content on every requestPricing pages, integration directories with live data
Static site generation (SSG)Full content, fastest responseBlog posts, docs, comparison pages, landing pages
Incremental static regeneration (ISR)Full content, refreshed on a timerLarge template sets such as use-case or industry pages
Hydration payload onlyUnreliable (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.

How do you fix a client-rendered React or Vue site without a full rewrite?

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.

  1. Server-render the money modules. Move pricing copy, plan limits, feature tables, and the top five testimonials into server components or static props. Leave interactive toggles client-side, but render a default state in HTML.
  2. Add <noscript> fallbacks where you cannot refactor yet. RESONEO's 2026 test found that ChatGPT-User, Claude-User, and Gemini all read <noscript> content. Place a plain-text version of the module inside it.
  3. Prerender for bot user agents as a stopgap. A prerendering service or edge function can serve a rendered snapshot to GPTBot, ClaudeBot, and PerplexityBot. Serve the same content humans see, or you risk cloaking penalties in Google.

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.

Which page elements stay invisible to AI crawlers even with server-side rendering?

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:

  • Shadow DOM: no HTML-only fetcher read open or closed shadow roots. Only Bing Copilot read open-mode Shadow DOM. Pass important text through slots in the light DOM.
  • Iframes: ChatGPT, Claude, and Gemini ignored iframe content. Embedded demos, calculators, and booking forms need a static text description next to them.
  • Modals hidden with display:none: no tested agent extracted them. Put pricing details and terms inline on the page.
  • Delayed content: Grok waited about two seconds and Bing Copilot about 53 milliseconds. Content that arrives later reaches no one.

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.

Does JSON-LD schema replace server-rendered text for AI crawlers?

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.

How do you stop AI crawlers from wasting fetches on broken URLs?

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:

  • Pull 404s by user agent from your server or CDN logs and redirect the top 50 to live equivalents
  • Replace multi-hop redirects with single 301s
  • Regenerate your XML sitemap on every deploy and remove retired URLs
  • Keep content URLs stable when you rebuild the site in a new framework

Pair this with the crawl-to-refer ratio to see which crawlers turn fetches into referrals.

How do you keep AI crawler readability from breaking after each release?

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:

  1. Define a phrase list per template. For the pricing page, list plan names, the starting price, and two feature names. For comparison pages, list each competitor name and your key differentiator.
  2. Fetch without a browser in CI. Request each template URL with a plain HTTP client and a GPTBot user agent, strip the tags, and assert every phrase appears. Fail the build if one is missing.
  3. Watch live fetches in your logs. ChatGPT-User and Claude-User requests mean a real user prompt pulled your page. A drop in those hits after a deploy points to a rendering or blocking regression.

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.

How Nobori Helps You Execute This

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

Recent blogs