Why I Chose Next.js App Router for a Client Marketing Site
Picking a stack for client work isn't picking your favorite tool — it's picking what the client can afford to have maintained after you're gone. For a recent marketing site build, that reasoning landed on Next.js App Router over the alternatives I considered.
The requirements that actually mattered
Fast page loads (marketing sites live and die on bounce rate), real SEO control (metadata, sitemaps, structured data, not an SPA hoping a crawler executes JS), a CMS a non-technical person could use, and a hosting bill the client wouldn't wince at.
Why not a plain SPA
Client-rendered React means either paying for a headless-browser prerendering service or accepting worse SEO — neither is a good trade for a site whose entire job is being found in search. That ruled out a Vite SPA immediately, regardless of how much faster the dev loop is.
Why not WordPress
The client explicitly didn't want to own PHP hosting, plugin security updates, or the performance cliff a plugin-heavy WordPress install tends toward. Reasonable ask, and one I've seen bite other freelance clients later.
Why App Router specifically, not Pages Router
Three things tipped it: native streaming and Suspense meant the page shell could render instantly while slower data (testimonials, a CMS fetch) streamed in without blocking first paint. Server Components by default meant most of the page shipped zero client JS, which matters more for a marketing site's Lighthouse score than almost any other single decision. Built-in metadata API replaced a pile of manual <Head> juggling with typed, colocated generateMetadata functions, which meant fewer SEO regressions slipping through as the site grew.
What I'd flag before recommending it again
App Router's caching model (fetch caching, route segment config, revalidation) is genuinely more powerful than Pages Router's, and genuinely easier to misconfigure if you don't read the docs closely — I hit a stale-content bug early on from not understanding revalidate defaults. Budget time to actually understand the caching model before shipping, not after a client reports "my changes aren't showing up."
Takeaway
App Router won on the client's actual constraints — SEO, performance, low maintenance burden — not because it's the newest option. Picking a framework for its newness is how freelancers end up maintaining tech debt they created themselves.