Why static wins by default
A pre-built file served from a CDN has no cold start, no runtime, no database connection and essentially no failure modes. It is the fastest thing you can ship and the cheapest to keep running. For most sites this is the correct answer and the conversation should end here.
The free tiers reflect that: static hosting is where the genuinely unlimited plans live, because serving cached files costs the provider almost nothing.
The three things that end it
Build time is the first and least obvious. Static generation costs build minutes proportional to page count, and free tiers cap build minutes far more tightly than bandwidth. A site with thousands of pages can exhaust a monthly allowance in a handful of deploys, so the wall you hit is deployment frequency rather than traffic.
Content freshness is the second. The moment a page must reflect something that changed seconds ago, rebuilding the whole site to publish one change stops being reasonable.
Personalisation is the third, and it ends the discussion outright: a cached file cannot be different for every visitor.
Where the crossover actually sits
The intuition most people have is that static is right until traffic gets large. That is backwards. Traffic makes static more attractive, because serving cached files scales for free.
What ends static is page count and update frequency, and both bite at surprisingly small scale. A few thousand pages that change daily will exhaust free build minutes long before the same site's traffic troubles a bandwidth cap.
That is the crossover: not visitors, but pages multiplied by how often they change.
- Few pages, rare updates, any traffic: static, comfortably.
- Many pages, rare updates: static, but watch build minutes.
- Few pages, constant updates: serverless or incremental regeneration.
- Per-visitor content: serverless, no argument.
The hybrid most projects actually want
Modern frameworks let you make this decision per route rather than per project, and that is almost always the right answer. Marketing pages, docs and blog posts stay static and effectively free. The handful of routes needing freshness or personalisation run server-side.
Done that way, your expensive tier only covers the routes that genuinely need it, and free-tier limits stop constraining the whole project.