When Next.js Is the Wrong Choice: The Limits Honest Advisors Name

Next.js is excellent — and for a whole class of projects it's the wrong call. An honest boundary for decision-makers: overengineering, migration costs, and the point where I'd pick it anyway.
9 min readMatthias RadscheitMatthias Radscheit
Happycodingen-US

TL;DR

For pure marketing sites Next.js is often overengineering; for teams without React experience it's expensive to onboard; on tiny budgets the operational load is out of proportion. Astro, Vite or a classic CMS are then the more honest pick. If you're growing and betting on React, Next.js still wins.

  • For static marketing sites Next.js carries framework weight that Astro avoids by shipping 0 JS by default — overengineering is real, but rarely the most expensive mistake.
  • The App Router migration and the breaking changes in v15/v16 are a concrete, underestimated cost line, not a changelog footnote.
  • Teams without React competence pay the learning curve twice: in the build and in operations. That's a hiring question, not a tech question.
  • Self-hosting lowers licence costs but shifts operational responsibility — for tiny budgets that's a bad trade.
  • The boundary is not a formula: time horizon and team decide whether the bet on the Next.js ecosystem pays off even for small projects.

Next.js is an excellent choice — and for a whole class of projects it's still the wrong one. Anyone who won't say that out loud is selling a framework as a religion. And decision-makers who have already lived through a migration can smell the gap between promise and reality from across the room.

We build Next.js applications, run them self-hosted, and pitch them at decision-maker level. That's exactly why this article exists: a technology whose limits you can't name is one you haven't understood. The honest answer to the question of when Next.js is the wrong choice is what makes the recommendation in every other case credible. There are three constellations where I advise against it — and one case where I contradict myself. For the larger picture this decision belongs in, see our overview of front-end architecture for mid-sized companies.

When Next.js is the wrong choice: overengineering a marketing website

The most common bad decision isn't the most expensive, but it is the most visible: Next.js for a pure marketing website. A dozen pages, a bit of editorial content, a contact form, no logged-in area, no server-side business logic. For something like that, Next.js brings framework weight the user pays for in the browser.

The technical core: Next.js is a React framework. Even a largely static page carries router and hydration code with it. Comparison blogs put a Next.js marketing site at roughly 80–150 KB of JavaScript depending on setup, while Astro ships 0 KB by default and only loads JavaScript where a component is genuinely interactive. Those KB figures are rules of thumb, not primary benchmark data — but the order of magnitude holds. Astro produces static HTML, has no hydration obligation, and is conceptually leaner for content-heavy pages. For a site that stays predictably small, that's the more honest choice.

Here I have to qualify, or I'll be unfair. Next.js itself offers an SPA and static mode, and Server Components cut the JavaScript sent to the browser substantially — only components marked with 'use client', together with their import graph, reach the client bundle at all. Used with discipline, Next.js gets far closer to Astro than the raw numbers suggest. The point is not that Next.js is slow. The point is that for a task Astro solves with fewer moving parts, you learn, operate and maintain a larger framework across its versions. Complexity is a cost line even when it carries no licence fee.

For editorially driven sites there's a third path developers like to overlook: a classic or headless CMS where non-developers maintain content without a deploy pipeline. Whether you're building a platform or a publication decides more than any framework benchmark. Draw the line cleanly between a content system and an experience platform and the architecture almost picks itself — something we've written about at more length, including the difference between a CMS and a DXP.

Next.js drawbacks: breaking changes as a real cost line

The second reason to advise against it appears nowhere in the sales brochure: Next.js has an active development cycle with genuine breaking changes. That's not an accusation — a framework that moves stays relevant. But movement costs, and those costs land in your maintenance budget, not in marketing.

Concretely: version 15 made cookies, headers, params and searchParams asynchronous, made React 19 mandatory, and stopped caching fetch by default. With version 16, synchronous access to those request APIs was removed entirely, Node.js 20.9+ became mandatory, and Turbopack became the default — a build with its own webpack configuration simply fails without the --webpack flag. Add changed next/image defaults and further adjustments. No single release is dramatic, but it adds up: run a Next.js application across three or four years and you take on regular upgrade maintenance that a static Astro build or a hosted CMS just doesn't have.

One widespread misconception deserves correcting here, because it poisons the discussion so often: Next.js 16 does not abolish middleware. It's renamed to proxy and deprecated, then runs on the Node.js runtime. If you need the Edge runtime, the docs say you can still use middleware. Anyone telling you middleware has "gone away" hasn't read the changelog. Precision on details like this is the difference between a risk assessment and pub talk.

What does the App Router migration really cost?

The most underestimated item is the App Router migration. Many teams started in 2023 and 2024 expecting the move off the Pages Router to be a configuration matter. It isn't.

Next.js itself recommends an incremental, page-by-page migration and, in its own migration docs, speaks openly of new concepts, mental models and behavioural changes to be learned. That's vendor language for: this is work. Forced changes include getServerSideProps and getStaticProps to async Server Components, getStaticPaths to generateStaticParams, _app and _document to app/layout.js, next/head to the Metadata API, pages/api to Route Handlers, and next/router to next/navigation. Each of those lines gets explained in passing — in a grown codebase, each one is refactoring with a testing burden attached.

Real-world reports confirm it. One engineering team described running Pages and App Router in parallel as drawn-out, had to switch error handling entirely to Error Boundaries, and could no longer use the runtime config they'd relied on before. The mental model of RSC caching — when something is static, dynamic or revalidated — is the actual learning curve, not the syntax. In a much-watched GitHub discussion, a clear majority of more than 2,000 participants voted for the Pages Router. That poll is self-selecting, opinionated and partly overtaken by newer versions — as proof of a majority it doesn't hold. As a signal that the switch created friction, it's worth taking seriously.

