Editorial content has a lopsided rhythm: reads vastly outnumber writes. ISR is built for exactly that shape — pages are generated once, served from the CDN, and regenerated in the background when they go stale.
The setup here
Every page exports
revalidate = 3600— an hourly staleness budget.generateStaticParamspre-builds all known posts at deploy time.A new slug renders on first request, then joins the static set.
That alone gives static-CDN performance with no redeploy on publish. But an hourly window is an eternity when an editor fixes a typo in a headline.
On-demand revalidation closes the gap
A Contentful webhook fires on publish and unpublish, and a small route handler calls revalidatePath for the affected pages. Publish-to-live drops from 'up to an hour' to seconds — and the hourly window remains as a safety net for anything the webhook misses.
Cache invalidation stops being scary when you have two independent paths to correctness.
The failure modes are forgiving, which is the real argument. If the webhook dies, content is at most an hour stale. If the CMS is down, the site keeps serving the last good version. Slow is the worst case — not broken.