Bottom line: Rankings are no longer a single dashboard. Treat per-route metadata, static-first rendering, Core Web Vitals, and quotable structured content as one system — it covers both human and AI search.
SEO in 2026 isn't only about ranking in Google — it's about being understandable to both search engines and AI agents. Next.js gives you the tools for both, but only if you use them deliberately. This is the checklist I apply to every Next.js site I ship.
Metadata is the foundation
Use the App Router's export const metadata per page rather than a single global config. Every route should own its title, description, canonical, and Open Graph tags. For dynamic pages, generate metadata from the route's data — a product page whose title literally names the product outperforms a generic template title every time.
Rendering strategy matters
Static generation where possible, server rendering where data is fresh, and dynamic only where you truly need it. Most marketing and blog pages should be static or ISR so the HTML is fast and cacheable. Content that never changes should never block the first paint behind a client-side fetch.
Core Web Vitals are an SEO input
LCP, INP, and CLS feed directly into how search engines treat your pages. For Next.js that means:
- Use the next/image component — it sets
loading="lazy", responsive sizes, and proper priority hints - Ship fonts with
next/fontto avoid render-blocking font swaps - Keep interactive scripts deferred with
next/scriptstrategy="afterInteractive" - Validate with Lighthouse and field data from PageSpeed Insights, not just dev tools
GEO: visibility to generative engines
AI assistants increasingly answer questions by citing pages they can parse reliably. Clear headings, concise summaries at the top of the page, semantic HTML, and structured data (FAQ, Product, Article schema) all make your content easier for a model to quote — and easier to cite your brand when it does.
Rankings are no longer a single dashboard. Treat speed, semantics, and structure as one system. Need help on your Next.js project? Let's talk →