All posts
Web design & development

Static vs Server Rendering in Next.js: What Marketing Pages Should Use

SSG vs SSR in Next.js for marketing pages: a plain verdict on static, ISR and server rendering, tied to Core Web Vitals, cost and AI crawlers.

By Mehdi Hassan8 min read

The short answer

For SSG vs SSR in Next.js, marketing pages should almost always be static: prerendered at build time, refreshed with incremental static regeneration when content changes. Static HTML is fast from a CDN, cheap to serve and fully readable by search and AI crawlers. Save per-request server rendering for pages that truly differ by visitor.

Key takeaways

  • Default every marketing page to static generation and add ISR for CMS-driven content.
  • Server rendering per request costs time to first byte, which feeds straight into LCP.
  • Static and server-rendered pages are both readable by AI crawlers; client-only rendering is the real risk.
  • Personalize with a small dynamic slot or edge logic, not by making the whole page dynamic.
  • One accidental cookies() or headers() call can silently turn a static page dynamic.

Part of Next.js for Marketing Websites: When It's the Right Choice

Should marketing pages use SSG vs SSR in Next.js?

Marketing pages should use static generation, with incremental static regeneration (ISR) for anything a CMS updates. A homepage, pricing page, feature page or blog post shows the same content to every visitor, so rendering it again on every request buys nothing and costs speed.

That's the short verdict we give founders who ask why their Next.js marketing website feels slower than it should. The usual cause is a page that became dynamic by accident, not a framework limit. Server-side rendering (SSR) is a good tool, but it's the right tool for a narrow set of pages: logged-in views, search results and anything that truly changes per request.

What is the difference between static site generation, ISR and SSR?

The three modes differ in when the HTML is built. Static site generation builds it once at deploy time, ISR rebuilds it in the background after a set interval or an on-demand trigger, and SSR builds it fresh on the server for each request.

Mode

When HTML is built

Speed for visitors

Content freshness

Best for

Static (SSG)

At build time

Fastest, served from a CDN

Only as fresh as the last deploy

Landing pages, legal pages, docs

ISR

At build, then regenerated in the background

As fast as static

Minutes, or instant with on-demand revalidation

CMS pages, blogs, case studies, pricing

SSR (dynamic)

On every request

Slower; waits on server and data

Always current

Dashboards, search results, per-user pages

Client-side rendering

In the browser after JavaScript loads

Slowest first paint

Always current

App screens behind a login

In the App Router, static is the default. A route only becomes dynamic when it reads request data such as cookies, headers or search params, or when a data fetch opts out of caching. ISR is a revalidate setting on the route or the fetch, plus on-demand revalidation by path or tag when your CMS publishes.

How does the rendering mode affect Core Web Vitals?

Rendering mode mostly affects Largest Contentful Paint, because the browser can't paint anything until the HTML arrives. A static page comes back from the nearest CDN edge almost immediately; an SSR page waits for the server to run, call your CMS and any APIs, and then respond.

Time to first byte is the first part of LCP, so every delay there pushes the largest paint back. Google's documented threshold for a good LCP is 2.5 seconds at the 75th percentile of real visits, and slow server responses eat into that budget before your hero image even starts loading. Static pages also scale for free: a launch-day traffic spike hits cached files, not your server or your CMS API rate limits.

Interaction to Next Paint is a different story. It depends on how much JavaScript runs in the browser, so static HTML alone won't fix it. Our guide to improving INP on Next.js sites covers hydration and client components, and the platform-specific Core Web Vitals fixes cover the rest.

Do AI crawlers and Google need server-rendered pages?

Crawlers need HTML that already contains your content, and both static generation and SSR deliver that. The risk is pages that render their copy only in the browser with client-side JavaScript, because many AI crawlers fetch raw HTML and don't run scripts.

So the SEO argument is not static versus server. It's prerendered versus client-only. A static page is the safest version of server rendering: the HTML is complete, identical every time and served instantly, which is exactly what Googlebot, GPTBot and other crawlers want. We explain the failure mode in detail in server-side rendering for AI crawlers, and the full setup of metadata, sitemaps and schema lives in our Next.js SEO checklist.

When does a marketing site actually need SSR?

A marketing site needs per-request rendering only where the page content depends on who is asking or what they just typed. That's a short list, and most sites have zero or one of these pages.

  • Site search results that depend on a query string.
  • Logged-in states such as showing an account name or plan in the navigation.
  • Real-time data like live inventory, status pages or stock-style figures that can't be a few minutes stale.
  • Geo or segment personalization where the entire page changes, not just a banner.
  • Preview mode for editors, which should bypass the cache by design.

