TL;DR
AI crawlers read raw HTML only. Client-side rendered content (React SPAs, GTM-injected schema, dynamic product pages) is completely invisible. Server-side rendering is the single highest-impact fix for AI visibility.
The biggest AI visibility problem nobody talks about
There's a reason your competitors appear in ChatGPT responses and you don't. It's not content quality. It's not backlinks. It's not domain authority. It's that AI crawlers literally cannot see your pages.
GPTBot, ClaudeBot, and PerplexityBot do not execute JavaScript. When they visit your URL, they receive the raw HTML response from your server. If that HTML is an empty div waiting for React to hydrate, the crawler sees nothing. Your entire page — product descriptions, pricing, reviews, structured data — is invisible.
This isn't a minor technical detail. In our data at Angry Digital, server-rendered pages are cited 7x more often than client-rendered equivalents with identical content and authority. It's the single largest factor in AI visibility.
Which platforms are affected?
The problem is widespread. Any platform or framework that relies on client-side rendering for content delivery is affected.
React single-page applications (Create React App, Vite without SSR) — the HTML response contains a single div and a script tag. No content for AI crawlers.
Shopify themes with heavy Liquid/JS rendering — some modern themes defer product descriptions and variant selectors to JavaScript. The extent varies by theme.
Google Tag Manager schema injection — one of the most common SEO practices is actually harmful for AI visibility. GTM adds JSON-LD structured data via JavaScript after page load. Googlebot can eventually process this. AI crawlers cannot.
WordPress with heavy JavaScript plugins — most WordPress sites are server-rendered by default, but plugins that inject content via JavaScript (lazy-loaded content, dynamic pricing, interactive elements) create blind spots.
How to diagnose your pages
The test is simple. Run curl against your most important pages and check whether the content is present in the raw response.
1# Test a product page
2curl -s https://yourdomain.com/products/your-product | grep -ci "product name"
3
4# Test structured data
5curl -s https://yourdomain.com/ | grep -c "application/ld+json"
6
7# Full content check — save and inspect
8curl -s https://yourdomain.com/products/your-product > page.html
9# Open page.html in a text editor and search for your contentIf curl returns 0 matches for your product name, AI crawlers see nothing on that page. If your JSON-LD count is 0, your structured data is JavaScript-injected and invisible.
The fix: server-side rendering
The solution depends on your current architecture.
If you're on Next.js — App Router uses React Server Components by default. Every page is server-rendered unless you explicitly add "use client". This is the stack Angry Digital uses. All content is in the initial HTML response.
If you're on Shopify — audit your theme. Switch to a theme that renders product content server-side. Move any GTM-based schema injection to Liquid theme files. Test every product page template with curl.
If you're on a React SPA — migrate to a framework with SSR support: Next.js, Remix, or Astro. This is a significant architectural change but the most impactful one you can make for AI visibility.
If you're on WordPress — most content is already server-rendered. Focus on moving any JavaScript-injected structured data to PHP-rendered output. Use a plugin like Yoast or RankMath that outputs schema in PHP, not JavaScript.
The GTM schema trap
This deserves its own section because it's so widespread and so misunderstood.
The standard SEO playbook says: "Add structured data to your pages via Google Tag Manager." This is convenient — no code changes, instant deployment, easy management. For Google, it works because Googlebot has a JavaScript rendering engine.
For AI search, it's actively harmful. You're investing time creating FAQPage, Product, and Organization schema that ChatGPT, Perplexity, and Claude will never see. Every minute spent on GTM schema is a minute wasted for AI visibility.
Move your structured data to server-rendered HTML. In Next.js, this means including JSON-LD in your page components. In Shopify, it means Liquid templates. In WordPress, it means PHP output. The schema content can be identical — only the delivery method changes.