Part 10 of 22

Caching and content freshness

SEO and caching intersect in one question: how fast do content changes reach the index? With App Router defaults, your "published" fix can sit behind a stale cache for hours.

The pattern that works for content sites:

// The page: ISR with a sane window
export const revalidate = 3600;
// CMS webhook → instant invalidation on publish
// app/api/revalidate/route.ts
import { revalidatePath } from "next/cache";

export async function POST(request: Request) {
  const { slug, secret } = await request.json();
  if (secret !== process.env.REVALIDATE_SECRET) {
    return Response.json({ ok: false }, { status: 401 });
  }
  revalidatePath(`/blog/${slug}`);
  return Response.json({ ok: true });
}

This gives you static-page speed (great for LCP and crawl budget) and instant freshness on publish. The anti-pattern is the opposite corner: force-dynamic everywhere "to be safe" — you pay SSR latency on every crawl, and crawlers visit less often when TTFB is slow.

Caching in the App Router has enough traps that we wrote a separate deep dive: How Caching Works in Next.js v13+ with App Router.

Checklist:

  • Content pages: ISR + webhook revalidation, not force-dynamic
  • Publishing in the CMS visibly updates the live page within seconds
  • Cache-Control headers checked in prod (curl -I), not assumed

Want this handled for you?

I audit and fix technical SEO on Next.js sites — indexing, performance, hreflang and AI visibility.

Technical SEO service