Mostly no. A 2024 study of crawler traffic by Vercel and MERJ found that OpenAI's crawlers, ClaudeBot, PerplexityBot, Meta's crawler, Bytespider and CCBot download JavaScript files but don't execute them. Google's crawlers, which Gemini also uses, and Applebot do render JavaScript.
So if your page builds its content in the browser, ChatGPT, Claude and Perplexity see an almost empty page.
What's at risk#
Content that appears only after JavaScript runs:
- Text loaded with
fetchinsideuseEffect - Prices, plans or product details pulled from an API on the client
- Tabs, accordions and "read more" sections that are only added to the page when clicked
- Whole apps built as a client-rendered single page with an empty
<div id="root">
Content that is in the HTML, even if it's hidden visually (a closed accordion or <details> element), is fine.
Fixing it in Next.js#
Render on the server. In the App Router, components are server components by default, so data you fetch in them ends up in the HTML:
// app/pricing/page.tsx: rendered on the server
export default async function Pricing() {
const plans = await getPlans()
return <PlanTable plans={plans} />
}
Keep client components for interaction, and pass them data that was fetched on the server. For pages that rarely change, static generation is best: the HTML is built once and served instantly.
Check a page#
Open view-source on the page and search for a sentence from the body. Or run the checker: its "readable without JavaScript" check counts the words in the raw HTML and flags pages where most of the content is missing.
Source: Vercel, The rise of the AI crawler.
Questions
Does Googlebot run JavaScript?
Yes. Googlebot renders pages, and Gemini uses the same infrastructure. Most other AI crawlers don't.
Is a Next.js site automatically fine?
Only for content rendered on the server. Anything fetched in useEffect or behind a client component that loads data after the page opens is missing from the HTML.
How do I see what a crawler sees?
View the page source (not the inspector), or run curl on the URL. If the text isn't there, most AI crawlers can't read it.