Implementing ISR in Jamstack: A Decision Guide Comparing ISR, SSR & SSG
Choose the right regeneration strategy for your Jamstack site with a compact comparison of ISR, full SSR, and pure SSG, plus a concrete ISR implementation using revalidate.
09 May 2026, 04:54 UTC

Problem and takeaway
You manage a Jamstack site built with Next.js and need to publish updated content without triggering a full site rebuild, while still benefiting from CDN caching and avoiding the overhead of real-time server-side rendering for every request.
Useful takeaway: Incremental Static Regeneration (ISR) lets you keep static-generated pages that are automatically refreshed after a set interval, giving you the best of both worlds.
Decision state and constraints
Before choosing a regeneration strategy, consider the following constraints:
- Content update frequency: how often does the data change?
- CDN caching requirements: do you need edge caching for performance?
- Server load tolerance: can your origin handle per-request rendering?
- Deploy pipeline constraints: does your team prefer zero-deploy updates?
| Strategy | Regeneration | CDN caching | Real-time data | Deploy required for changes |
|---|---|---|---|---|
| ISR | On-demand with revalidate interval | Cacheable, stale-while-revalidate | No (stale until revalidation) | No |
| Full SSR | Every request | Limited (per-request) | Yes | No |
| Pure SSG | Build time only | Maximum | No | Yes |
Trade-offs
- ISR introduces a brief stale-while-revalidate period; content may be up to the revalidate interval old before regeneration occurs.
- Full SSR increases server load and reduces CDN caching benefits, but provides truly real-time data on every request.
- Pure SSG offers the fastest CDN delivery but requires a new build and redeploy for any content change.
Concrete ISR implementation
In Next.js (Pages Router), add the revalidate option to getStaticProps:
export async function getStaticProps(context) { return { props: {}, revalidate: 60, } // regenerate every 60 seconds}Verification
After deploying, run the following command to check the caching header:
curl -I https://your-site.com/pageExpected response header: Cache-Control: public, s-maxage=60 (the value matches your revalidate seconds).
You can also inspect the generated page under .next/static/pages or use Next.js dev tools to confirm the page exists with the expected revalidate timestamp.
Limitations
- ISR does not support true real-time data; the revalidate interval sets the maximum staleness of served content.
- Revalidate only applies to pages generated via
getStaticProps; dynamic routes or API routes require different handling. - Very short revalidate values (e.g., < 5 seconds) increase regeneration frequency and may impact build performance.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.