IndexLaunch

Guide

JavaScript SEO: Get JS-Rendered Pages Indexed

Google can execute JavaScript, but rendering happens on a delayed second pass — here's what that means for indexing and the common ways it goes wrong.

Indexing happens in two waves

Googlebot fetches your raw HTML first and can index whatever content is already present in that initial response almost immediately. Anything that only appears after JavaScript runs gets queued for a second pass — rendering — which uses separate resources and can lag behind the initial crawl by anywhere from seconds to, on a crawl-constrained site, much longer. If your content or internal links only exist after that second pass, you're relying on a slower, less certain path to get indexed at all.

What actually breaks indexing

  • Main content or internal links that only render after a client fetch, with nothing meaningful in the initial HTML.
  • Content gated behind a user action — a click, a scroll, a hover — that Googlebot has no reason to perform.
  • JS or CSS files blocked in robots.txt that the page needs in order to render correctly; see robots.txt vs noindex for how blocking can backfire.
  • Client-side routing that never changes the actual HTTP status — a broken route can render blank or show a not-found message while still returning 200, which shows up as a soft 404.
  • Hydration or rendering errors that only occur in a headless browser environment and pass unnoticed in normal manual testing.

How to check what Google actually sees

Search Console's URL Inspection tool has a "Tested page" view showing the rendered HTML and a screenshot after Google's renderer ran — not just the raw response. Compare that against your source HTML: if critical content or links are missing from the raw response but present after rendering, you're depending entirely on the render queue rather than the fast initial crawl.

What actually helps

  • Server-render (or statically generate) the content and navigation links that matter for SEO, rather than fetching them client-side after load.
  • Use real <a href> elements for internal links, not click handlers on non-anchor elements — Googlebot follows hrefs, not arbitrary JavaScript event bindings.
  • Don't block the JS/CSS bundles the page depends on to render — Google needs to fetch them to render the page at all.
  • Once a page is fixed, don't just wait for the next render pass — request re-indexing directly, or push the URL through IndexNow, so the corrected version gets picked up on your schedule instead of the renderer's queue.

Framework-specific notes

  • Client-side React apps: a plain single-page app sends an almost empty HTML shell. For pages that need to rank, use a framework with server rendering or static generation.
  • Next.js and Nuxt: server rendering and static generation put content in the initial HTML by default. Watch for important content that only loads in client-side effects.
  • Angular and Vue: use Angular's server-side rendering, or Nuxt for Vue, so pages arrive with their content already in the HTML.
  • Infinite scroll: pair it with paginated URLs that load on their own, so crawlers can reach items beyond the first screen.

A quick test you can run today

Open the page, choose View Page Source (not Inspect), and search for a sentence from your main content and a few internal link URLs. If they're missing from the source, they depend on JavaScript. Then run a free indexability check to confirm the page returns 200, isn't set to noindex and has the right canonical.

Frequently asked questions

Can Google index JavaScript content?

Yes. Google renders JavaScript with a recent version of Chrome. The catch is timing and reliability: rendering happens after the initial crawl, and errors during rendering can leave content out.

Do Bing and other crawlers render JavaScript?

Bing renders JavaScript too, but many other crawlers, including most social media and AI crawlers, read only the initial HTML. Server rendering makes your content visible to all of them.

Is dynamic rendering still recommended?

No. Google describes dynamic rendering (serving bots a pre-rendered version) as a workaround rather than a long-term solution. Server-side rendering or static generation is the recommended approach.

Do I need server-side rendering for every page?

No. Pages behind a login, dashboards and anything you don't want in search can stay client-rendered. Prioritize the pages that need to rank: landing pages, articles, and product and category pages.

How do I know if JavaScript is causing my indexing problem?

Compare the raw HTML with the rendered HTML in URL Inspection's live test. If key content or links appear only after rendering, or the rendered screenshot looks broken, JavaScript is a likely cause.

Want your next page found faster than organic crawling alone?

IndexLaunch sends every URL you submit to multiple search engines the moment you queue it.

No card required · credits never expire

Or run a free indexability check on any page →