JavaScript SEO: Making Sure Google Renders Your Content

JavaScript SEO: Making Sure Google Renders Your Content


If Google can’t render your JavaScript, it can’t index your content. Learn how rendering works and how to make JS-heavy pages reliably crawlable.

Google can execute JavaScript — but not reliably, not immediately, and not on every page. Sites built on JavaScript frameworks like React, Next.js, Vue, or Angular introduce an extra step between the server and the search engine: Googlebot must first download the HTML, queue the page for rendering, execute the JavaScript, and then index the resulting content. That queue can introduce delays of days or weeks. Content that only exists in the rendered version of a page — not in the raw HTML — may be indexed late or not at all.

This matters practically: if your navigation, body content, internal links, or meta tags are injected by JavaScript rather than present in the server-side HTML, they may not be available to Google when it first crawls the page.

The Short Version

  • Google crawls JS-heavy pages in two waves — raw HTML first, rendered content second, sometimes days or weeks later.
  • Server-Side Rendering and Static Site Generation are SEO-safe by default; pure client-side rendering carries the highest indexation risk.
  • At minimum, your H1, meta tags, canonical, critical internal links, and structured data should exist in the raw server-side HTML.
  • Use View Page Source vs. Inspect Element, or Search Console’s URL Inspection tool, to see exactly what Google can and can’t see without rendering.

How Google handles JavaScript rendering

Google uses a two-wave crawl process for JavaScript-heavy pages. The first wave: Googlebot requests the URL and receives the raw HTML. It indexes whatever is present in that HTML immediately. The second wave: the page is queued for rendering with Google’s Web Rendering Service (WRS), which runs a headless Chromium browser to execute the JavaScript and produce the fully rendered DOM. The second wave can happen days or weeks after the first.

The practical consequence: if your site relies on client-side rendering (CSR) — where the server sends a nearly empty HTML shell and JavaScript builds the page in the browser — Google may index an empty or near-empty version of your page until the rendering queue catches up. For sites where the content changes frequently, the rendered version may always lag behind the live version.


Rendering strategies and their SEO implications

Each rendering approach trades off implementation effort against how quickly and reliably Google sees your content:

StrategyHow it worksSEO riskBest for
Client-Side Rendering (CSR)Server sends a minimal HTML shell; JavaScript builds all content in the browserHighest — meta tags and links may not exist in raw HTMLInternal tools, logged-in app views (not pages you want indexed)
Server-Side Rendering (SSR)Server executes the JavaScript and sends fully rendered HTML on every requestLow — Google sees the same content as the user without renderingProduct pages, category pages, frequently changing content
Static Site Generation (SSG)HTML pre-rendered at build time and served as static filesLowest — complete HTML with zero rendering delayBlog posts, marketing pages, content that rarely changes
Incremental Static Regeneration (ISR)Statically rendered but regenerated on a schedule or on-demandLow — same benefits as SSG with periodic refreshLarge sites with semi-static content

How to diagnose JavaScript rendering problems

The fastest check: use Google Search Console’s URL Inspection tool on a page you’re concerned about. Select “Test Live URL” and then view the rendered screenshot. If the rendered version shows your content correctly, Google can see it. If the rendered version is blank or shows a loading state, you have a rendering problem.

  • View Page Source vs Inspect Element: Right-click → View Page Source shows the raw HTML Google receives in the first wave. Right-click → Inspect Element shows the fully rendered DOM after JavaScript runs. If critical content (headings, body text, links) appears in Inspect but not in View Source, it’s JavaScript-rendered and may face indexation delays.
  • Screaming Frog rendering comparison: Screaming Frog can crawl pages in both non-JavaScript mode (raw HTML) and JavaScript-rendered mode. Comparing the two crawls shows exactly which content, links, and meta tags are only present after JavaScript execution.
  • Search Console Coverage report: Pages listed as “Crawled, currently not indexed” or consistently missing from the index despite being linked are candidates for rendering investigation.

What to fix first

If moving to SSR is a large engineering lift, prioritise making the most critical SEO elements available in the server-side HTML even if the rest of the page is client-side rendered. At minimum, the following should be present in the raw HTML response:

  • The page’s H1 and primary heading structure
  • The meta title and meta description (in the <head>)
  • The canonical tag
  • Critical internal links (especially navigation and links to important pages)
  • Structured data markup

Body content that is client-side rendered will still be indexed — just on a delay. But if the meta tags and canonical signals are only available after JavaScript rendering, Google may make indexation decisions based on incomplete signals during that first-wave crawl.

