SEO

Join 500+ brands growing with Passionfruit!
When GPTBot visits a single-page application built with React, Vue, or Angular, it sends an HTTP request, downloads whatever HTML the server returns, and moves on. It does not execute JavaScript. It does not wait for components to mount or API calls to resolve. An analysis of over 500 million GPTBot fetches found zero evidence of JavaScript execution. If your server returns an empty shell with a script tag that loads your app, GPTBot sees nothing. Your product descriptions, pricing tables, comparison data, and FAQ answers exist only after JavaScript executes in a browser, which means they are completely invisible to the AI systems that power ChatGPT, Claude, and Perplexity.
This creates a split visibility problem that many teams do not realize they have. Googlebot uses a headless Chrome-based rendering engine that can execute JavaScript, wait for content to load, and index the result. A React SPA may rank well on Google while being entirely blank to every other AI crawler. With GPTBot traffic growing 305% year-over-year and AI bots now accounting for 4.2% of all HTML page requests, that gap between Google visibility and spa ai search visibility translates directly into lost citation opportunities across the fastest-growing discovery channels.
Which Crawlers Can Execute JavaScript and Which Cannot?
The rendering capabilities of major crawlers determine what each one sees when it visits your SPA:
Crawler | JavaScript Execution | What It Sees on a CSR SPA | AI Citation Impact |
Googlebot | Yes. Uses headless Chrome (Web Rendering Service). | Full content after JS execution. May delay for render queue. | Indexes for Google Search and AI Overviews. |
GPTBot (OpenAI) | No. Zero JS execution across 500M+ fetches. | Empty app shell. No content visible. | Cannot cite content it cannot see. |
ClaudeBot (Anthropic) | No. Focuses on text-based HTML parsing. | Empty app shell. No content visible. | Cannot cite content it cannot see. |
PerplexityBot | No. Does not render JavaScript. | Empty app shell. No content visible. | Cannot cite content it cannot see. |
Bingbot | Limited. May index base HTML but miss dynamic content. | Partial content. Recommends static HTML. | Reduced visibility for ChatGPT Search (uses Bing index). |
The critical pattern in this table is that Googlebot is the only major crawler with full JavaScript rendering support. Most AI crawlers, including GPTBot, ClaudeBot, and PerplexityBot, cannot execute JavaScript and only see the initial HTML. Since 92% of ChatGPT agent queries rely on Bing's search index, and Bingbot has limited JS rendering, a SPA that depends entirely on client-side rendering risks being invisible across both the Bing index and every AI crawler that queries it.
Why Do SPAs Create a Split Between Google Rankings and AI Visibility?
A client-side rendered SPA sends the same initial HTML response to every requester: a minimal shell containing navigation elements, a root div container, and script tags that load the application. For human visitors with browsers, JavaScript executes, API calls fetch data, components render, and the full page appears within seconds. For Googlebot, the Web Rendering Service queues the page for JS execution, processes it, and eventually indexes the rendered content, though with delays that can affect crawl budget and freshness.
For AI crawlers, the process stops at the initial HTML response. GPTBot downloads the shell, extracts whatever text exists in that raw HTML, and moves to the next URL. If the shell contains only a loading spinner and script references, the crawler captures zero citable content. This is not a theoretical risk. Right-click any page on your SPA and select "View Page Source." If you see your actual text content in the source code, it has been server-rendered. If you see only an empty div and script tags, you are running client-side rendering, and your content is invisible to AI crawlers.
The business impact is measurable. Pages with FCP under 0.4 seconds earn an average of 6.7 ChatGPT citations compared to just 2.1 for slower pages. But a CSR SPA where content never appears in the initial HTML has no FCP from the AI crawler's perspective because the content never arrives. Your SPA might rank position one on Google for a competitive keyword while generating zero citations across ChatGPT, Claude, Perplexity, and Google AI Overviews simultaneously.
How Do You Make a SPA Visible to AI Crawlers?
The solution is not abandoning JavaScript frameworks. It ensures critical content renders server-side before reaching the client. Modern frameworks like Next.js (React), Nuxt (Vue), and Angular Universal all support server-side rendering alongside client-side interactivity. The content AI crawlers need exists in the initial HTML response, while interactive elements are hydrated client-side for human users. One case study found that after connecting prerendering for an SPA, AI bots accounted for 47.95% of all requests, demonstrating how quickly AI crawlers engage with newly accessible content.
For teams that cannot migrate to SSR, pre-rendering offers a lighter alternative. Services like Prerender.io generate static HTML snapshots of your SPA pages and serve them to crawlers while human visitors receive the dynamic JavaScript version. This gives AI crawlers fully rendered HTML with all content, schema markup, and metadata visible in the initial response. The trade-off is that pre-rendered snapshots need regular regeneration to stay current, which adds maintenance overhead.
Regardless of which approach you choose, test every critical page with JavaScript disabled in your browser. If product descriptions, pricing, FAQ answers, or comparison tables disappear, those pages need server-side rendering or pre-rendering before AI crawlers can access them. Verify that your schema markup, canonical tags, and meta descriptions are present in the raw HTML source rather than being injected by JavaScript after page load. Monitor server logs for GPTBot, ClaudeBot, and OAI-SearchBot activity to confirm AI crawlers are receiving 200 status responses with content-rich HTML rather than empty shells.
Your SPA Is Either Visible to AI, or It Is Not
There is no partial visibility for JavaScript rendering AI crawlers. A client-side rendered SPA either has content in its initial HTML response, or it does not. GPTBot, ClaudeBot, and PerplexityBot do not execute JavaScript, do not wait for rendering, and do not make second attempts. They fetch the raw HTML, extract what they find, and move on. If that HTML is an empty shell, your entire site is invisible to the AI systems processing billions of queries monthly.
The fix is well-established: implement SSR through Next.js, Nuxt, or Angular Universal to ensure critical content renders server-side. Use pre-rendering as an alternative if SSR migration is not feasible. Test every important page with JavaScript disabled. Verify that schema markup and metadata are in the raw HTML source. These are one-time architectural decisions with permanent returns as AI search traffic continues growing. The sites making these changes now are building spa AI search visibility that compounds with every new AI platform and every increase in AI-driven discovery.
Passionfruit's technical SEO and GEO strategies include JavaScript rendering audits that identify which pages AI crawlers can and cannot see, SSR implementation guidance, and pre-rendering configuration for SPA platforms. Our clients have achieved +120% organic traffic growth and 750% increases in AI visibility. See the results in our case studies or request a technical audit to make your SPA visible to every AI crawler that matters.
Here's the FAQ section for the JavaScript rendering article.
FAQs
Can GPTBot execute JavaScript on single-page applications?
No. An analysis of over 500 million GPTBot fetches found zero evidence of JavaScript execution. GPTBot downloads the initial HTML response from your server and moves on. If your SPA relies on client-side rendering, GPTBot sees only the empty app shell and none of your actual page content.
Why does my SPA rank on Google but get no AI citations?
Googlebot uses a headless Chrome-based rendering engine that executes JavaScript and indexes the fully rendered page. Every major AI crawler, including GPTBot, ClaudeBot, and PerplexityBot, lacks this capability. Your SPA can rank position one on Google while being completely blank to every AI search system simultaneously.
How do I check if AI crawlers can see my SPA content?
Right-click any page on your site and select View Page Source. If your actual text content, product descriptions, pricing, and FAQs appear in the raw HTML, your content is server-rendered and visible to AI crawlers. If you see only an empty div and script tags, you are running client-side rendering and AI crawlers see nothing.
What is the best way to make a React or Vue SPA visible to AI crawlers?
Implement server-side rendering using a framework that supports it natively. Next.js for React, Nuxt for Vue, and Angular Universal for Angular all render critical content server-side before sending it to the client. This puts your content in the initial HTML response where AI crawlers can read it while preserving full client-side interactivity for human visitors.
Does pre-rendering work as an alternative to SSR for AI visibility?
Yes. Pre-rendering services generate static HTML snapshots of your SPA pages and serve them to crawlers while human visitors receive the dynamic JavaScript version. The trade-off is maintenance overhead, since pre-rendered snapshots need regular regeneration to stay current. SSR is the stronger long-term solution, but pre-rendering works when a full SSR migration is not feasible.
Does JavaScript-injected schema markup work for AI crawlers?
No. If your structured data, canonical tags, or meta descriptions are injected by JavaScript after the initial page load, AI crawlers never see them. All schema markup and metadata must be present in the raw HTML source returned by the server for AI crawlers to process it.
How does SPA rendering affect visibility in ChatGPT Search specifically?
ChatGPT Search relies heavily on Bing's index for real-time retrieval, and Bingbot has only limited JavaScript rendering capability. A fully client-side rendered SPA risks being invisible in both the Bing index and direct AI crawler fetches, which cuts off visibility in ChatGPT Search from two directions at once.
How quickly do AI crawlers engage with content after switching to SSR?
Engagement can be rapid. One case study found that after enabling pre-rendering for an SPA, AI bots accounted for nearly 48% of all page requests, showing how quickly AI crawlers begin fetching and processing content once it becomes accessible in the initial HTML response.





