Static Site Generation vs. ISR: Choosing Per Page, Not Per Project

Early Next.js projects at Wholly tended to commit to a single rendering strategy for the whole site — usually full static generation for a marketing site, or full server-side rendering for anything with dynamic data. That worked until a media client's site had both: a mostly-static about page and a homepage with a constantly updating 'latest articles' section, and neither strategy fit both well.
We now decide per route based on how often the underlying data actually changes and how tolerant the content is of staleness. Pages built from content that changes rarely — legal pages, team bios, pricing pages — get full static generation at build time, since there's no reason to pay any runtime rendering cost for content that hasn't changed in months.
Pages with data that updates periodically but doesn't need to be instantly fresh — product listing pages, blog indexes, category pages — get Incremental Static Regeneration with a revalidate window tuned to the actual publish cadence. For the media client's article index, we set revalidate to 60 seconds, which meant new articles appeared within a minute without regenerating the entire site on every publish, and without hitting the CMS on every single request the way full SSR would.
Genuinely dynamic, per-user content — a logged-in dashboard, a cart, personalized recommendations — stays server-rendered or client-fetched, since static generation and ISR both serve the same cached HTML to every visitor and that's the wrong tool for anything user-specific.
The one place ISR caught us off guard was on-demand revalidation for editorial urgency — a breaking news correction that needed to go live immediately, not within the 60-second window. We added a webhook from the CMS that calls Next.js's revalidatePath API on publish, which handles the 'needs to be live now' case without dropping the revalidate window back down to something aggressive (and expensive) for routine updates.
The result for that project was a Lighthouse performance score in the high 90s on static and ISR pages, while the dashboard routes stayed fully dynamic — something a single site-wide strategy never would have delivered without real compromises on one side or the other.

