Technical SEOUpdated 13 July 202611 min read

SPA SEO in 2026: how Google renders JavaScript — and when prerendering makes sense

Google can render JavaScript, but rendering is a separate step with failure modes that static HTML avoids. Learn how to diagnose an SPA properly and choose the right fix.

CS
Codoki Studio
Engineering
An empty translucent app shell transformed through a glass rendering prism into a complete crawlable web page.
SPA · Rendering · Indexing
On this page
  1. What actually happens when Googlebot hits your SPA
  2. Five JavaScript SEO failure modes worth checking
  3. Choose the fix that matches the evidence
  4. How RenderlySEO solves the SPA SEO problem
  5. Is prerendering 'cloaking'? No — here's why
  6. A reliable 30-minute SPA SEO audit
  7. What to measure after a fix
  8. Common SPA SEO questions

A single-page application is not automatically bad for SEO. Google can crawl, render and index JavaScript. The practical risk is that a client-rendered page asks a crawler to complete more work: fetch the app shell, download permitted scripts, execute them, resolve content and then process the rendered HTML. Server-rendered or static HTML removes several of those dependencies.

An indexing problem can have many causes: weak or duplicate content, poor internal discovery, a canonical mistake, blocked resources, a rendering error or simply a page Google has not prioritised. Blaming JavaScript before testing the rendered result can send a team towards an expensive fix it does not need.

What actually happens when Googlebot hits your SPA

  1. 1Googlebot discovers a URL and requests it, subject to robots.txt and other crawl controls.
  2. 2Google parses the response HTML immediately. On a client-rendered SPA, this may be mostly an app shell plus script references.
  3. 3Eligible pages are queued for rendering. Google's Web Rendering Service runs an evergreen Chromium, executes accessible JavaScript and produces rendered HTML.
  4. 4Google processes that rendered HTML for visible content, crawlable links, metadata and structured data before making indexing and ranking decisions.

The key SEO difference is not that Google ignores JavaScript. It is that client rendering adds a second processing stage and more dependencies. A blocked bundle, failed API request, content that requires interaction, accidental soft 404 or uncaught exception can change what the renderer sees.

Five JavaScript SEO failure modes worth checking

1. Important content is absent from rendered HTML

The raw source can be an app shell and still be indexable by Google, but the final rendered HTML must contain the useful page content. Test the rendered output rather than assuming that a blank View Source result equals a blank Google index.

2. Every route returns the same status and shell

An SPA server often returns 200 for valid URLs, missing routes and errors alike. If the app renders a 'not found' message inside a 200 response, search engines may treat it as a soft 404. Return meaningful HTTP status codes wherever the platform allows it.

3. Routes are difficult to discover

Use real anchor elements with href attributes for navigation. Routes exposed only after a click, search or infinite-scroll interaction are harder to discover. Add contextual internal links and include canonical public URLs in an XML sitemap.

4. Titles, canonicals or schema are wrong after rendering

Google can process JavaScript-injected JSON-LD, so client-side structured data is not inherently invalid. The failure is when rendering does not produce the correct route-specific title, canonical, description or schema. Validate the rendered DOM and the Rich Results Test output.

5. Non-Google crawlers receive an empty preview

Do not assume social platforms, messaging apps, AI crawlers or smaller search engines execute your application. Put Open Graph and essential sharing metadata in the initial HTML, or provide a rendered response that those user agents can read.

Choose the fix that matches the evidence

First decide whether you have a discovery problem, a rendering problem or an indexing-quality problem. Rendering technology will not rescue thin, duplicated or poorly linked pages. If rendered HTML is incomplete, there are three common responses.

Option A — Server-side or static rendering

For a new marketing site or planned rebuild, return meaningful HTML from the server or generate it at build time. Next.js, Nuxt, TanStack Start, Astro and SvelteKit can all do this, depending on configuration. This is Google's preferred long-term direction and gives users as well as crawlers a resilient first response.

Option B — Improve the existing SPA

If Google renders the page successfully, fix the specific gaps instead of migrating: use crawlable links, unblock essential resources, handle errors, set route-specific metadata reliably, improve content and strengthen internal linking. This is often the smallest and best intervention.

Option C — Dynamic prerendering

A rendering service can produce and cache HTML for selected crawlers while users continue to receive the SPA. Google documents dynamic rendering as a workaround, not a recommended long-term solution, because bot detection, cache freshness and content parity add operational complexity. It can still be a pragmatic bridge for a valuable application that cannot be re-platformed now.

How RenderlySEO solves the SPA SEO problem

RenderlySEO sits in the dynamic-prerendering category. Your React, Vue, Svelte or Angular application remains in place, while crawler requests are routed through a rendering and caching layer. The purpose is to give supported crawlers complete HTML without changing the experience delivered to users.

  • Public routes are rendered in a browser environment and stored as HTML.
  • Cached pages can be refreshed so crawlers do not depend on a fresh browser render for every request.
  • Route-specific content, titles, canonical tags, Open Graph tags and JSON-LD can be present in the rendered response.
  • Teams can monitor cached routes and rendering outcomes instead of treating crawler output as a black box.

Is prerendering 'cloaking'? No — here's why

Google says dynamic rendering is generally not considered cloaking when it produces similar content for crawlers and users. Content parity is essential: the same primary copy, links, structured data and meaning should be present in both experiences. Serving optimised content to Googlebot that users cannot see can be treated as cloaking.

A reliable 30-minute SPA SEO audit

  1. 1Inspect the HTTP response and View Source. Record which headings, copy, links, canonical tags and status codes are available before JavaScript. This is a baseline, not the final verdict.
  2. 2Run the URL through Google's Rich Results Test. Inspect the rendered HTML, screenshot, loaded resources and JavaScript errors, not only the rich-result verdict.
  3. 3Use URL Inspection in Search Console for the live URL. Compare Google's rendered page with what a user sees and check the selected canonical and indexing status.
  4. 4Test a homepage, a deep route, an error URL and a recently updated page. One successful homepage render does not prove every route works.
  5. 5Check discovery separately: use real href links, review the sitemap and confirm important routes are reachable through contextual internal links.
  6. 6Test link previews for the social and messaging platforms that matter to your audience. Their crawler capabilities differ from Google's.

What to measure after a fix

  • Rendered HTML contains the same primary content and metadata users see.
  • Important URLs move from excluded or error states into valid indexed states over subsequent crawls.
  • Google selects the intended canonical URL for each route.
  • Search impressions and valid rich-result items improve without introducing soft 404s or duplicate pages.
  • Social previews consistently show the correct route-specific title, description and image.

Common SPA SEO questions

Can Google index a React or Vue SPA?

Yes. Google runs an evergreen Chromium and can index rendered JavaScript content. The page still needs crawlable URLs, accessible resources, useful content and a successful rendered result.

Does a blank View Source mean Google sees a blank page?

No. View Source shows the initial response, while Google can process a later rendered DOM. A thin initial response increases dependency on rendering, but the Rich Results Test and URL Inspection are better evidence of what Google can see.

Is prerendering a permanent replacement for SSR?

Usually not. Google recommends server-side rendering, static rendering or hydration as long-term solutions. Dynamic prerendering is best treated as a bridge or targeted workaround when changing the application architecture is not currently practical.

Do not buy a rendering solution because your source looks empty. Buy one only after the rendered evidence shows a gap and the simpler fixes do not close it.
Now booking Q3 projects

Let's build a website your customers trust instantly.

Tell us about your business — we'll come back with a plan, a timeline and a fixed quote within 48 hours.