Kaikki artikkelit
16. syyskuuta 2026

Next.js technical SEO audit checklist, 2026

A technical SEO audit checklist for Next.js sites: rendering strategy, metadata, sitemaps, Core Web Vitals, structured data and hreflang.

A Next.js technical SEO audit checks eight things: rendering strategy, per route metadata, the sitemap and robots.txt, Core Web Vitals, structured data, duplicate titles on dynamic routes, internal linking and, for multilingual sites, hreflang. Run through them in order and you catch most of what costs a Next.js site its rankings.

Confirm your rendering strategy

Static generation and Incremental Static Regeneration are the SEO preferred defaults for Next.js. ISR pre renders pages the way static generation does, but it can update a single page without a full redeploy, so the crawler gets a stable, fast, server rendered page even as content changes (Vercel). That's not free to ignore: client rendered content costs more crawl compute to index, so pushing anything you want ranked onto the client works against you.

Watch for request time APIs. Using cookies or the searchParams prop inside a route opts that whole route into Dynamic Rendering, and using either one in the root layout opts your entire application into it (Next.js). Scope those calls narrowly and wrap them in Suspense boundaries so the rest of the page can still be served statically. A page that reads a cookie for a logged in header, for example, doesn't need its entire product description below the fold to render dynamically too. Splitting the two apart keeps the crawlable content static. This is the first thing we check in our Next.js and Vercel work, because every other item on this list assumes the page is reaching the crawler as rendered HTML at all.

Generate metadata dynamically, per route

A single static <head> block cannot describe a hundred different blog posts or product pages. The Metadata API's per route exports, generateMetadata in the App Router, read the page's own data and produce a title, description and Open Graph image specific to that URL (Next.js). Ship an Open Graph image per route through the opengraph-image file convention rather than one shared image for the whole site.

Titles and descriptions written this way should still follow basic length discipline: a title around 50 to 60 characters, a description in the 100 to 160 character range. Anything longer gets truncated in the search result, which defeats the point of writing it carefully.

Audit your sitemap and robots.txt

Google caps a single sitemap file at 50MB uncompressed or 50,000 URLs. Past either limit, split into multiple sitemap files referenced from a sitemap index (Google Search Central). The <loc> tag is the only required field. Google ignores priority and changefreq entirely, and it only trusts lastmod if that value is consistently accurate against the page's real modification date. An unreliable lastmod can get the field disregarded site wide, so don't set it to "now" on every build.

Next.js generates both files through the generateSitemaps function and the robots file convention (Next.js). Confirm robots.txt isn't blocking any path your sitemap lists. That mismatch is common after a redesign moves content under a new route segment and nobody updates the disallow rules to match. Sitemaps also need fully qualified, absolute URLs and UTF-8 encoding: Google crawls exactly what is listed and won't resolve a relative path on your behalf (Google Search Central). Submitting a sitemap is a hint, not a guarantee, so a clean crawlable site still matters more than the sitemap itself.

Hit the Core Web Vitals thresholds

Google measures three Core Web Vitals at the 75th percentile of page loads, across mobile and desktop separately. A "good" score means Largest Contentful Paint under 2.5 seconds, Interaction to Next Paint under 200 milliseconds, and Cumulative Layout Shift under 0.1 (web.dev). Missing the 75th percentile threshold counts as failing even if your median visitor has a decent experience.

Lighthouse gives you a single simulated run, useful for catching regressions before a deploy, but it isn't the same as field data. Pair it with the useReportWebVitals hook sending real visitor metrics to your analytics tool, or read the Core Web Vitals report in Search Console directly (Next.js). The next/image component and the built in Font Module are the two levers most directly tied to LCP and CLS: image optimization prevents layout shift and serves modern formats, and the Font Module removes the external network request that causes text to reflow after the page paints.

Validate structured data against schema.org

Match the schema.org type to what's on the page: a product page gets Product markup, a business listing gets LocalBusiness, a review gets Review. Generic or mismatched markup doesn't help and can trigger a manual review of that data type (Vercel). Run every template, not just the homepage, through Google's Rich Results Test before shipping. A validation pass on one page doesn't confirm the dynamic route that pulls in a hundred variations of that page will pass too.

Fix duplicate titles and meta descriptions on dynamic routes

This is the most common Next.js specific failure, and it comes from the framework's own strength: a layout inherited by every page under a route segment. If a dynamic route never calls its own generateMetadata, every page under it inherits the parent layout's title and description word for word (Ahrefs). A site wide crawl with a tool like Screaming Frog or Ahrefs surfaces this in minutes: look for a spike in duplicate title tags matching the count of pages in one dynamic segment. The fix is the same one from the metadata section above: generate the description from the page's own data, then spot check a sample of rendered pages to confirm each one resolves to a genuinely unique string.

Set hreflang for every locale you render

Any Next.js site serving more than one language needs hreflang tags declaring each language and region variant, set through the Metadata API's alternates.languages field. Without them, search engines can treat the same article in two languages as duplicate content instead of two intended variants (Vercel). This applies whether the second language is a full translation or a locale that intentionally falls back to English content.

How to prioritize the list

If you can only fix one thing this week, fix rendering strategy first. It gates everything else on this list: a page the crawler can't render as HTML gets no benefit from a perfect metadata block or valid structured data sitting inside it. After that, Core Web Vitals and metadata hygiene move the needle fastest because they affect every page on the site at once, not just one template. Duplicate titles on dynamic routes come next since they're usually a single fix in one file that resolves hundreds of pages at once. Structured data and hreflang matter, but they're narrower fixes, scoped to one template or one locale, and can come last.

A newly launched site and a five year old site need different starting points on this list even though the checklist itself doesn't change. A new site is more likely to have a rendering strategy or metadata gap because nobody has looked at it under real traffic yet. An older site is more likely to have accumulated duplicate titles from years of template changes, or a sitemap nobody has pruned since a migration. Run the whole list either way, but expect the first failure to land in a different place. This is the audit we run before every Next.js launch, in this order, because doing it out of order means re-checking work that a rendering change later invalidates.

Frequently asked questions

What's the difference between a technical SEO audit and a Core Web Vitals check?

A Core Web Vitals check covers three performance metrics: LCP, INP and CLS. A technical SEO audit is broader. It covers rendering strategy, metadata, sitemaps, structured data, canonical and duplicate content issues, and internal linking, with Core Web Vitals as one section of it.

How often should a Next.js site get a technical SEO audit?

Quarterly for an actively updated site is a reasonable baseline. Run one immediately after a framework major version upgrade, a rendering strategy change, or a redesign that touches routing or metadata, since any of those can silently break something this checklist catches.

Does the Next.js App Router improve SEO automatically?

It removes some common mistakes by defaulting to Server Components and automatic code splitting by route segment. It doesn't set your metadata, structured data or rendering strategy for you. Those still need to be configured per route, per the Next.js production checklist last updated in March 2026.

What's the fastest way to fix duplicate meta descriptions on dynamic routes?

Generate the description inside generateMetadata from the page's own data instead of a static export in the parent layout. Then spot check a sample of rendered pages, not just one, to confirm each page resolves to a unique description string.