Single-page applications (SPAs) and server-rendered pages (SSR) represent two fundamentally different rendering models, and the choice between them shapes search engine optimization and Generative Engine Optimization outcomes for years. The decision is harder to reverse than most teams think — switching rendering modes is migration-grade work, not a configuration toggle. The 2026 standard is mixed: marketing pages, blog posts, and product pages render server-side or statically; interactive product surfaces (dashboards, configurators, account pages) often remain SPA. The pages that drive organic visibility almost always need to be rendered server-side. This guide covers why, when the rare exceptions apply, and how to migrate when the rendering model is wrong for the page.
What the Terms Mean
Three rendering models dominate modern web development.
Single-Page Application (SPA). The browser receives a minimal HTML shell with a JavaScript bundle. The bundle executes, fetches data via API, and populates the visible content. Examples: React app with react-router, Vue app with Vue Router, Angular app. Initial HTML is essentially empty until JavaScript runs.
Server-Side Rendering (SSR). The server runs the rendering code (often the same React/Vue/Svelte components used in an SPA) and returns complete HTML. The browser receives a fully-rendered page; JavaScript hydrates it for interactivity. Examples: Next.js with getServerSideProps or App Router, Nuxt with serverPrerender, Remix with default loaders.
Static Site Generation (SSG). The same rendering code runs at build time instead of request time. Pre-rendered HTML files are served directly from a CDN. Examples: Next.js static export, Astro, Gatsby, Hugo, 11ty. Ships fastest because no server runtime is involved per request.
Hybrid models exist. A site can be SSR for marketing pages, SPA for the dashboard, and SSG for the blog. The rendering decision is per-route, not per-codebase.
Why the Difference Matters
Three impacts flow from the rendering choice.
Crawl rendering reliability. Googlebot can render JavaScript but does so inconsistently. AI bots render JavaScript less reliably. Pages that depend on client-side rendering may not have their content visible to crawlers at all.
Time to first content. SSR/SSG pages have content in the initial HTML response. SPAs have content only after JavaScript executes. The delay can be 1–4 seconds on mobile, which damages LCP and indirectly damages ranking.
Schema markup visibility. Schema markup added by SPA frameworks may not appear in the initial HTML if it's added by the JavaScript bundle. Crawlers that skim only the initial HTML miss the schema entirely.
The combined effect: pure SPAs systematically underperform SSR and SSG counterparts on both SEO and GEO. The gap is well-documented and consistent across audits.
Googlebot and JavaScript
Google has rendered JavaScript since approximately 2019. The capability is real but has limits.
First-pass rendering. Googlebot fetches the HTML and renders the JavaScript on a Chromium-based renderer. About 70–80% of well-built SPAs render fully on first pass. The remaining 20–30% queue for "second-pass" rendering, which can take days to weeks.
Second-pass delays. Pages that don't render on first pass enter a rendering queue. The queue runs at lower priority than first-pass rendering. New content can take days or weeks to appear in Google's index. For frequently-updated content, the delay is unacceptable.
Hard failures. Some SPAs never render correctly. JavaScript errors, infinite client-side loading states, Cookie-dependent content rendering, or aggressive bot detection that blocks Googlebot can leave pages permanently unindexed.
The pattern that works. SSR/SSG pages avoid all three failure modes. Content is in the initial HTML; first-pass rendering captures everything; no queue delays; no JavaScript-execution risk.
The 2026 standard for content-driven pages: render server-side or statically. The risk-adjusted return on relying on Googlebot's JavaScript rendering for marketing content is poor.
AI Bots and JavaScript
AI bots render JavaScript less reliably than Googlebot. The breakdown:
GPTBot. OpenAI's primary crawler. Renders basic JavaScript but inconsistently. Many SPAs return empty content to GPTBot. The simpler pattern: ship initial HTML.
ClaudeBot. Anthropic's crawler. JavaScript rendering capability has improved through 2025 but still lags Googlebot. Don't depend on it.
PerplexityBot. Strong JavaScript rendering for the engines focused on live retrieval, but lower crawl frequency means missed pages compound the problem.
OAI-SearchBot. OpenAI's separate live-retrieval crawler (distinct from GPTBot). Uses Bing's index plus its own crawl. JavaScript rendering varies by mode.
Google-Extended. Google's separate user agent for Gemini training. Inherits Googlebot's JavaScript rendering capability but typically operates on a different cadence.
The conservative assumption: AI bots see initial HTML reliably and JavaScript-rendered content unreliably. Sites that want to be cited in AI engines should ensure all citation-worthy content is in the initial HTML response.
The Hybrid Pattern
Modern frameworks make hybrid rendering trivial. The pattern: render server-side or statically for content pages, use SPA techniques only for interactive surfaces where SEO doesn't matter.
Next.js example.
// app/blog/[slug]/page.tsx — SSG/ISR for content pages
export const revalidate = 3600;
export default async function BlogPost({ params }) {
const post = await getPost(params.slug);
return <Article post={post} />;
}
// app/dashboard/page.tsx — SPA for authenticated dashboard
'use client';
export default function Dashboard() {
// Client-only data fetching, interactive state
return <DashboardUI />;
}
The same codebase handles both rendering modes. Marketing pages render server-side; the dashboard renders client-side. The crawler-relevant pages are crawlable. The user-relevant interactive pages are interactive.
Astro example. Astro defaults to SSG for all pages. Interactive components opt-in to client-side rendering using client:load, client:idle, or similar directives. The content pages stay static; the interactive widgets hydrate selectively. Astro's "islands architecture" is the cleanest expression of the hybrid pattern.
SvelteKit and Remix. Both default to SSR with progressive enhancement. SPAs are possible but require explicit opt-in. The framework defaults align with SEO-friendly rendering.
The hybrid pattern is the right answer for almost every commercial site in 2026. Pure SPAs are rare and almost always wrong for marketing or content surfaces.
Decision Framework
Use this framework to assign rendering mode per page type.
Marketing pages (homepage, About, Services, Pricing). SSR or SSG. Always.
Content pages (blog posts, articles, guides). SSR or SSG. Always.
Product pages (e-commerce listings). SSR or SSG. Always. Use ISR if inventory or pricing changes frequently.
Category and search pages (e-commerce browse). SSR or SSG. Use SSR with caching for high-traffic search pages; SSG for static category pages.
Documentation pages. SSG. Always. Content rarely changes per request; static is the right default.
Help center / knowledge base. SSR or SSG. Always.
User dashboard / account pages. SPA acceptable. These pages are authenticated, personalized, and not crawlable by design.
Configurators, calculators, interactive tools. SPA acceptable. Interactive surfaces don't need SEO; they need responsiveness.
Admin interfaces. SPA acceptable. Internal-only tools where SEO is irrelevant.
Per-user feeds (social timelines, recommended-for-you). SPA acceptable. Per-user content can't be crawled meaningfully.
The pattern: anything that should appear in search results renders server-side or statically. Anything that's authenticated, personalized, or interactive can be SPA.
Common Failure Modes
Six failures consistently produce SEO and GEO problems on poorly-architected SPAs.
1. Empty initial HTML. The HTML response contains only <div id="app"></div> and a script tag. Crawlers see nothing. Fix: SSR or SSG.
2. Hydration mismatches. The server-rendered HTML differs from what the client renders, causing visible content shifts during hydration. Damages CLS scores. Fix: ensure server and client render identically; use frameworks that handle hydration cleanly (Next.js App Router, Astro, Remix).
3. Client-only routing. Internal navigation uses pushState without server-side support. Direct URL access to deep routes returns 404 or empty content. Fix: ensure server-side routing for all SEO-relevant URLs.
4. Missing meta tags on SPA routes. SPA frameworks often render meta tags client-side after initial load. Crawlers reading the initial HTML miss them. Fix: render meta tags server-side or use a framework with built-in support for per-route metadata.
5. Loading spinners as the only initial content. The server returns a "Loading..." state that crawlers index as the page content. Pages get indexed with terrible content. Fix: don't ship loading states as the canonical render.
6. Bot-specific rendering paths. Some SPAs detect bots and serve a different version. The intent (better crawlability) is reasonable, but the implementation often produces different content for bots vs. users — a cloaking risk that can trigger penalties. Fix: serve the same content to all clients; render server-side so bot-specific paths aren't needed.
Migration Considerations
Migrating from SPA to SSR is a significant project. The work:
Choose the rendering layer. Next.js (if React), Nuxt (if Vue), SvelteKit (if Svelte), or Astro for content-heavy sites. Each has trade-offs covered in Webflow vs. Framer vs. Next.js: Choosing a Frontend Stack for SEO Performance in 2026.
Refactor data fetching. SPA data fetching typically uses useEffect or React Query on mount. SSR data fetching happens at request time on the server. The refactor depends on the framework but typically takes 30–50% of total migration effort.
Handle authentication. SPAs that hide content behind authentication on the client require server-side authentication checks during SSR. Implement before launching the migrated pages.
Implement progressive hydration. For interactive pages, ensure the SSR shell hydrates without breaking interactivity. Test extensively on slow networks where hydration delays compound.
Migrate URLs and redirects. SPA routes that worked client-side need server-side route handlers. Map every existing URL pattern to its SSR equivalent.
Validate Core Web Vitals. SSR pages typically improve LCP and CLS but can degrade INP if hydration is heavy. Test before and after.
The full migration takes 8–16 weeks for a typical SPA. The 14-step migration framework in Website Migration Without Traffic Loss: A 14-Step Pre-Launch SEO Checklist applies fully.
Audit Checklist
A 9-point SPA audit identifies whether a site has the rendering problem:
- View source on a content page — does the HTML contain the visible text? If not, content is client-rendered.
- Disable JavaScript — does the page show meaningful content? If not, the page depends on JS for content.
- Run Lighthouse SEO audit — flags missing meta tags, content that requires JS, and crawlability issues.
- Test with Googlebot user agent — set User-Agent to
Googlebotin dev tools and see what's rendered. - Check Google Search Console "Inspect URL" — Google's view of how Googlebot rendered the page.
- Check the page source for schema — schema must be in initial HTML, not added by client-side JS.
- Verify navigation works without JavaScript — internal links should work as
<a href>tags. - Check meta description and title in initial HTML — should be in
<head>, not added client-side. - Test AI bot rendering — set User-Agent to
GPTBotorPerplexityBotand check page content.
Sites failing 3+ checks have a fundamental rendering problem that needs SSR migration. Sites failing 1–2 checks may have isolated issues fixable without full migration.
Want a rendering architecture audit for your site? Request a free AEO audit. Our team will analyze your current rendering model, identify SEO and GEO failure modes, and deliver a migration roadmap if needed within 5–7 business days. Capconvert has migrated 100+ sites from SPA to SSR/SSG patterns since 2014 — and the framework above is the structure we use on every WEBDEV engagement that takes rendering seriously.
Ready to optimize for the AI era?
Get a free AEO audit and discover how your brand shows up in AI-powered search.
Get Your Free Audit