How Google and AI crawlers handle AJAX content in 2026
AJAX, originally short for Asynchronous JavaScript and XML, is the umbrella term for any page content fetched after the initial HTML loads. Modern equivalents include fetch(), XMLHttpRequest, React Query, SWR, and any client-side data fetch that populates the DOM. The SEO problem is the same as it was in 2008: many crawlers do not execute JavaScript, so AJAX-loaded content is invisible to them. This guide explains what's actually broken, what Google and AI crawlers do today, and the realistic fixes.
AJAX content is page content loaded after the initial HTML response, typically via fetch() or XMLHttpRequest. Googlebot renders JavaScript and will see AJAX content, though with some delay. AI crawlers (GPTBot, ClaudeBot) and social media bots typically don't execute JavaScript and see only the initial HTML. The fixes are SSR, static generation, dynamic rendering, or progressive enhancement.
What "AJAX SEO" actually means in 2026
AJAX SEO is the practice of making async-loaded content - data fetched via fetch(), XHR, React Query, SWR, GraphQL clients, or any client-side data layer - visible to search engines and AI crawlers. The acronym is decades old; the underlying problem is the same as for any JavaScript-rendered content.
The term "AJAX" predates React, predates SPAs, and predates the App Router. It originally described jQuery-era pages that fetched XML via XMLHttpRequest and updated the DOM without a full page reload. Today the same pattern is everywhere - any time a component fetches data on mount, lazy-loads a section on scroll, or hydrates content from an API after page load, that's AJAX in the modern sense.
The SEO problem is unchanged. The initial HTML response that crawlers receive on first contact contains a shell with placeholders ("Loading..." or skeleton states). The actual content arrives later, after JavaScript has executed and the API has responded. Whether that content is ever indexed depends on which crawler is visiting and whether it has a JavaScript rendering pipeline.
The categories of AJAX-loaded content that most often go missing from search:
- Product listings, search results, catalogue pages populated from a /api/products endpoint after page load.
- Article body text on blog or news platforms where the CMS data is fetched client-side.
- Reviews, comments, ratings that load lazily when users scroll into view.
- Filter and facet results that re-fetch on selection without changing the URL or HTML.
- Infinite scroll pages that load additional items only when the user scrolls.
- Dynamic meta tags set by client-side libraries like React Helmet after data has arrived.
How different crawlers handle AJAX
Googlebot renders JavaScript and will see AJAX content, with some queue-related delay. Bingbot uses an evergreen Chromium engine but JS rendering is less reliable in field reports. AI crawlers (GPTBot, ClaudeBot) and social media scrapers (Facebook, LinkedIn, Twitter) typically read raw HTML only and see whatever the initial response contains.
The crawler matrix in 2026:
- Googlebot renders JavaScript - including XHR/fetch calls - in a headless Chromium engine. Google has stated since 2019 that the median time-to-render is around five seconds, though for low-priority pages or constrained crawl budgets the render step can be deferred or skipped. The earlier "two waves of indexing" framing is no longer how Google describes the pipeline. Practically: AJAX content is usually indexed, sometimes with a meaningful delay.
- Bingbot uses an evergreen Chromium-based renderer (similar to Googlebot's) per Microsoft's official position, but field reports consistently show Bing's rendering is less reliable on complex SPA patterns - particularly content gated behind scroll or interaction. Bing's index also powers DuckDuckGo (one of several sources), Yahoo, and Ecosia, so Bingbot coverage matters for roughly the share of search those engines represent.
- GPTBot, ClaudeBot do not execute JavaScript per public testing and Vercel's tens-of-millions-of-fetches analysis. PerplexityBot's JavaScript handling has been reported as inconsistent. AJAX-loaded content is largely invisible to these crawlers; if your /pricing page fetches plan data via /api/plans, ChatGPT is likely to report that pricing information isn't available on the page.
- Social media bots (facebookexternalhit, LinkedInBot, Twitterbot) parse the raw HTML for Open Graph tags only. If your og:title and og:image are set client-side via React Helmet after data fetches, social previews collapse to bare URLs.
- Internal site search and SEO crawlers (Screaming Frog default mode, Sitebulb, Ahrefs spider) read raw HTML by default. JavaScript rendering is opt-in and slow, so audits often miss AJAX content unless explicitly configured.
The practical implication: even if Googlebot eventually indexes your AJAX content, AI assistants, social platforms, and many SEO tools may not - so AJAX content is more invisible than it looks if you only check Google.
The four indexing failure modes
AJAX SEO failures fall into four categories: empty initial HTML (the most common), URL fragments that don't change on navigation, dynamic meta tags set after data loads, and event-based content that only renders on user interaction. Each fails differently and needs a different fix.
Failure 1: Empty initial HTML. The page returns a shell with skeleton loaders and no real content. Crawlers without JavaScript rendering see nothing. The fix is to put critical content in the server response - either via SSR, static generation, or dynamic rendering for bots.
Failure 2: Hash-fragment routing. Older AJAX patterns used URL hashes (e.g. example.com/#/products) for client-side routes. Crawlers historically ignored everything after the # because hashes are not part of the HTTP request. This pattern is largely dead but still appears in legacy applications. The fix is to migrate to the HTML5 History API (pushState) so each route has a real URL the server responds to.
Failure 3: Client-side meta tag injection. Libraries like React Helmet, Vue Meta, and similar set <title>, meta description, and Open Graph tags after the data arrives. Social bots and AI crawlers read the initial HTML and never see the updated tags. The fix is to render meta tags server-side or to ship them as static defaults that the client can refine for human visitors.
Failure 4: Interaction-gated content. Tabs that fetch content on click, accordions that expand to reveal text, search results that only appear after a query. Crawlers don't click, scroll, or type. Any content gated behind user interaction is invisible by default. The fix is to expose the content in the initial HTML (collapsed but parseable) or to provide a non-AJAX URL that returns the full content.
The realistic fixes
Four approaches make AJAX content indexable: server-side rendering (SSR), static site generation (SSG), dynamic rendering, and progressive enhancement. Google's current guidance treats SSR/SSG as the long-term recommendation and dynamic rendering as a workaround for cases where SSR isn't viable. Pick based on stack constraints and how much you can refactor.
Server-side rendering (SSR): render the page on the server for every request. Frameworks like Next.js, Nuxt, Remix, and SvelteKit make this straightforward. Pros: every visitor (human or bot) sees fully rendered HTML on first byte. Cons: increases server load, requires a Node.js runtime in production, and may need a refactor if your app currently fetches data only client-side.
Static site generation (SSG): pre-render pages at build time. Excellent for content that changes infrequently - product pages with stable inventory, blog posts, marketing content. Cons: not viable for highly dynamic content like personalised feeds, real-time inventory, or per-user dashboards. Tools: Next.js, Astro, Eleventy, Hugo.
Dynamic rendering: serve fully rendered HTML to bots while humans get the normal client-side application. The renderer detects bot user-agents and delivers a pre-rendered cached version. Pros: no code changes to your application, works with any framework, covers AI crawlers and social bots in addition to Google. Cons: you need a rendering service or middleware, and Google's official position has shifted since 2022 - their docs now describe dynamic rendering as a workaround rather than a long-term recommendation, while explicitly noting it isn't cloaking when bots get the same content humans eventually see. Still useful when SSR/SSG aren't realistic.
Progressive enhancement: render the core content server-side as plain HTML, then layer JavaScript interactivity on top. The page works without JS at all. Pros: simplest model, robust SEO, works in adverse network conditions. Cons: limits how interactive the app can be without significant duplication of effort. Practical for content sites; impractical for true SaaS apps.
For most teams running a React, Vue, or Angular SPA where rewriting in Next.js or Nuxt isn't on the cards, dynamic rendering is a pragmatic short-to-medium-term option. PageGlass implements it at the DNS layer - a CNAME record routes bot traffic through a pre-rendering edge service. Human visitors still get the SPA. Search engines, AI crawlers, and social bots get rendered HTML. See AJAX SEO with PageGlass for how it handles AJAX-loaded pages.
Patterns that look like AJAX SEO problems but aren't
Three common patterns get blamed for AJAX SEO problems but are actually fine: lazy-loaded images with proper width/height attributes, deferred analytics scripts, and components hydrated after first paint. The key test is whether the content is in the initial HTML response, not how quickly it appears on screen.
Not every async pattern hurts SEO. Three things often get flagged that are actually fine:
- Lazy-loaded images. As long as the
<img>tag is in the HTML with a realsrcordata-srcplus width/height attributes, crawlers index the image. The browser deferring its load is a performance optimisation, not an SEO issue. - Deferred analytics and tracking scripts. Loading Google Analytics, Posthog, or Hotjar after the main content has rendered does not affect what crawlers see. The HTML they need is already there.
- Hydration after first paint. SSR frameworks render HTML on the server, ship it to the browser, and then hydrate (attach event handlers) client-side. The hydration step happens after the first paint but the content is already in the HTML when the crawler reads it. This is a "rendering" pattern, not an "AJAX" pattern.
The reliable test: visit your page, view source (Ctrl+U or Cmd+Option+U in Chrome), and search the raw HTML for the content you care about. If it's there in the initial response, crawlers will see it. If it's missing and only appears in the rendered DOM (Ctrl+Shift+I), you have an AJAX SEO problem.
How to test what crawlers see right now
The fastest way to test is to view the raw page source (Ctrl+U) and search for content that should be indexed. For a more thorough check, use a bot user-agent simulator that returns the exact HTML each crawler receives - including the differences between Googlebot, GPTBot, and social media bots.
Concrete test steps:
- View page source (Ctrl+U). Search the raw HTML for the page title, h1, primary content, and meta description. Anything missing is invisible to non-rendering crawlers.
- Run our What Bots See tool to fetch your URL with a Googlebot user-agent and see the exact HTML Google indexes.
- Check AI crawler visibility with our ChatGPT (GPTBot) simulator, Claude (ClaudeBot) simulator, and Perplexity simulator. These are the bots that don't execute JavaScript at all.
- Test social media previews with our OG checker - this fetches your page exactly as Facebook, LinkedIn, and Twitter scrape it.
- Run a full audit via our SEO audit tool which compares raw HTML against rendered output and flags every gap.
- List your key pages for AI assistants with the llms.txt generator. It is a proposed convention, not a ranking factor, and it does nothing for a page a bot cannot read.
- Use Google Search Console URL Inspection for the official Google view. The "Tested page" tab shows the rendered HTML; "More info > HTTP response" shows what Googlebot received.
If your AJAX content is missing from the raw HTML but present in the rendered DOM, that's the gap to close.
Frequently asked questions
Is AJAX still bad for SEO in 2026?▾
It's mixed. Googlebot can render most AJAX content, with some queue-related delay. AI crawlers (GPTBot, ClaudeBot) and social media bots typically don't execute JavaScript and see only the initial HTML; PerplexityBot's JS handling has been inconsistent. So AJAX content is usually indexable on Google and largely invisible to AI assistants and social platforms.
Will Google eventually index my AJAX content?▾
Usually yes, but with some delay. Google's rendering pipeline queues JavaScript rendering after the initial crawl. Google has stated since 2019 that the median time-to-render is around five seconds. For lower-priority pages, the render step can be deferred or skipped if crawl budget is constrained. During any gap, your AJAX-loaded content is not in Google's index.
Do I need to use #! (hashbang) URLs anymore?▾
No. Google deprecated AJAX crawling support for hashbang URLs in 2015 and the deprecation completed by 2018. The current best practice is the HTML5 History API (pushState) which gives every route a real URL the server can respond to. If you have legacy hashbang URLs, set up server-side redirects to the new clean URLs.
What's the difference between AJAX SEO and SPA SEO?▾
Practically nothing in 2026. SPAs (Single Page Applications) are the modern descendants of AJAX-heavy sites. Both fetch content asynchronously and update the DOM without full page reloads. The SEO problems and fixes are identical: get critical content into the initial HTML, either via SSR, static generation, or dynamic rendering.
Can I keep my AJAX architecture and still rank?▾
Often yes. Dynamic rendering serves pre-rendered HTML to bots while humans get the normal AJAX-driven experience, with no code changes. Google's docs since 2022 describe dynamic rendering as a workaround rather than a long-term recommendation - they prefer SSR/SSG - but they explicitly clarify it isn't cloaking when bots see the same content humans eventually see. It's still a sensible option when an SSR migration isn't realistic. PageGlass provides this at the DNS layer.
Does infinite scroll hurt SEO?▾
It can. If additional items only load when the user scrolls, crawlers don't see them - crawlers don't scroll. The fix is to provide a paginated alternative (e.g. /products?page=2 URLs) that returns the same items via a server-side response. Google's documentation recommends supporting pagination patterns alongside infinite scroll so search engines have URLs to crawl.
Are React Query, SWR, and similar libraries an AJAX SEO problem?▾
They can be. These libraries fetch data client-side after the page loads, which is the textbook AJAX pattern. If the data is needed for SEO-critical content (product info, article body, meta tags), you need either SSR with hydration, dynamic rendering, or a static fallback. If the data is only for interactive features (filters, real-time counters), it's fine to keep client-side.
How does this affect my visibility in ChatGPT and Claude?▾
Significantly. GPTBot and ClaudeBot don't execute JavaScript based on current public testing, and PerplexityBot's JavaScript support has been inconsistent in third-party reports. Content that loads only via AJAX is largely invisible to AI assistants. If users ask ChatGPT or Claude about your product, those models won't have your information unless your content is in the raw HTML response. This is increasingly important as AI-driven search captures share from Google.
Related articles
JavaScript SEO rendering: the complete guide for 2026
How search engines handle JavaScript - and what to do when they struggle.
Read more guidePartial Prerendering: a practical guide for 2026
How Next.js Partial Prerendering works, how to enable it, and when a framework-agnostic alternative makes more sense.
Read more comparisonPrerender Alternatives: the simpler, cheaper choice
The simpler Prerender.io alternative - DNS-only setup, flat per-site pricing, every bot covered including AI crawlers.
Read moreMake AJAX content visible to crawlers - without the rewrite
PageGlass serves rendered HTML to bot user-agents automatically - no code changes, no SSR migration. A CNAME record covers search engines, AI crawlers, and social platforms. 7-day free trial, no card required. SSR is still the long-term recommendation; this is the practical fix while you decide whether to do that.