AI Visibility5 min read

Why your site is invisible to ChatGPT (and how to fix it)

AI crawlers do not run JavaScript. If your content is hydrated client-side, the engines that are reshaping discovery cannot read a word of it.

By Shimon Carroll, Founder, SEO for AI Agents · Published

There is a specific, common, and almost invisible failure that keeps modern brands out of AI search. It is not a content problem, not a backlink problem, and not a schema problem. It is that the engines reshaping discovery in 2026 cannot read the page at all, because the content is not in the HTML they receive.

If your site is a single-page React app, a client-rendered Next.js page, or a Vite SPA whose content appears only after JavaScript runs, then to ChatGPT, Claude, and Perplexity your homepage is an empty shell. You can rank on Google, look flawless in a browser, and still be cited by zero AI engines. This post explains exactly why, and the fix is more straightforward than the problem is scary.

The one fact that explains it all

The major AI crawlers fetch raw HTML and do not execute JavaScript in their production paths. This is documented by the companies themselves. OpenAI publishes the behavior of GPTBot, OAI-SearchBot, and ChatGPT-User. Anthropic documents ClaudeBot. Perplexity documents PerplexityBot. None of them render a page the way a browser does. They request the URL, read the bytes the server returns, and move on.

Compare that to classic Googlebot, which does render JavaScript, on a deferred second pass, with caveats. That difference is why a site can pass every Google render check and still be invisible to the AI surfaces. The two kinds of crawler behave differently, and the assumption baked into most SEO tools, that the crawler sees what the browser sees, is no longer safe.

What "invisible" actually looks like

Run a single command against your own homepage:

curl -s https://yoursite.com/ | grep "the sentence you most want an AI to quote"

If grep returns nothing, that sentence is not in the raw HTML, which means GPTBot never saw it. The browser ran your JavaScript and built the content; the crawler did not. We call the gap between those two versions the render-parity diff, and the bigger it is, the less of your page the AI engines can read.

In practice we see three flavors of this failure across the audits we run:

  • The empty root: a single-page app whose initial HTML is a near-empty div, with all content injected after load. Raw-HTML readability scores near zero.
  • The useEffect fetch: a server-rendered shell that loads its primary content with a client-side fetch after the page mounts. The answer the user came for is not in the HTML the crawler receives.
  • The widget trap: a server-rendered page whose hero or feature grid is a third-party client-side widget with no static fallback, so the most important block is missing from the raw HTML.

Why this is getting more expensive, not less

Discovery is fragmenting across classic Google and the AI answer engines: Google AI Overviews, ChatGPT, Claude, Perplexity, Gemini, Grok, and Microsoft Copilot. A buyer no longer runs one Google search and clicks a blue link. They ask an assistant for a recommendation, scan an AI Overview, and cross-check in Perplexity, often before visiting a single website.

The crawlers behind ChatGPT, Claude, and Perplexity read raw HTML without running JavaScript. So a client-rendering architecture that was a minor SEO inconvenience three years ago, when Google rendered your JavaScript eventually, is now a structural exclusion from the majority of the engines that mediate intent. The cost of the architecture has gone up without the architecture changing.

A brand that ranks first on Google and is invisible in ChatGPT is no longer winning. It is winning one surface and losing five.

SEO for AI Agents, story.md

The fix is architectural, not cosmetic

You cannot bolt AI visibility onto a client-rendered site with a meta tag or a magic file. The fix is to put your primary content into the HTML the server sends, before any JavaScript runs. There are three legitimate routes, in rough order of preference:

  1. Server-render the content. In the Next.js App Router this is the default: Server Components render to HTML on the server, and you only ship JavaScript for the genuinely interactive islands. Move content blocks out of "use client" boundaries and the content lands in the raw HTML automatically.
  2. Statically render where you can. Pages that do not change per request, marketing pages, guides, glossary entries, should be generated at build time so the HTML is complete and fast.
  3. Add a server-render layer to an existing SPA. If you are on a client-only stack (Vite, Create React App, client-only Remix routes), introduce server-side rendering or at minimum a static fallback shell that contains the real content, not a spinner.

After any of these, verify the same way you diagnosed the problem: curl the page without JavaScript and grep for the text you want cited. If the text is there, the crawler can see it. That single check is worth more than any score, because it is the literal thing the engine does.

What to do this week

You do not need to rebuild your site to start. Begin with the pages that carry the answers you most want an AI to attribute to you: your highest-intent product or service pages, your best explanatory content, and your homepage. Get those to render their primary content server-side, verify with curl, and you have moved from invisible to readable on the surfaces that matter.

From there, the rest of AI visibility, passage structure, schema, entity corroboration, becomes worth doing. None of it helps while the content is hidden behind hydration. Readability is the gate. Open it first, then walk through.

Our free audit computes the render-parity diff and the AI crawler readability score for every page it crawls, and shows you exactly which pages return an empty shell to the bots. It is the fastest way to find out whether ChatGPT can read you, before you spend a quarter on content it will never see.

Keep reading

Sources