GPTBot, ClaudeBot and PerplexityBot reading static HTML from an edge server – log evidence visualization

    GPTBot, ClaudeBot, PerplexityBot: What AI Crawlers Really See With Prerendering

    17. Mai 20265 min read
    Till Freitag

    TL;DR:AI crawlers execute little to no JavaScript. If you don't prerender your SPA, you are effectively invisible to ChatGPT, Claude and Perplexity. Three months of edge logs show how often they come – and what they actually pick up."

    Till Freitag

    Why This Analysis

    We talk a lot in this cluster about prerendering being the bridge to AI search. But "LLMs prefer static HTML" is a claim. This article delivers the evidence.

    We analyzed three months of Vercel edge logs from our own site (Playwright SSG) and a client site (classic SPA, no prerendering). Same traffic range, same stack setup minus the prerendering step. This is not a lab benchmark – this is production traffic.

    The Three Relevant User Agents

    BotUser-Agent (excerpt)OperatorPurpose
    GPTBotMozilla/5.0 (compatible; GPTBot/1.x; +https://openai.com/gptbot)OpenAITraining + ChatGPT Search
    OAI-SearchBotMozilla/5.0 (compatible; OAI-SearchBot/1.x; +https://openai.com/searchbot)OpenAIChatGPT Search live retrieval
    ClaudeBotMozilla/5.0 (compatible; ClaudeBot/1.0; +claudebot@anthropic.com)AnthropicTraining + Claude Citations
    PerplexityBotMozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)PerplexitySearch index + answer engine
    Perplexity-UserPerplexity-User/1.0PerplexityOn-demand fetch on user query

    Important: GPTBot ≠ OAI-SearchBot. GPTBot indexes broadly for training. OAI-SearchBot fetches specific URLs that ChatGPT wants to cite in an answer. If you want to appear as a source inside ChatGPT, you don't optimize for GPTBot – you optimize for OAI-SearchBot and similar "user-triggered" crawlers.

    What the Logs Show: Crawl Volume

    Three months, one million edge requests, filtered by user agent:

    BotRequestsShare of all crawlersTrend
    Googlebot41 %Referencestable
    Bingbot12 %stable
    GPTBot9 %+40 % QoQ
    ClaudeBot7 %+120 % QoQ
    PerplexityBot6 %+60 % QoQ
    OAI-SearchBot4 %new
    Other (Bytespider, Amazonbot, etc.)21 %mixed

    The three big AI crawlers together account for about a quarter of non-human traffic. Trend: steeply rising. What you could call "niche" in 2024 isn't niche in 2026.

    What They Actually Fetch

    This is where it gets interesting. We measured three values per bot:

    1. HTML request (the initial GET to the route)
    2. JS bundle requests (does the bot even load the app bundles?)
    3. Hydration indicator (any follow-up request that can only exist after hydration – e.g. a lazy image, an API call?)

    On our prerendered site

    BotHTMLJS bundleHydration follow-up
    Googlebot100 %78 %31 %
    GPTBot100 %3 %0 %
    OAI-SearchBot100 %0 %0 %
    ClaudeBot100 %0 %0 %
    PerplexityBot100 %1 %0 %

    On the client's non-prerendered SPA

    BotHTMLJS bundleHydration follow-up
    Googlebot100 %71 %22 %
    GPTBot100 %2 %0 %
    OAI-SearchBot100 %0 %0 %
    ClaudeBot100 %0 %0 %
    PerplexityBot100 %0 %0 %

    That's the finding in one table: AI crawlers practically don't load bundles. They don't execute them. They see what's in the first HTML response – nothing more.

    Googlebot renders JavaScript a significant share of the time via its Web Rendering Service. The AI crawlers simply don't. Not "sometimes", not "on important pages". Across three months of data: essentially never.

    What That Means in Practice

    On the client's non-prerendered SPA, GPTBot, ClaudeBot and PerplexityBot get this HTML:

    <!doctype html>
    <html><head>
      <title>Loading...</title>
    </head><body>
      <div id="root"></div>
      <script type="module" src="/assets/index-abc123.js"></script>
    </body></html>

    That's all. No headline. No body. No JSON-LD. No OpenGraph with a real title. For the training set and the live retrieval index, this page is an empty document titled "Loading...".

    On our prerendered site they get, per route:

    • complete <title> and <meta description>
    • all <h1> to <h3> with real text
    • the full article body inline
    • JSON-LD (Article, BreadcrumbList, Organization)
    • OpenGraph with real title, description, og:image

    That's the whole difference. Not "somewhat more visible". Rather "exists" vs. "does not exist".

    Why AI Crawlers Don't Run JavaScript

    Three reasons that show up in bot docs and in engineering posts from the providers:

    1. Cost. Headless Chromium per URL is orders of magnitude more expensive than a plain fetch. At the crawl volumes we're talking about (billions of URLs per month), that doesn't scale.
    2. Determinism. LLM training data should be reproducible. Hydration race conditions, A/B tests, JS-based login walls – all of that produces noise.
    3. Speed. For on-demand retrieval (Perplexity-User, OAI-SearchBot), the answer needs to come back in seconds. No room for 3 s of hydration.

    Googlebot can afford headless rendering because it's been its own infrastructure stack for 15 years. OpenAI, Anthropic and Perplexity aren't rebuilding that from scratch. They take HTML as it comes.

    What the Logs Also Show: Cache Behavior

    A second finding that supports our SSR vs. pre-rendering argument for Mykeythai:

    AI crawlers respect Cache-Control and ETag noticeably more consistently than Googlebot. On the prerendered site we see, for GPTBot and ClaudeBot:

    • 70–80 % of re-crawls land on 304 Not Modified
    • Edge CDN answers them from a regional cache
    • Origin is never touched

    On the non-prerendered SPA: every request goes through (200 with empty HTML), because the HTML almost never carries a useful ETag. More traffic, less content. Worst trade-off possible.

    What You Should Do Now

    Concretely, in this order:

    1. Filter your logs. vercel logs --output raw or straight from your edge provider. User-agent filter on GPTBot|ClaudeBot|PerplexityBot|OAI-SearchBot. If the number is zero: you're not being found, either because you don't prerender or because your robots.txt blocks. Check both.
    2. Be honest in robots.txt. Anyone who wants to be cited in AI answers has to allow these bots. Default-deny is a deliberate decision, not an accident.
    3. Turn on prerendering. If you're on Lovable: use the Discoverability release. If you ship your own Vite SPAs: follow the Playwright SSG tutorial.
    4. Add JSON-LD. AI crawlers love structured data – it saves them parsing.
    5. Re-measure after 4 weeks. Crawl volume should double or quadruple. Cache hit rate should approach 70 %+.

    Conclusion

    If you talk about GEO in 2026 without talking about prerendering, you're talking about a poster on a wall with no light. The logs are clear: AI crawlers read HTML. They don't execute JavaScript. And they show up more often than most marketing decks claim.

    If you want to know whether your site exists for ChatGPT, Claude and Perplexity, look at your edge logs. If you don't have that, write to us. We'll run the check for free.

    👉 AI discoverability audit for your app →

    TeilenLinkedInWhatsAppE-Mail

    Related Articles

    Static Site Generation vs. Server-Side Rendering – edge CDN compared to server rack
    May 17, 20265 min

    SSR or Pre-Rendering? What We Evaluated for Mykeythai vs. Our Default Approach

    Lovable now ships real SSR via TanStack Start. We checked for Mykeythai whether to switch – and why our pre-rendering ap

    Read more
    Lovable app with structured HTML, visible to Google, ChatGPT and Perplexity
    May 13, 20267 min

    Lovable SEO/AEO: Every App Discoverable by Google and ChatGPT From Day 1

    Lovable ships server-side rendering, pre-rendering for existing apps, Semrush directly in the builder chat, and an on-de

    Read more
    Split visual: classic Google search results on the left, an AI answer card with source citations on the rightDeep Dive
    June 18, 20268 min

    SEO vs. AEO – aren't they the same thing?

    SEO and AEO sound like the same game with a different acronym. They're not. Where the two disciplines overlap, where the

    Read more
    Prerendering pipeline visualization: SPA, Playwright, Schema.org and edge deploy
    April 29, 20263 min

    Prerendering: How to Turn a React SPA Into a Google-Friendly Site

    React SPAs are invisible to crawlers. Prerendering fixes that – without Next.js, without an SSR server. How our Playwrig

    Read more
    serponado.io – built by Felix Grote (seobuddha) with vibe coding in 12 hours
    June 10, 20263 min

    serponado.io – How Felix Grote Vibe-Coded a SEO Contest Site in 12 Hours

    Felix Grote of seobuddha GmbH shipped serponado.io in 12 hours – one of the most creative entries in the 2026 SEO Contes

    Read more
    Cloudflare and Vercel head-to-head – two edge platforms, two philosophies
    June 4, 20265 min

    Cloudflare vs. Vercel – Which One Should You Use When?

    Vercel or Cloudflare? Both host your modern web app at the edge – but they pursue fundamentally different strategies. We

    Read more
    Serponado SEO Audit Report cover
    June 25, 20262 min

    Serponado SEO Audit: What 8 Cluster Articles Reveal About Internal Links, Canonicals and Fragments

    Short SEO audit across all 8 Serponado cluster articles (DE+EN): link status, canonicals, fragment matches – with the fu

    Read more
    GLM-5.2 vs. Kimi K2.7 Code – split-screen illustration with Z-letter mark and crescent moon symbol
    June 21, 20267 min

    GLM-5.2 vs. Kimi K2.7 Code: Two Open-Weight Releases in One Week – Two Very Different Bets

    Within four days in June 2026, Z.ai (GLM-5.2) and Moonshot AI (Kimi K2.7 Code) shipped their next-generation open-weight

    Read more
    Minimalist illustration of a developer with a ponytail and oval glasses skeptically reviewing code on a screen
    June 14, 20265 min

    Ponytail: The Best Code Is the Code You Never Wrote

    A dev built Ponytail because his AI agents wrote 500 lines for a 5-line problem. The result: 80-94% less code, 47-77% ch

    Read more