“Google can render JavaScript now” is true and also the most misleading sentence in technical SEO. It can — in a slower, resource-limited second pass, with its own limits, timeouts, and blind spots. This guide covers exactly how that pipeline works, where JS-heavy sites actually break, and how to fix it by framework.
What Is JavaScript SEO?
JavaScript SEO is the practice of making sure content that depends on JavaScript to appear — text, links, metadata, structured data — is still reliably crawlable, renderable, and indexable by search engines, instead of only visible to a human’s browser.
It isn’t about avoiding JavaScript. Modern frameworks exist because they solve real problems — interactivity, performance, maintainability. It’s about not accidentally making Google (and every AI crawler with far less patience than Google) work harder than it needs to for content you could have simply served in the initial response.
How Google Actually Processes JavaScript: The Two-Phase Pipeline
This is the part most explainers gloss over, and it’s the one piece of mental model that actually predicts how your site will behave.
Phase 1: The HTTP crawl (no JavaScript at all)
Googlebot’s first pass fetches your raw HTML — nothing else. No JavaScript executes, no CSS applies. Whatever exists in that raw response is what gets used immediately for title tags, meta descriptions, canonical tags, and robots meta directives. There’s also a hard ceiling here: content beyond roughly the first 2MB of the HTML response is not considered at all. If your critical metadata is injected by JavaScript rather than present in this initial payload, this first pass simply doesn’t see it.
Phase 2: The rendering queue (a separate, later pass)
Pages that need JavaScript to show their full content get queued separately for Google’s Web Rendering Service (WRS) — a headless version of Chromium that actually executes your scripts and builds the final DOM, much like a real browser would. Since 2019, WRS has run an “evergreen” build, updated within weeks of each stable Chrome release, so modern JavaScript (ES6+, async/await, the Fetch API) renders correctly rather than silently failing on an outdated engine.
The catch is timing, not capability. Rendering costs Google significantly more compute than a raw HTML fetch, so Phase 2 runs on its own schedule, gated by your site’s crawl budget. For a large, authoritative domain, that gap between crawl and render might be minutes. For a newer site or a page buried deep in your architecture, it can stretch to days or weeks — during which your content exists in a kind of limbo: crawled, but not yet fully indexed on what it actually contains.
Rendering Strategies Compared: CSR, SSR, SSG, ISR
| Strategy | What Googlebot Sees in Phase 1 | Best For |
|---|---|---|
| Client-Side Rendering (CSR) | A near-empty HTML shell; full content only after Phase 2 | Logged-in dashboards, apps with no SEO requirement |
| Server-Side Rendering (SSR) | Fully-formed HTML, generated fresh per request | Frequently-changing pages that still need to be indexed fast |
| Static Site Generation (SSG) | Fully-formed HTML, pre-built at deploy time | Blog posts, docs, marketing pages, evergreen content |
| Incremental Static Regen. (ISR) | Fully-formed HTML, regenerated on a set interval | Large catalogs (products, listings) that update periodically |
The strongest sites in 2026 rarely pick just one. A hybrid model — SSG for stable content like guides and service pages, SSR or ISR for anything genuinely dynamic — is usually the right architecture rather than forcing every route through the same pipeline.
Is Dynamic Rendering Still Worth Using in 2026?
Dynamic rendering — detecting bots and serving them a pre-rendered version while humans get the normal client-rendered app — was a legitimate workaround when Google’s renderer was years behind modern JavaScript. With an evergreen, genuinely modern WRS, that gap has mostly closed, and Google now positions dynamic rendering as a legacy workaround rather than a recommended architecture. It still shows up as a stopgap for sites that can’t easily migrate off pure CSR, but for anything built or rebuilt today, proper SSR or SSG solves the same problem without maintaining two rendering paths in parallel.
10 Common JavaScript SEO Mistakes
1. Links that only exist as onClick handlers
If a “link” is a <div> or <span> with a JavaScript click handler instead of a real <a href>, Googlebot may never discover the URL it points to. Use real anchor tags even if you also attach client-side routing to them.
2. Hash-based routing for indexable pages
Search engines generally ignore everything after a # in a URL, so hash-based sub-pages (/app#/products) can’t be crawled or indexed as separate URLs. Use real path-based routing for anything that needs its own ranking.
3. Canonical tags injected only via JavaScript
Canonical tags are read during Phase 1. A canonical that only appears after Phase 2 rendering is a much weaker signal, and on a slow render queue it may effectively not exist for a meaningful stretch of time.
4. Blocking the JS or CSS files Google needs to render the page
A robots.txt rule that blocks a script or stylesheet the page depends on can leave Googlebot rendering a broken or incomplete version of the page — check the URL Inspection Tool’s rendered screenshot, not just your own browser.
5. Lazy-loaded content with no fallback trigger for crawlers
Content that only loads on scroll or on an intersection observer event may never fire for a crawler that doesn’t scroll the way a human does. Pair lazy-loading with native loading="lazy" attributes or ensure content is present in the initial DOM and merely deferred visually.
6. Infinite scroll with no paginated fallback
Crawlers don’t scroll indefinitely. Without a real paginated URL structure underneath an infinite-scroll UI, everything past the first viewport of content risks never being discovered at all.
7. noindex tags that aren’t visible in the rendered HTML
A noindex directive has to be visible to Googlebot to be honored. If it’s added or removed conditionally by client-side logic, you can end up with pages that are indexed when you meant to block them, or vice versa.
8. Client-side redirects instead of server-side ones
A redirect fired by JavaScript after the page loads requires a full Phase 2 render just to be discovered, versus an instant, unambiguous signal from a proper server-side 301. On a slow render queue, this can delay a migration’s SEO impact by weeks.
9. Structured data injected via JavaScript without testing it
Google does support JSON-LD added dynamically via JavaScript, but explicitly recommends verifying it actually renders correctly rather than assuming — a script error or a race condition can silently strip your schema from the rendered output.
10. Heavy render-blocking JavaScript hurting Core Web Vitals
Beyond indexing, unoptimized JS is a direct ranking factor through page experience — slow, render-blocking scripts drag down LCP and INP. We cover the fixes in detail in our Mobile SEO guide.
How to Test What Googlebot Actually Sees
- URL Inspection Tool (Search Console). Run “Test Live URL,” then check the rendered HTML and screenshot — this is the closest you’ll get to Googlebot’s actual point of view without guessing.
- Rich Results Test. Confirms whether your structured data survives rendering, and flags whether the page was blocked from rendering entirely.
- Disable JavaScript in your browser. The fastest gut-check: if your primary content, navigation, and links disappear entirely with JS off, you have a Phase 1 problem before you even get to Phase 2.
- A crawler with a JavaScript rendering mode (Screaming Frog, Sitebulb) run in both raw-HTML and rendered modes side by side, so you can directly compare what exists before and after rendering across your whole site rather than one URL at a time. See our SEO tools guide for the current options.
Framework-Specific Fixes
React (plain, no meta-framework)
Pure client-rendered React apps are the highest-risk default. Add a meta-framework (Next.js, Remix) rather than hand-rolling SSR, or at minimum pre-render critical routes at build time.
Next.js
Use Static Site Generation for stable pages, Server-Side Rendering for per-request dynamic pages, and Incremental Static Regeneration for large catalogs that change periodically — mixing all three by route is normal and encouraged.
Vue / Nuxt
Nuxt’s universal rendering mode handles the SSR/SSG split similarly to Next.js. A plain Vue SPA without Nuxt carries the same risk profile as plain React and benefits from the same fix.
Angular
Angular Universal adds server-side rendering to what is otherwise a heavily client-rendered framework by default — worth enabling on any Angular app with real SEO requirements rather than treated as optional.
JavaScript SEO and AI Crawlers
Here’s the part most JavaScript SEO content skips entirely: Googlebot’s two-phase pipeline is the generous end of the spectrum. Many AI crawlers — the ones powering citations in ChatGPT, Perplexity, and other AI answers — don’t run a full rendering pass at all, and get one shot at your raw HTML. A page that survives Phase 1 barely and depends on Phase 2 to look complete for Google can be functionally invisible to AI systems that never render it in the first place. This is one more reason server-rendered, JS-independent content matters more, not less, heading into 2026 — see our GEO guide for the fuller picture.
It’s also worth separating this from how AI agents browsing your site in real time perceive it, which runs on a different mechanism entirely — the accessibility tree, not the rendered visual page. That distinction, and how to audit for it, is covered in our Lighthouse Agentic Browsing guide.
Frequently Asked Questions
Can Google index JavaScript-rendered content at all?
Yes — Google has rendered JavaScript via an evergreen, modern Chromium engine since 2019. The risk isn’t capability, it’s timing: rendering happens in a separate, budget-gated second pass that can lag well behind the initial crawl.
Do I need server-side rendering for every page?
No. Pages with no SEO value — logged-in dashboards, account settings — can stay purely client-rendered. Anything meant to rank should avoid depending entirely on Phase 2 to reveal its content.
Is dynamic rendering the same as cloaking?
Not if implemented correctly — the intent is serving equivalent content in a more crawlable form, not different content. That said, it’s now considered a legacy workaround rather than a recommended long-term architecture.
How long does it take Google to render a JavaScript page after crawling it?
There’s no fixed number — it depends on your site’s crawl budget, authority, and publishing frequency. It can be near-instant on large, well-established sites and take days to weeks on smaller or newer ones.
Not sure if Google is actually seeing your JavaScript content?
Navoto runs full rendering audits — comparing raw vs. rendered HTML across your whole site — as part of our technical SEO audits.