SSR vs SSG vs ISR vs CSR: A Practical Guide With Real Tradeoffs
Four rendering strategies, four different answers to 'when does this HTML get generated' — and a real decision framework for which fits which page.
These four acronyms all answer the same underlying question — when does the HTML for this page actually get generated — with a different answer each. The choice between them is a real, per-page architectural decision, not a global setting to pick once.
CSR — Client-Side Rendering
HTML generated in the browser, after JavaScript downloads and runs. This is what plain React does by default. Best fit: content behind a login that doesn't need SEO at all and where the user is already committed to waiting for the app to load — a dashboard, an admin panel.
SSR — Server-Side Rendering
HTML generated on the server, per request, at the moment it's requested — fresh every time. Best fit: pages whose content genuinely changes per request or per user, and need to be crawlable — a personalized feed, a page with real-time-ish pricing. Cost: every request pays the server-render time; it can't be cached indefinitely the way static output can.
SSG — Static Site Generation
HTML generated once, at build time, and served identically to every visitor — the fastest possible response, because there's no per-request work at all, just serving a pre-built file. This entire site's blog and case-study pages use this. Best fit: content that doesn't change per-user and doesn't need to change between deploys — a blog post, a marketing page, a case study.
ISR — Incremental Static Regeneration
The middle ground: served like SSG (fast, cached), but with a revalidation window — after N seconds, the next request triggers a background regeneration, and subsequent visitors get the refreshed version, without a full rebuild-and-redeploy. Best fit: content that changes occasionally but not on every request — a product catalog page, a blog index that needs to reflect a new post without a full redeploy.
The actual decision framework
Ask two questions: does this content differ per user or per request (if yes, you likely need SSR or CSR), and does it need to be crawlable/fast on first load (if yes, rule out pure CSR). Most content on a real site — this one included — turns out to be SSG or ISR once you actually ask those two questions, which is exactly why they're the default posture worth reaching for first.