Technical SEO Guide
JavaScript SEO: How to Make JS Content Crawlable (SSR vs CSR)
JavaScript makes sites fast and interactive, and it can quietly make your content invisible. Google renders JavaScript, but slowly and not always reliably. Most AI crawlers don’t render it at all. This guide explains how rendering works and how to make sure crawlers see your content.
By Rahul Saini, Author at Search Counsel Co. Last updated [JULY] 2026.
Featured answer: is JavaScript bad for SEO?
JavaScript isn’t bad for SEO, but it makes your content harder to reach. Google can render JavaScript, though it does so on a delay and not always reliably, and most AI crawlers don’t render it at all. The safe fix is to serve your important content as real HTML using server-side rendering or static generation.
The core problem, in one line: your content is only as visible as the HTML a crawler receives before it runs any JavaScript. Google will usually run your scripts eventually, but on a queue and with limits. The crawlers behind ChatGPT, Claude, and Perplexity mostly won’t run them at all. Server-side rendering and static generation take that risk off the table.
Renders, slowly
It runs your JS, but on a queue that can take days, and it can fail.
AI Crawlers
Don’t render
GPTBot, ClaudeBot, and PerplexityBot read the raw HTML only.
The Fix
SSR or SSG
Send full HTML for the pages that need to rank or be cited.
The Test
View source
If your content isn’t in the page source, a crawler may never see it.
Jump to what you need
Article note: Written by Rahul Saini at Search Counsel Co. Grounded in Google’s JavaScript SEO documentation and current crawler behavior. Rendering behavior and timings vary by site and change over time, so treat specific delays as directional and test your own pages.
1) How Google handles JavaScript
Google doesn’t read a JavaScript-heavy page the way a browser does in one smooth motion. It works in two passes. First it crawls the raw HTML your server sends. Then, if that HTML depends on JavaScript to build the page, Google queues the URL for rendering, runs the scripts later using its Web Rendering Service, and indexes what it sees after that.
That second pass is the catch. It doesn’t happen instantly. Depending on your site’s authority and how busy Google’s rendering queue is, the gap between the first crawl and the render can be anywhere from minutes to several days, and it tends to be longer for new or low-authority sites. During that window, Google is working from the near-empty HTML, so your content, links, and metadata may not be counted yet.
Rendering also has limits and can fail. Google’s renderer works within resource caps (roughly 2MB of HTML and resources), it doesn’t wait forever, and a JavaScript error or a blocked script can stop it seeing your content at all. So the honest summary is: Google can render JavaScript, but it’s neither instant nor guaranteed. For the specific rendering changes Google clarified recently, see our breakdown of Google’s December 2025 rendering update.
2) CSR vs SSR vs SSG vs ISR: the rendering choice that decides your SEO
How your pages are built determines what a crawler receives. There are four main approaches, and the difference between them is mostly about where and when the HTML gets created.
| Method | How it works | SEO | Best for |
|---|---|---|---|
| CSR (client-side) | The server sends a near-empty shell; the browser builds the page with JavaScript. | Weakest. Crawlers must render it, and AI crawlers see almost nothing. | Logged-in apps, dashboards, and interactive tools that don’t need to rank. |
| SSR (server-side) | The server builds the full HTML on every request. | Strong. Complete content reaches crawlers immediately. | Dynamic pages that must stay fresh and rank: product pages, news, listings. |
| SSG (static generation) | Pages are pre-built as HTML at build time and served from a CDN. | Strongest and fastest. | Content that doesn’t change per request: blogs, docs, marketing pages. |
| ISR (incremental static) | Static pages that rebuild in the background on a set interval. | Strong. Static speed with periodic freshness. | Large sites that need both fast pages and reasonably current content. |
The takeaway is consistent across every serious source: SSR and SSG are the safe choices for anything that needs to be found, because they hand crawlers complete HTML with no rendering step required. CSR is the risky one. It’s fine for a private dashboard, but for a public page that needs to rank or be cited, it puts your content behind a step that Google does slowly and AI skips entirely.
You don’t have to pick one for the whole site. In 2026, hybrid rendering is the norm: frameworks like Next.js, Nuxt, and SvelteKit let you choose per page, so you can statically generate your blog, server-render your product pages, and keep client-side rendering for the interactive, logged-in parts that don’t need search visibility. If a full change isn’t feasible soon, dynamic rendering (serving pre-rendered HTML to crawlers through a tool like Prerender.io) is a bridge Google tolerates, but it’s a workaround to retire, not an architecture to build on. Google recommends moving to SSR or SSG for the long term.
3) What about AI crawlers?
This is where JavaScript rendering stopped being only a Google problem. The crawlers that feed AI answer engines, GPTBot for ChatGPT, ClaudeBot, PerplexityBot, and the rest, mostly don’t run JavaScript at all. They fetch your raw HTML and read that. Nothing more.
So if your content, your headings, your internal links, or your key facts only appear after JavaScript executes, an AI crawler sees a blank or half-built page and cites someone else. Google might catch up on its next rendering pass. The AI engine won’t. That changes the stakes of the rendering decision: server-side rendering and static generation aren’t just about ranking faster anymore, they’re the difference between being eligible for AI citations and being invisible to them. It’s why this sits near the front of our AI search optimization guide and in the AI-readiness section of the technical SEO pillar.
4) Common JavaScript SEO mistakes
Most JavaScript SEO damage comes from a handful of repeatable patterns. These are the ones worth checking first:
- Content that only exists after JavaScript. The headline problem. If the text isn’t in the raw HTML, it’s slow for Google and invisible to AI. Render critical content server-side.
- Links built with onclick instead of real anchors. Crawlers follow <a href> links. A clickable div wired up with JavaScript is not a link they can follow, so the pages behind it may never be found. See internal linking.
- Views that don’t change the URL. Single-page apps often swap content without a real URL change. Every indexable view needs its own crawlable URL (use the History API, not hash fragments like #section).
- Content hidden behind interaction. Google’s renderer doesn’t click, scroll, or tap. Anything that only loads after a user action, behind a tab, an accordion, or an infinite scroll, may not be rendered. Load indexable content without requiring interaction.
- Blocked JavaScript files. If your robots.txt blocks the scripts Google needs to render the page, it can’t build the content. Don’t disallow the JS and CSS that render your pages.
- Relying on service workers or shadow DOM for content. Googlebot doesn’t support service workers, and content inside shadow DOM is invisible to crawlers. Keep SEO-critical content in the light DOM and served normally.
5) How to test whether your content is crawlable
Don’t trust what you see in your browser. Your browser runs JavaScript, so it shows you the finished page a crawler might never assemble. Test what the raw HTML actually contains:
- View the page source. Right-click and choose “View page source” (not “Inspect”). This shows the raw HTML before JavaScript runs. If your main content and links aren’t there, crawlers that don’t render won’t see them.
- Use URL Inspection in Search Console. Run “Test Live URL,” then open the rendered HTML and screenshot to see exactly what Googlebot builds after rendering. Comparing this to the source tells you what depends on JavaScript.
- Fetch the raw HTML directly. A quick curl of the URL shows you what a non-rendering crawler, including most AI bots, receives.
- Crawl in rendering mode. Tools like Screaming Frog and Sitebulb can crawl with JavaScript rendering on and compare raw versus rendered content across your whole site, flagging pages where content only appears after execution.
- Validate structured data on the live URL. Use Google’s Rich Results Test on the real page, not a local preview, so you’re testing what Google actually receives.
6) How to make your JavaScript site crawlable
Once you know where JavaScript is hiding your content, the fixes are practical. In order of impact:
- 1. Server-render or statically generate the pages that matter. Blogs and marketing pages suit SSG; dynamic pages suit SSR. Modern frameworks (Next.js, Nuxt, SvelteKit, Astro) make this the default path.
- 2. Put critical content in the initial HTML. Main copy, headings, internal links, canonical tags, and metadata should be present before any script runs.
- 3. Use real links and real URLs. Crawlable <a href> links, and a distinct URL for every view you want indexed.
- 4. Don’t block the resources Google needs. Keep rendering scripts and stylesheets crawlable in robots.txt.
- 5. Return proper status codes. A missing page should return a real 404, not a JavaScript-rendered “not found” on a 200 page (a soft 404).
- 6. Prioritize by value. Google gives your site a rendering budget, so on a large JS site, not everything renders promptly. Make sure your highest-value pages, the ones driving revenue, are server-rendered or static, even if lower-priority pages stay client-side. This is the 80/20 rule applied to rendering.
- 7. Watch performance. Heavy JavaScript hurts Core Web Vitals, delaying content (LCP), blocking interaction (INP), and shifting layout (CLS), which are ranking signals in their own right. See our Core Web Vitals guide.
Worth knowing: the business case is real. Documented cases show sites that moved from client-side to server-side rendering recovering rankings within weeks, not because the content changed, but because crawlers could finally read it. The reverse also happens: switching a content site from server-rendering to client-only rendering has caused large traffic drops. Rendering is not a detail on JavaScript sites, it’s the foundation.
Free tool
Run the Crawlability and AI-Readiness Checker
It compares what’s in your raw HTML against your rendered page, and flags content and links that only appear after JavaScript runs, the exact things Google reads late and AI crawlers miss. Check your site. For a full rendering audit and a migration plan, our technical SEO and site audit service runs it through our [FRAMEWORK NAME] process.
7) Sources used for this guide
This guide draws on Google’s own JavaScript SEO documentation and the established behavior of standard rendering tools and crawlers.
| Source | What it supports |
|---|---|
| Google Search Central, JavaScript SEO documentation | The crawl-then-render process, the Web Rendering Service, and rendering limits. |
| Google guidance on dynamic rendering | That dynamic rendering is a transitional workaround, with SSR or SSG recommended long term. |
| Independent AI-crawler testing (2026) | That the major AI crawlers read raw HTML only and don’t execute JavaScript. |
| Screaming Frog and Sitebulb documentation | How to compare raw versus rendered HTML to find JavaScript-dependent content. |
FAQ: JavaScript SEO
Can Google crawl and index JavaScript?
Yes, Google can render JavaScript and index the result. But it happens in a second pass after the initial crawl, on a queue that can take from minutes to several days, and it can fail on timeouts or script errors. For content you need indexed quickly and reliably, don’t depend on that pass.
What is the difference between SSR and CSR?
Server-side rendering (SSR) builds the full HTML on the server and sends a complete page to the browser and crawlers. Client-side rendering (CSR) sends a near-empty shell and builds the page in the browser with JavaScript. SSR is far more reliable for SEO because crawlers get real content immediately.
Which rendering method is best for SEO?
SSR and SSG (static site generation) are the strongest for SEO, because both deliver complete HTML without a rendering step. SSG is best for content that doesn’t change per request, like blogs and marketing pages; SSR suits dynamic pages that must stay fresh. CSR is best reserved for pages that don’t need to rank.
Do AI crawlers read JavaScript?
Mostly no. The crawlers behind ChatGPT, Claude, and Perplexity read your raw HTML and don’t execute client-side JavaScript. So content that only appears after JavaScript runs is invisible to AI answer engines, even if Google eventually renders it. Serve important content as real HTML to stay eligible for AI citations.
Is React or Next.js good for SEO?
A plain React app built as a client-side single-page application often has SEO problems, because content depends on JavaScript. Next.js fixes this by supporting server-side rendering, static generation, and hybrid rendering out of the box, which is why it’s the common choice for React sites that need to rank.
How do I check if Google can see my JavaScript content?
View the raw page source (not the inspector) to see what exists before JavaScript runs, then use URL Inspection’s Test Live URL in Search Console to see the rendered HTML Google builds. If your content is missing from the source but present in the rendered view, it depends on JavaScript and should be server-rendered.
What is dynamic rendering?
Dynamic rendering serves a pre-rendered HTML version to crawlers while sending the full JavaScript app to users. Google accepts it as a temporary bridge for sites that can’t implement SSR quickly, but no longer recommends it as a long-term solution, and the two versions must match to avoid being treated as cloaking.
Conclusion: send crawlers real HTML
JavaScript SEO comes down to a single question: what’s in the HTML before any script runs? Google will usually render the rest, but slowly and imperfectly, and AI crawlers won’t render it at all. So the pages that need to be found, your money pages and your content, should arrive as complete HTML through server-side rendering or static generation. Keep client-side rendering for the interactive parts that don’t need search visibility, use real links and real URLs, and test with the page source rather than your browser.
Rendering is one half of this sub-pillar. For the specific changes Google made to how it renders recently, read our guide to Google’s December 2025 rendering update, and see the technical SEO pillar for how rendering connects to crawling, indexing, and speed.
Editorial note: This guide is for general marketing education. Rendering behavior, framework features, and crawler capabilities change over time, so verify anything time-sensitive against its source and test your own pages before making architecture decisions.
