Next.js SEO audit: rendering, metadata and the things only a crawl finds
The framework gives you every tool. It does not check that you used them.
A Next.js site can be the fastest, cleanest thing in a search result — or it can ship an empty page to a crawler and a title of "Create Next App". The framework supports doing this properly; nothing in it notices when you haven't.
This is what an audit looks for on a Next.js site, written for the person who will fix it in the codebase rather than in a dashboard.
What goes wrong on Next.js sites
Content that only exists after hydration
Anything fetched in a client component, behind a useEffect, renders to nothing in the initial HTML. Google will often execute it eventually, and often is not a strategy for a page you want ranking.
Metadata that never made it to the route
Export generateMetadata on a dynamic route and it is per-page; forget it and every URL under that segment inherits the layout's title. It is the reason so many Next.js sites have a hundred pages sharing one description.
Canonicals left to guess
metadataBase plus alternates.canonical gives every page a correct absolute canonical. Without them you get relative canonicals or none, and preview deployments become indexable duplicates of production.
Dynamic routes missing from the sitemap
app/sitemap.ts only lists what you tell it to. A route generated from a database is invisible to it unless the function queries that database, so growth quietly stops appearing in search.
Preview and branch deployments indexed
Every push produces a public URL. Without a noindex on non-production deployments, those copies compete with the real site and can be crawled far more often than it is.
Stale pages from revalidation settings
Incremental regeneration with a long revalidate window means a crawler can be served content that changed days ago, including titles and prices that no longer match the page a visitor sees.
Redirects that live in three different places
next.config redirects, middleware rewrites and a CMS redirect table can all be in play at once, and they run in an order nobody remembers. The result is a chain three hops long, or a rule that silently shadows another, and both are invisible until something is crawled.
What an AuditOpti crawl looks for
- What is in the server-rendered HTML versus what needs JavaScript
- Titles, descriptions and canonicals across dynamic routes, grouped by segment
- The sitemap against the URLs a crawl actually discovers
- Indexability of preview and staging deployments
- Internal links pointing at routes that no longer exist
- Core Web Vitals on mobile, which a fast framework does not guarantee
Check part of it right now, free
These read a live page and tell you what a search engine sees. No signup, no email.
SEO score checker
Score one page against the checks that actually move rankings.
XML sitemap checker
Find your sitemap, prove it parses, and see what it is actually telling Google.
Canonical tag checker
The tag that decides which URL gets the credit — checked properly.
The issues behind this
Each has a full entry in the issue library: what it is, what it costs a business, and step-by-step fixes for WordPress, Shopify, Webflow and custom builds.
Missing title tag
A page has no title, so search results show a guess.
Missing canonical tag
No canonical tag, so duplicates can compete.
Missing XML sitemap
No sitemap to tell search engines what exists.
Noindex on an important page
A page tells search engines to hide it from results.
Questions
Related
Crawl the deployed site and see what a search engine actually receives
The free audit crawls the site, groups every finding, and returns the five things worth fixing this month in plain English. No card, no call.
Run a free audit