Even then, you rarely need the whole page dynamic. Keep the shell static and load the personal part separately, either as a small client component, a streamed server component, or through middleware that picks between two prebuilt versions. Newer Next.js releases push this pattern further with cached components and partial prerendering, where a static page streams in one dynamic slot; check the current Next.js docs for the exact configuration in your version.

Hypothetical example: a pricing page with regional currency

For example, suppose a SaaS company wants its pricing page to show euros to EU visitors and dollars everywhere else. The tempting build reads a geo header on every request and server-renders the page, which makes the busiest page on the site the slowest.

The better build generates two static versions at build time, one per currency, and uses edge middleware to rewrite each visitor to the right one based on country. Visitors get static speed, crawlers see a complete page, and the CMS is only hit when content changes. A currency toggle on the page covers anyone the geo guess gets wrong.

How do you set up ISR for a CMS-driven Next.js site?

Set up ISR by prebuilding every known page, giving routes a sensible revalidation window, and wiring your CMS to trigger on-demand revalidation when an editor publishes. That gives you static speed with content that updates within seconds.

  1. Prebuild known paths

    Use generateStaticParams on dynamic routes like /blog/[slug] so every published post is built at deploy time.

  2. Pick a fallback window

    Set a revalidate interval, for example an hour, as a safety net in case a webhook fails.

  3. Tag your data

    Tag CMS fetches by content type or document so one publish refreshes only the pages that use it.

  4. Add a publish webhook

    Point your CMS webhook at a route handler that calls revalidateTag or revalidatePath, protected by a secret.

  5. Verify the build output

    Confirm every marketing route is listed as static or ISR, and that no shared layout opts the tree out of caching.

This is how we build CMS-backed sites ourselves, and it pairs well with low-cost hosting, as covered in our guide to hosting Next.js on Cloudflare Workers. For sites with thousands of generated pages, programmatic SEO with static generation explains how to keep build times sane.

Which Next.js rendering mode should each page type use?

Match each page type to the cheapest mode that keeps it accurate. For a typical startup marketing site, that means nearly everything is static or ISR.

Page type

Recommended mode

Why

Homepage

Static + on-demand ISR

Highest traffic, changes only when marketing edits it

Pricing

Static + ISR

Must be fast and crawlable; regional variants via middleware

Blog and case studies

ISR with tags

Many pages, edited often, one publish refreshes one page

Legal pages

Static

Changes rarely; a redeploy is fine

Changelog or docs

ISR

Frequent small updates from a CMS or repo

Site search results

Dynamic

Depends on the query

Account or app screens

Dynamic or client

Per-user data, not indexed

Frequently asked questions

Is getStaticProps still used in Next.js?
getStaticProps and getServerSideProps belong to the Pages Router, which still works and is still supported. New projects on the App Router don't use them. Instead, routes are static by default, data fetches are cached, and you control freshness with a revalidate setting or on-demand revalidation. If you're maintaining an older Pages Router site, the same static-first advice applies.
Does ISR cost more to host than plain static pages?
ISR adds a little server work, because a page is regenerated in the background when it goes stale or when your CMS triggers a refresh. For a marketing site that publishes a few times a day, that's a tiny number of regenerations. It is far cheaper than SSR, where every single visit runs server code and calls your CMS. Check your host's current pricing page for function and cache costs.
Can I A/B test a static Next.js page?
Yes. Build each variant as its own static page and use edge middleware to assign visitors to a variant with a cookie, then rewrite them to the right version. The visitor gets static speed with no flicker. What you should avoid is reading cookies inside the page itself, because that turns the route dynamic and slows every visit.
How fast does ISR update after I publish in the CMS?
With on-demand revalidation wired to a CMS webhook, the page usually refreshes within seconds of publishing, and the next visitor sees the new version. With only a time-based revalidate setting, the update appears after the interval passes and someone requests the page. We recommend on-demand revalidation for editors and a time window as a fallback.
Is static generation bad for very large sites?
Not if you set it up well. You don't have to prebuild every page at deploy time. Build the most important pages up front, let the rest generate on first request and then cache them. That keeps build times short while every page still behaves like a static file after its first visit.

· CEO & Design Director

Copywriter, designer and developer, and founder of Designify Studio. Over five years, 60+ projects across 14+ industries, for startups that have raised $300M+.

Want this done for you? Website, $8,000.

A multi-page marketing site, written and designed by us, developed in Next.js and animated. $8,000, one-time, up to 6 pages. Book a free 30-minute call to see if it fits.

Schedule Call