LogoLogo

Before you buy a Next.js template: 10 questions to ask

Published
Tags
#SEO#Next.js#Technical Debt

I’ve shipped enough React apps to know the moment things go sideways: the UI is fine, the business is happy, and then Google quietly stops caring. Next.js changes that dynamic—but only if you use it with intent. This piece is about Before you buy a Next.js template: 10 questions to ask, written for builders who want a site that loads fast, ranks clean, and stays maintainable when the repo hits “real product” size.

If you’re here for a quick win, you’ll get it. If you’re here because you’ve seen a Next.js project rot after six months, you’ll also feel seen.

What you’re actually deciding (not what the docs say)

The surface-level choice is usually “App Router vs Pages Router”, “SSR vs CSR”, or “template vs custom.” The real choice is simpler: are you optimizing for shipping, ranking, or operating? The painful truth is you can’t max all three with zero trade-offs.

  • Runtime constraints: server components, edge, caching rules
  • Team workflow: code ownership, PR size, review latency
  • SEO mechanics: crawl budget, canonical URLs, duplicate content
  • User experience: Core Web Vitals, perceived performance, hydration cost

Common failure modes I keep seeing in real Next.js repos

Most issues aren’t “bugs”; they’re defaults that were never questioned. I’ve personally tripped over each of these at least once:

  1. Accidental client-only pages because a single component pulled in a browser-only dependency.
  2. Over-fetching in server components and then patching it with ad-hoc caching.
  3. Hydration churn where every render is a tiny tax, and the bill shows up in CLS and INP.
  4. SEO regressions from duplicate URLs, missing canonical links, or sloppy pagination.

A practical checklist (the “don’t get cute” edition)

When I audit a React/Next.js site for performance and indexing, I run a quick checklist. It’s boring on purpose—boring is scalable.

  • Rendering strategy: pick SSR/SSG/ISR intentionally per route.
  • Caching: define where you cache (data, HTML, CDN) and who invalidates it.
  • Metadata: unique titles/descriptions, stable canonical URLs, sane robots rules.
  • Images: use Next Image, correct sizes, and don’t ship 3MB hero images.
  • Content model: keep body content editable and structured (blocks help a lot).
DecisionWhat you gainWhat you pay
Move a route to SSRFresh data + crawlable HTMLHigher server cost + caching complexity
Stay CSR-onlyFast iteration for app-like UISEO is harder, hydration is heavier
Adopt App RouterModern data fetching + layout nestingLearning curve + migration cost
Stick to Pages RouterPredictability + mature patternsLess flexibility long-term

One code pattern that saves me from “mystery slowness”

I keep a tiny rule: measure first, optimize second. Here’s a minimal pattern I use to make caching decisions visible (instead of vibes-based):

// server-side (conceptual)
export async function fetchWithBudget(url: string, ttlSeconds: number) {
  const started = Date.now()
  const res = await fetch(url, { next: { revalidate: ttlSeconds } })
  const ms = Date.now() - started
  if (ms > 800) console.warn("[slow-fetch]", url, ms)
  return res.json()
}
Pro tip: If your team can’t explain why a route is cached (or not), the site will drift into random performance over time.

Related reading

Bottom line

Buying Advice is the umbrella, but the details decide your outcome. If you take one thing from this: don’t “just build it” and hope SEO magically works later. Set the constraints up-front, then ship within them. You’ll move faster and sleep better.

Tags used: Next.js, SEO, Technical Debt.