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-Controlheaders checked in prod (curl -I), not assumed