For you as a decision-maker that means: if a service provider quotes a Next.js migration without a separate line for the router switch, check the numbers. A clean first implementation of a self-hosted Next.js stack runs us a one-off 5,000 to 20,000 euros; a migration with substantial Pages Router legacy can exceed that, because it's refactoring rather than a new build. Anyone who wants to go from pitch to go-live in 90 days plans such conversions in rather than discovering them mid-project — we've described what that looks like in our account of the path from pitch to go-live.

When is Next.js the wrong choice for a team?

The third case is a hiring question, not a tech question. Next.js is React. If your team lives in a different stack — Vue, classic server-side rendering, a Java world — you pay the learning curve twice: once in the build, once permanently in operations.

The market does favour React. In the Stack Overflow Developer Survey 2025, somewhere between a third and nearly half of respondents used React, well ahead of Angular, and among professional developers React leads more clearly still. Developer availability is therefore strategically on React's side. But the market average doesn't help your specific team if it can't write React today. Introducing a framework whose mental model — Server vs. Client Components, caching behaviour, hydration — nobody internally carries creates a vendor lock-in at the service-provider level that rarely gets priced in. You're then buying not just code, but the necessity of keeping that provider.

And there's the budget boundary. Self-hosting on Hetzner is GDPR-compliant in Germany from roughly 20 to 50 euros a month, with operations costing two to five hours monthly for updates, monitoring and backups. That's cheap — but it's operational responsibility. For a tiny project on a tight budget that's exactly the bad trade: the saved platform costs get eaten by operating time, and the genuinely hard part of self-hosted Next.js — ISR caching across multiple instances with a custom cacheHandler — is rarely needed in small setups, yet still has to be understood the moment you scale. We've laid out the whole platform-versus-self-hosting trade-off in our comparison Next.js on Hetzner instead of Vercel.

The uncomfortable part: sometimes I take Next.js anyway

Now I'll contradict myself, deliberately. In several of the cases where Next.js looks wrong by these criteria, I'd still choose it.

Take the "simple" marketing website. It grows surprisingly often. Five pages become a customer portal, the contact form becomes a login, the publication becomes a platform. Pick the Astro or website-builder path early and you repay that bet later with a migration — and a migration after three years of growth costs more than the initial overengineering ever would. The bet on the React and Next.js ecosystem can be right for precisely the project that looks too small for it today.

Then there's hiring and continuity. For React you find developers, libraries, patterns and answers. That's a real value that outweighs a momentary learning curve. When I choose between the theoretically better-fitting niche tool and the framework I can still staff in two years, the ecosystem often wins — even against my own overengineering critique. Performance is rarely the counter-argument here: with Server Components and ISR, a cleanly built Next.js delivers good Core Web Vitals that ultimately feed through to conversion and revenue.

The boundary is therefore not a formula. It's a weighing of time horizon and team. A throwaway project with fixed scope and a Vue team: not Next.js. A platform with unclear growth, a React-leaning team and a horizon measured in years: almost always Next.js, even if it starts small today.

What I tell decision-makers

Ask two questions before you order Next.js or reject it. First: is this going to grow? If the answer is an honest no — a campaign microsite, a brochure, a project with an end date — take Astro, Vite or a CMS and spare yourself the framework and the migration risk. Second: who carries this? If nobody in-house can write React and nobody is meant to learn it, you're buying a vendor lock-in with Next.js that costs more than any licence.

If everyone involved says yes to both — it's growing, and we can or want to carry React — then Next.js is almost always right, and the breaking changes and the migration become a priced-in maintenance line, not a deal-breaker. Distrust any provider who sells you Next.js for everything, and equally any who damns it wholesale. The right answer has a date, a team and a time horizon. Whoever names the limits has understood what they're recommending — and that's exactly who I'd believe.

Frequently asked questions

Is Next.js overkill for a simple marketing website?
In many cases, yes. A pure marketing site with a few dozen pages needs neither server-side data logic nor hydration for interactive components. Astro ships 0 JavaScript by default and produces static HTML; comparison blogs put a Next.js marketing site at roughly 80–150 KB of JS depending on setup, against nearly 0–20 KB for Astro. If the site stays predictably small, Astro or a classic CMS is the leaner choice. If it's likely to grow into a platform, Next.js can still be right.
How expensive is the migration from the Pages Router to the App Router?
It's not a changelog detail, it's a project line item. Next.js itself recommends an incremental, page-by-page migration and speaks openly of new concepts and mental models a team has to learn first. Forced changes include moving getServerSideProps and getStaticProps to async Server Components, next/head to the Metadata API, and next/router to next/navigation. Teams report that running both routers in parallel and switching error handling to Error Boundaries cost significant time.
What's the best Next.js alternative for small projects?
There isn't one alternative, there are three, depending on the case. For content-heavy, mostly static sites: Astro. For a lean single-page app with no SEO pressure: Vite with React or Vue. For editorially driven sites maintained by non-developers: a classic or headless CMS. The choice depends on who maintains the site, how much it grows, and what front-end competence the team already has.
Is self-hosting Next.js worth it on a small budget?
Rarely. Self-hosting lowers licence costs over time but shifts operational responsibility onto your own team — updates, monitoring, backups. For a tiny project on a tight budget that trade is often bad, because the saved platform costs get eaten by two to five hours of operations a month. Self-hosting pays off when data sovereignty, scaling or medium-term cost reduction matter — not as a cost-cutting measure for the smallest setup.

Sources

Related articles

Open for select projects

Let's talk about your project

Book a no-obligation call, send us an email, or use the form – we'd love to hear from you.

150+
Completed projects
15
Years of experience
8
Senior‑level team members