How can you talk about GEO when your content is hidden behind JavaScript?

Before you optimise for AI visibility, check what's actually visible.

March 16, 20263 min read

GEO — Generative Engine Optimisation — is having a moment. Everyone wants to appear in ChatGPT, Claude, Perplexity and similar systems. Consultants are selling GEO audits. Agencies are rewriting content strategies.

But most of the companies talking about GEO have a more fundamental problem: their content isn't actually accessible to the systems they're trying to reach.


What bots actually see

When a crawler, search engine or AI training system visits your website, it typically processes the raw HTML. Not the rendered version your users see — the source.

If your content is loaded via JavaScript after the initial HTML is delivered, there's a significant chance that content simply doesn't exist from a bot's perspective. The page loads blank. The text appears later. But "later" doesn't exist in many crawling contexts.

This affects: React and Vue single-page applications without server-side rendering, content loaded via API calls after page initialisation, carousels, tabs and accordions that hide content by default, and personalisation layers that replace content client-side.


Client-side vs. server-side rendering

Server-side rendering (SSR) delivers a fully populated HTML document. The bot gets the content immediately, the same way a user would if JavaScript never ran.

Client-side rendering (CSR) delivers a minimal HTML shell. JavaScript then fetches data and builds the page in the browser. For users, this is often invisible. For bots, it can mean a completely empty page.

The gap between what a user experiences and what a bot indexes is wider than most teams realise.


Structured data and semantic markup

Even if your content is technically accessible, it may not be interpretable. Structured data — Schema.org markup — tells crawlers what type of content they're looking at. Is this an article? A product? A FAQ? A person?

Without it, systems have to guess. Sometimes they guess right. Often they don't.

For AI systems specifically, semantic clarity matters even more. A language model trained on your content, or retrieving it via RAG, benefits from content that's organised, labelled and internally consistent.

Headings that actually describe content. Paragraphs with a single clear focus. Links that explain where they go.


How to test what's actually visible

Three quick checks:

First, view source. In Chrome: Ctrl+U or Cmd+U. Search for a sentence that should appear on the page. If it's not there, it's JavaScript-rendered.

Second, use Google's URL Inspection tool in Search Console. It shows you what Googlebot saw when it crawled your page — both the raw HTML and the rendered version. The gap between them is your visibility gap.

Third, disable JavaScript in your browser and reload the page. What remains is roughly what many crawlers see.


The difference between Google indexing and AI relevance

Google has sophisticated JavaScript rendering infrastructure. Googlebot can often execute JavaScript and index the rendered content, with some delay.

AI training datasets and retrieval systems often don't have this luxury. Common crawl snapshots — a major source for training data — are primarily raw HTML. Retrieval pipelines vary widely.

The safest assumption: if it's not in the source HTML, it may not exist for AI systems.


GEO strategy built on content that isn't accessible is optimising a ghost.

Before you rewrite your meta descriptions for AI, check what actually makes it into the document. The answer is often surprising — and fixable.