Key Takeaways
- Most AI crawlers (GPTBot, PerplexityBot, ClaudeBot) do not execute JavaScript — they see only the raw HTML your server delivers
- Server-side rendering (SSR) delivers complete content in the initial HTML response, making it immediately visible to all AI crawlers
- Client-side rendering (CSR) delivers an empty HTML shell — AI crawlers that cannot run JavaScript see no content at all
- Use SSR or static site generation (SSG) for all content pages you want AI to discover and cite
- Hybrid rendering is the practical ideal: SSR for content pages, CSR only for interactive features AI does not need to see
Can AI crawlers see your JavaScript content? Run a free scan to check what AI bots actually see on your pages.
Table of Contents
The Rendering Problem for AI Crawlers
When an AI crawler like GPTBot requests a page from your website, it receives an HTTP response containing HTML. What happens next depends on your rendering strategy:
With server-side rendering, the HTML response already contains your complete page content — headings, paragraphs, images, structured data, everything. The AI crawler reads this HTML and understands your content immediately.
With client-side rendering, the HTML response contains a minimal shell — typically a <div id="root"></div> — and a JavaScript bundle. The actual content is generated when the browser executes the JavaScript. The problem: most AI crawlers do not execute JavaScript. They see the empty shell and move on.
This is not a minor issue. A website built entirely with client-side rendering (a common pattern with React, Vue, or Angular SPAs) can be completely invisible to ChatGPT, Perplexity, Claude, and Copilot. The site looks beautiful to human visitors but is an empty page to AI.
For a deep dive into JavaScript rendering issues, see our JavaScript rendering and AI crawlers guide.
SSR: What AI Crawlers See
Server-side rendering generates the complete HTML on the server before sending it to the client. When an AI crawler requests an SSR page, the server processes the request, fetches any necessary data, renders the component tree to HTML, and sends the full document.
What GPTBot sees with SSR
<!DOCTYPE html>
<html>
<head>
<title>Best CRM Tools for Startups in 2026</title>
<meta name="description" content="Compare the top 10 CRM tools...">
</head>
<body>
<h1>Best CRM Tools for Startups in 2026</h1>
<p>Choosing the right CRM can make or break a startup's sales process...</p>
</body>
</html>
Every heading, paragraph, list item, table, and structured data element is present in the initial HTML. The AI crawler can immediately extract, understand, and potentially cite this content.
SSR advantages for AI SEO
- Complete content delivery — All text, structure, and metadata available without JavaScript
- Faster response times — No client-side rendering delay; content available in the first response
- Schema markup visible — JSON-LD structured data is in the HTML, not injected by JavaScript
- Consistent with semantic HTML — Server-rendered HTML typically follows better semantic HTML patterns
CSR: The AI Visibility Gap
Client-side rendering defers HTML generation to the browser. The server sends a minimal HTML document with a JavaScript bundle, and the browser builds the page content by executing the script.
What GPTBot sees with CSR
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
</head>
<body>
<div id="root"></div>
<script src="/bundle.js"></script>
</body>
</html>
This is what most AI crawlers see — an empty page. No content, no headings, no structured data, no information to cite. Your 3,000-word product comparison guide exists only after JavaScript execution, which the AI crawler cannot perform.
The Google exception
Googlebot is the notable exception. Google has invested heavily in a JavaScript rendering service (WRS) that can execute JavaScript and index the resulting content. However, this rendering happens in a separate queue with potential delays. For AI Mode specifically, Google may prefer pre-rendered content over content that requires its rendering pipeline.
Which AI crawlers execute JavaScript?
| Crawler | Executes JavaScript | Impact | |---|---|---| | GPTBot | No | CSR pages are invisible | | OAI-SearchBot | No | CSR pages are invisible | | PerplexityBot | No | CSR pages are invisible | | ClaudeBot | No | CSR pages are invisible | | Googlebot | Yes (delayed) | CSR pages eventually indexed | | Bingbot | Limited | CSR pages may be partially visible | | Applebot | Limited | CSR pages may be partially visible |
Rendering Comparison Table
| Factor | SSR | CSR | SSG | ISR | |---|---|---|---|---| | AI crawler visibility | Excellent | None/poor | Excellent | Excellent | | Initial HTML content | Complete | Empty shell | Complete | Complete | | JavaScript required | For interactivity only | For all content | For interactivity only | For interactivity only | | Response speed | Fast (server-rendered) | Slow (requires JS + API) | Fastest (pre-built) | Fast (cached) | | Content freshness | Real-time | Real-time | Build-time | Configurable | | Server load | Higher (renders per request) | Lower (static files) | Lowest (pre-built) | Medium (periodic) | | Best for | Dynamic content pages | App dashboards | Blog posts, docs | Product pages, listings |
SSG = Static Site Generation (HTML built at deploy time) ISR = Incremental Static Regeneration (static pages rebuilt on a schedule)
Framework-Specific Guidance
Next.js (React)
Next.js supports all rendering modes. For AI SEO:
- Use
getServerSidePropsfor pages with frequently changing content (product pages, pricing) - Use
getStaticProps/generateStaticParamsfor content that changes infrequently (blog posts, docs) - Use ISR (
revalidateoption) for pages that need periodic updates without full rebuilds - Avoid client-only data fetching with
useEffectfor any content you want AI to see
Nuxt.js (Vue)
Nuxt provides SSR by default:
- Use
useAsyncDataoruseFetchin setup for server-side data fetching - Use
nuxt generatefor static site generation - Enable ISR with
routeRulesfor hybrid approaches - Avoid
onMounteddata fetching for SEO-critical content
Angular (with Angular Universal)
- Use Angular Universal for server-side rendering
- Use
@angular/ssr(Angular 17+) for modern SSR integration - Without Angular Universal, Angular apps are purely CSR and invisible to AI crawlers
Astro
Astro is SSR-first by design — HTML is rendered at build time by default:
- Content components render to static HTML automatically
- Interactive "islands" use client-side JavaScript only where needed
- Excellent default behavior for AI SEO
Plain React / Vue / Svelte SPAs
If you are using a bare framework without SSR (e.g., Create React App):
- Add SSR using a framework like Next.js, Remix, or Nuxt
- Use pre-rendering to generate static HTML for content pages
- As a last resort, implement dynamic rendering (see next section)
Static Site Generation (SSG)
Static site generation is the gold standard for AI SEO performance. Pages are built as complete HTML files at deploy time, meaning:
- Zero server rendering time — Pages are served as pre-built files
- Maximum caching — CDNs serve static files with near-zero latency
- Complete HTML — All content, schema markup, and metadata baked into the file
- No JavaScript dependency — Content exists in HTML regardless of JavaScript execution
Use SSG for content that does not change between page views: blog posts, documentation, landing pages, about pages, and knowledge base articles.
For dynamic content (product inventory, real-time pricing), use SSR or ISR instead.
Dynamic Rendering as a Workaround
Dynamic rendering serves pre-rendered HTML to bot user agents while serving the normal CSR experience to human visitors. The server detects the user agent, and if it matches a known bot (GPTBot, PerplexityBot, etc.), it serves a pre-rendered version.
When to use dynamic rendering
Only as a temporary workaround when migrating to SSR is not immediately feasible. Dynamic rendering adds infrastructure complexity and can be flagged as cloaking if the pre-rendered content differs significantly from the client-rendered version.
How it works
- Incoming request arrives
- Server checks user agent against known bot list
- If bot: serve pre-rendered HTML (from a headless browser or pre-render service)
- If human: serve normal CSR application
Tools for dynamic rendering
- Rendertron (open source, by Google)
- Prerender.io (commercial service)
- Puppeteer with caching (custom implementation)
Google has stated that dynamic rendering is acceptable but is not a long-term solution. Migrating to SSR or SSG is the recommended path.
Testing What AI Crawlers See
curl test (no JavaScript)
curl -A "GPTBot/1.2" https://yoursite.com/ | grep -c "<p>"
If the paragraph count is zero or very low, your content requires JavaScript and is invisible to AI crawlers.
Compare with and without JavaScript
Use a tool that renders with and without JavaScript and compare the output. If the JavaScript-disabled version shows your content, AI crawlers can see it.
Google's Mobile-Friendly Test
Enter your URL in Google's Mobile-Friendly Test — it renders with JavaScript and shows you the result. Compare this against the raw HTML source to identify content that depends on JavaScript.
For comprehensive testing methods, see our verifying AI crawler access guide.
Frequently Asked Questions
Can AI crawlers execute JavaScript?
Most AI crawlers (GPTBot, PerplexityBot, ClaudeBot) do not execute JavaScript. They see only raw HTML. Googlebot can execute JS but with delays. CSR pages are invisible to most AI crawlers.
Is SSR better than CSR for AI SEO?
Yes. SSR delivers complete HTML to AI crawlers without requiring JavaScript execution. CSR delivers an empty shell. For AI SEO, SSR or static generation is strongly recommended.
Does Next.js work well for AI SEO?
Excellent, when using getServerSideProps or getStaticProps. Client-only pages using useEffect for data fetching will be invisible to most AI crawlers.
What about hybrid rendering approaches?
Hybrid rendering is ideal: SSR/SSG for content pages, CSR only for interactive features. This gives AI crawlers full access to content while maintaining rich interactivity for users.
Can pre-rendering solve CSR problems for AI?
Pre-rendering (SSG) solves the problem completely. Dynamic rendering (serving pre-rendered HTML to bots) is a viable workaround but adds complexity. Full SSR or SSG is preferred.
Is JavaScript hiding your content from AI?
AImetrico checks what AI crawlers actually see on your pages — with and without JavaScript rendering.
Trusted by 2,400+ websites