One of the most common questions I get from clients building on Next.js is: "Which rendering strategy should I use for SEO?" The answer isn't one-size-fits-all — and choosing the wrong rendering mode can cost you rankings, crawl budget, and user experience all at once.
After building 50+ Next.js projects over 15 years of development, here's everything you need to know about SSR, SSG, and ISR from a technical SEO perspective.
Why Rendering Strategy Matters for SEO
Google's crawler (Googlebot) needs to receive fully-formed HTML to index your pages efficiently. When JavaScript handles rendering on the client side (CSR), Googlebot has to execute that JavaScript — which consumes crawl budget, delays indexing, and can result in pages being indexed with missing content.
Next.js solves this by offering multiple server-side rendering approaches that deliver pre-rendered HTML to crawlers and users alike — each with different trade-offs for performance, freshness, and scalability.
SSR — Server-Side Rendering
Best for: Dashboards, personalised pages, real-time eCommerce, dynamic pricing
SSR renders each page on-demand, per request, on the server. Every visitor (including Googlebot) gets fully-rendered HTML with real, live data on every request.
- Canonicals, hreflang, and meta tags are injected server-side — no JavaScript dependency
- Real-time data (stock levels, user-specific content) is always fresh
- Slightly slower TTFB vs SSG because each request requires server computation
- Use the App Router
fetch()withno-storecache option orgetServerSidePropsin Pages Router
SSR Implementation Example (App Router)
// app/products/[id]/page.tsx
// No cache = SSR behaviour — fresh data every request
async function ProductPage({ params }) {
const product = await fetch(
`https://api.example.com/products/${params.id}`,
{ cache: 'no-store' }
).then(r => r.json());
return (
<>
<h1>{product.name}</h1>
<p>{product.description}</p>
</>
);
}
// Dynamic metadata — injected server-side for SEO
export async function generateMetadata({ params }) {
const product = await fetch(
`https://api.example.com/products/${params.id}`,
{ cache: 'no-store' }
).then(r => r.json());
return {
title: product.name,
description: product.description,
openGraph: { title: product.name, images: [product.image] }
};
}
SSG — Static Site Generation
Best for: Blogs, landing pages, marketing sites, portfolios, documentation
SSG pre-builds all pages at deploy time. The resulting HTML files are served directly from a CDN with sub-100ms TTFB globally — no server computation needed per request.
- Near-perfect Core Web Vitals (LCP, CLS, INP) — pre-built HTML is fastest possible
- Ideal for content that changes infrequently
- Sitemap generation at build time is straightforward
- Use
generateStaticParamsfor dynamic routes (App Router) orgetStaticPaths+getStaticProps(Pages Router)
ISR — Incremental Static Regeneration
Best for: eCommerce catalogues, news sites, job boards, content with 1,000+ pages
ISR gives you static speed with live data. Pages are initially served as static, then automatically revalidate in the background after a set time interval — without a full site rebuild.
- Set
revalidateseconds on thefetch()call or route segment config - On-demand revalidation via
revalidatePath()orrevalidateTag()for webhook-triggered updates - Stale-while-revalidate: users get the cached version instantly while a fresh one builds in the background
- Best for sites with thousands of pages that can't afford full rebuilds on every content change
SEO Comparison: Which Strategy Should You Choose?
Technical SEO Checklist for Next.js Projects
- Metadata API: Use
export const metadataorgenerateMetadata()in every layout/page for dynamic, server-side meta injection - Canonical URLs: Set
alternates.canonicalin metadata to prevent duplicate content issues - Open Graph: Generate OG images dynamically using
opengraph-image.tsxroute segments - Sitemap: Use
app/sitemap.tsto auto-generate an XML sitemap at build/request time - robots.txt: Use
app/robots.tsto control crawler directives programmatically - Structured Data: Inject JSON-LD via
<script type="application/ld+json">in the page component — server-rendered for crawler access - Image Optimization: Always use
<Image>fromnext/image— auto WebP, lazy load, aspect-ratio locking (prevents CLS) - Font Optimization: Use
next/fontto eliminate layout shift from web fonts
Summary
There's no single best rendering strategy for SEO — the right choice depends on your data freshness requirements and performance goals:
- SSR: Use for user-personalised pages, real-time pricing, dynamic dashboards
- SSG: Use for blogs, landing pages, documentation, portfolios — maximum Core Web Vitals
- ISR: Use for large catalogs, news, job boards — SSG speed with acceptable data freshness
In practice, most production Next.js applications use all three rendering modes across different route types. The App Router makes this easy — each route segment can independently declare its caching and revalidation behaviour.