For the full technical audit framework, see the SEO audit checklist. For structured data specifically, see schema markup for AI visibility.


How much rendering delay actually costs you

What the rendering queue costs a CSR-only page

Days–weeks
Typical second-wave delay
Time between Google indexing the raw HTML shell and actually rendering the page’s JavaScript content.
5
Elements worth fixing first
H1, meta tags, canonical, key internal links, and structured data — get these into raw HTML before anything else.
0 render
Delay with SSR or SSG
Both deliver complete HTML on the first request — there’s no second wave to wait for.

A worked example: a Next.js product launch

A DTC brand rebuilt its product catalog on Next.js and launched 200 new product pages in a single week, expecting fast indexation given the framework’s reputation for SEO-friendliness. Two weeks later, Search Console showed only 40 of the 200 pages indexed, with the rest stuck as “Discovered, currently not indexed.” Inspecting a stuck page with View Page Source showed an HTML shell containing only a loading spinner — the product title, price, and description were all injected client-side, because the engineering team had used Next.js’s client-side data fetching pattern instead of its built-in server-side rendering functions.

The fix was switching the product page template to use Next.js’s server-side rendering data-fetching method, so the product title, price, description, and structured data were present in the initial HTML response rather than fetched after the page loaded. Within three weeks of the fix shipping, indexed pages rose from 40 to 187 — without any change to the actual content, only to when and where it became visible to Googlebot.


Frequently asked questions

Google executes JavaScript on pages it determines are worth rendering — which is most pages on sites with reasonable authority and crawl history. However, rendering is resource-intensive, so Google doesn’t render every URL on every crawl pass. Low-priority pages, parameter URLs, and pages with poor crawl history may be rendered infrequently or not at all. For the most important pages on your site, verifying rendering via the URL Inspection tool in Search Console is more reliable than assuming Google will always render correctly.

Standard WordPress with classic themes is largely SEO-safe because the server returns fully rendered HTML. The risk appears with heavily JavaScript-dependent page builders (especially those that inject critical content via JS), custom React or Vue components embedded in WordPress pages, and headless WordPress setups where the frontend is a JavaScript framework consuming the WordPress REST API. If you’re running a traditional WordPress theme with standard plugins, JavaScript rendering is unlikely to be a significant issue. If you’ve added significant custom JavaScript functionality or are running a headless setup, the rendering checks above apply.

Open a key page in Chrome and right-click → View Page Source. Search the source for a piece of text you know appears on the page — your H1, a paragraph from the body, or a navigation link. If it’s there, that content is in the server-side HTML and will be available to Google immediately. If it’s not there, it’s injected by JavaScript. As a second check, use the URL Inspection tool in Google Search Console → Test Live URL → View Rendered Page to see exactly what Google’s renderer sees. Comparing the two gives you a clear picture of which content is at risk.

Yes — Bing renders JavaScript but is generally considered less capable and less consistent than Google’s renderer. Smaller crawlers (used by AI systems and third-party tools) often don’t render JavaScript at all and rely entirely on server-side HTML. This means that content only available after JavaScript execution may be invisible to AI crawlers, link-checking tools, and social media scrapers (which generate preview cards). If you’re targeting AI search visibility specifically, ensuring key content is present in server-side HTML is particularly important — AI systems that extract content from pages may not execute JavaScript before doing so.

Generally the opposite — SSR and SSG typically improve Core Web Vitals, because the browser receives meaningful content sooner instead of waiting for JavaScript to download, parse, and execute before anything appears. SSG in particular tends to produce the fastest Largest Contentful Paint scores, since the HTML is already complete at request time. The main tradeoff is build complexity and, for SSR, server compute cost — not page speed, which usually improves.

Yes, and most large sites do. A common pattern is SSG for marketing pages and blog content that rarely changes, SSR for product or category pages that update frequently, and CSR only for logged-in, non-indexable views like account dashboards. Next.js, Nuxt, and similar frameworks support this per-route, so the decision can be made page-type by page-type rather than as a single site-wide choice.


JavaScript isn’t the enemy — invisible content is

Well-implemented JavaScript is SEO-compatible. The problem is content, links, and meta signals that only exist in the client-rendered version of a page — because Google’s indexation of that content is delayed, inconsistent, and harder to verify. Making the most important SEO signals available in the server-side response is the lowest-risk approach, regardless of what JavaScript does on top of it.

If your site is running on a JavaScript framework and you’re not sure whether your content is being indexed correctly, get in touch — a rendering audit is one of the first things we check.

Similar Posts