Next.js App Router caching: revalidate, dynamic, and no-store without the folklore

I made the classic mistake: I slapped export const dynamic = 'force-dynamic' on a route that took 800ms to respond and felt satisfied because "at least the data was fresh." I measured nothing. I didn't understand which piece of data actually needed that freshness. I just applied the flag that fixed the visible symptom — stale data — without asking myself whether the cost was worth it. Months later, reviewing the architecture, I realized 70% of those routes were serving data that changed once an hour. I was regenerating them on every single request for no valid technical reason.

I'm not telling you this to beat myself up. I'm telling you because that mistake is almost universal in teams learning App Router.

My thesis: the problem isn't memorizing cache options. It's deciding what freshness each piece of data needs before you touch any configuration at all. The flags are a consequence of that decision — not the starting point.

What the official docs say — and what they don't