SEO for Next.js Apps: SSR, Metadata and Core Web Vitals
Next.js gives you the tools to build a fast, indexable app, but it does not make the SEO decisions for you. Here are the ones that matter and how to get them right.
- SEO for Nextjs apps works well because the framework can render pages on the server or at build time, so search engines get real HTML instead of a blank shell that depends on JavaScript to fill in.
- The decisions that matter are the rendering mode per page (SSR, SSG, ISR or client), correct metadata through the Metadata API, honest canonical URLs, and keeping Core Web Vitals healthy as the app grows.
- Static or cached rendering suits stable pages, SSR suits fresh or request-specific pages, and client-only rendering is for authenticated screens you do not need to rank.
- The framework hands you the tools but not the judgement. Choosing the right rendering mode for each page type and guarding performance over time is where the real SEO work lives.
SEO for Nextjs apps is strong out of the box because the framework can render pages on the server or at build time, so a crawler receives fully formed HTML instead of the near-empty shell a plain React single-page app ships. That removes the single biggest obstacle React apps face in search. But Next.js gives you capabilities, not conclusions. The outcome depends on four decisions you own: which rendering mode each page type uses, whether every page has correct and unique metadata, whether canonical URLs are honest, and whether Core Web Vitals stay healthy as the codebase grows. Get those right and the framework does its job quietly. Miss them and good content can sit unseen. For the foundation underneath it all, our guide to technical SEO for developers is the companion piece.
Why Next.js Helps SEO in the First Place
The core benefit is rendering. A plain React single-page app sends the browser a bare shell and a bundle of JavaScript that assembles the page after load, whereas Next.js can send fully formed HTML so a crawler sees the actual content immediately. Search engines can execute JavaScript, but doing so is slower and less reliable than reading real HTML, which is why server and static rendering matter for search.
- Server-side rendering (SSR): the page is rendered into HTML on the server for each request, which suits content that changes often or is personalised.
- Static site generation (SSG): the page is rendered to HTML once at build time and served as a static file, which is the fastest option and ideal for content that rarely changes.
- Incremental static regeneration (ISR): static pages are rebuilt on a schedule or on demand, giving static speed with periodically refreshed content.
- Client-side rendering: the page is built in the browser after load, which is fine for private, behind-login screens but a poor default for anything you want indexed.
| Mode | Content Freshness | Speed to Serve | SEO Fit |
|---|---|---|---|
| SSG | At build time | Fastest | Excellent |
| ISR | On a schedule or on demand | Very fast | Excellent |
| SSR | Per request | Depends on server response | Good |
| Client-side | After load in the browser | Slowest to meaningful content | Poor for indexing |
Server rendering removes the reliance on client JavaScript for content, but it is not a magic fix. A slow server response or a bloated bundle can still hurt you, so rendering choice and performance have to be handled together.
Choosing a Rendering Strategy Per Page
The most consequential SEO decision in a Next.js app is picking the right rendering mode for each type of page, because it is rarely one answer for the whole app. Map the decision to how fresh the content must be and whether it needs to rank, then apply it per route rather than as one global default.
| Page Type | Recommended Mode | Why |
|---|---|---|
| Marketing, docs, most blog posts | SSG | Content is stable between deploys, so pre-rendered static HTML is fastest to serve and easiest to crawl. |
| Listings and feeds that change often | SSR | Fresh or request-specific data must be correct at view time, and rebuilding on every change is impractical. |
| Catalog or article pages that change periodically | ISR | Static speed with content refreshed on a schedule, avoiding a full rebuild per change. |
| Dashboards and authenticated screens | Client-side | Interactive, private, and does not need to rank, so indexing is not a concern. |
Do not hide indexable content behind client-only rendering. If a page needs to rank, its meaningful content should arrive as real HTML, not appear only after a browser-side fetch.
Getting Metadata Right
Every indexable page needs correct, unique metadata: a title, a description, canonical information and social tags. Next.js provides a Metadata API for defining this per page, including generating it dynamically from the page's own data, which is exactly what dynamic routes need.
- Unique titles and descriptions per page: never ship the same title across many pages, and generate them from the page's own content where pages are dynamic.
- Open Graph and social tags: so shared links render properly, which supports the clicks that indirectly help visibility.
- Dynamic metadata for dynamic routes: a product or article page should derive its title and description from its data, not fall back to a generic template.
- Structured data where it fits: rich results depend on correct markup, which our guide to structured data for SEO covers in depth.
The most common metadata bug in real apps is dynamic pages silently falling back to a default title because the data was not wired into the Metadata API. Check a few live dynamic URLs, not just the templates.
Building or Fixing SEO on a Next.js App?
Whether you are starting fresh or untangling why a React app is not ranking, our senior engineers can get the rendering, metadata and performance decisions right the first time.
Canonical URLs and Duplicate Content
Apps generate duplicate and near-duplicate URLs more easily than static sites do, because query parameters, trailing slashes, filtered views and pagination all create multiple URLs that show similar content. Canonical tags tell search engines which version is the real one, so set them deliberately.
- Set a self-referencing canonical on primary pages so there is no ambiguity about the preferred URL.
- Point parameter and filter variations at the main canonical URL where the content is essentially the same.
- Pick one URL convention, such as trailing slash or no trailing slash, and enforce it consistently rather than letting both resolve.
- Be honest with canonicals: do not canonicalise genuinely different pages onto one another, because that can hide real content from search engines.
Core Web Vitals in a Next.js App
Speed and stability are part of both the user experience and search performance, and a rich app can regress on them quietly as features pile up. Core Web Vitals measure loading, interactivity and visual stability, and Next.js gives you tools to keep them healthy if you use them deliberately.
- Control your JavaScript: large bundles delay interactivity, so split code, load non-critical scripts lazily, and keep a close watch on bundle size over time.
- Use the framework's image handling: properly sized, lazy-loaded, modern-format images prevent both slow loads and layout shift.
- Reserve space for dynamic content: give images, ads and embeds explicit dimensions so the page does not jump as they load.
- Prefer static or cached rendering where you can: a fast server response underpins every other metric, and static pages start ahead.
An SEO Implementation Checklist for Next.js
Pulling it together, here is the short list we run through on any Next.js app that needs to rank. Work through it in order: rendering first, then metadata and canonicals, then performance and crawlability.
- Give each page type a deliberate rendering choice, with indexable content served as real HTML rather than assembled only on the client.
- Confirm every page has unique, correct metadata, and that dynamic pages generate it from their own data.
- Set canonical URLs and a single URL convention, so duplicates do not compete.
- Measure Core Web Vitals on real pages and watch them as the app grows, not just once at launch.
- Generate a sitemap, make internal links real crawlable anchors, and verify nothing important is accidentally blocked from indexing.
- Test a sample of live URLs the way a search engine would, checking the rendered HTML and metadata rather than trusting the templates.
Common Mistakes Teams Make
A surprising amount of lost traffic on app-based sites comes from self-inflicted blocks rather than weak content, and these failures are quiet, so you find them by testing live URLs rather than assuming. These are the patterns we see most often.
- Indexable content rendered only on the client, so crawlers receive a near-empty shell and may not wait for the real content to appear.
- A stray noindex tag or a blanket disallow left over from a staging environment that silently deindexes a whole section.
- Dynamic pages falling back to a default title because the Metadata API was never wired to the page's data.
- Internal navigation built as buttons or click handlers a crawler cannot follow, breaking the link graph.
- Treating Core Web Vitals as a launch-day check rather than watching them as JavaScript accumulates, which our note on Core Web Vitals for SEO covers alongside performance testing.
How Acqurio Tech Approaches It
We treat the rendering decision as an engineering choice made per page type, not a framework default left on autopilot, because that is where most Next.js SEO problems begin. Working remotely from India with an engineered overlap window, our senior engineers audit how each route renders, wire the Metadata API so dynamic pages generate their own titles and descriptions, set honest canonicals, and put Core Web Vitals under ongoing measurement rather than a one-off launch check. The goal is a codebase where the framework does its job quietly and search visibility holds as the app grows. If a React or Next.js app is not ranking the way its content deserves, contact us and we will find the root cause with you.
Conclusion
Next.js is one of the better foundations for a fast, indexable web application, but it rewards judgement rather than replacing it. The wins come from matching the rendering strategy to each page type, wiring up correct and unique metadata, being honest with canonical URLs, and protecting Core Web Vitals as the codebase grows. Get those right and the framework does its job quietly in the background. Miss them and even excellent content can sit unseen behind a blank shell or a stray noindex. If you want experienced hands on the rendering, metadata and performance decisions, contact us and we will get them right with you.
Frequently asked questions
Is SEO for Nextjs apps well supported by the framework?
Yes, SEO for Nextjs apps is well supported because the framework can render pages on the server or at build time, so search engines receive real HTML instead of a blank shell that depends on client JavaScript to fill in. That removes the biggest obstacle a plain React single-page app faces. It also provides a Metadata API, image optimisation and other tools that help with titles, performance and indexing. The framework gives you strong capabilities, but the SEO outcome still depends on choosing the right rendering mode per page and keeping performance healthy.
What is the difference between SSR and SSG in Next.js for SEO?
Server-side rendering (SSR) builds the page into HTML on the server for each request, which suits content that changes often or is specific to the request. Static site generation (SSG) renders the page to HTML once at build time and serves it as a static file, which is the fastest option and ideal for content that rarely changes, such as marketing pages and most blog posts. Both give search engines real HTML, so both are far better than client-only rendering for indexing. The choice between them is about how fresh the content needs to be, not whether it can be indexed.
When should I use ISR instead of SSR or SSG?
Use incremental static regeneration (ISR) when content changes periodically but not on every request, such as a catalog or article page that updates a few times a day. ISR serves a pre-rendered static page for speed and rebuilds it on a schedule or on demand, so you get most of the performance of SSG without the stale content risk of building only at deploy time. Choose SSG when content is stable between deploys, and SSR when the page must reflect fresh or request-specific data every time it is viewed.
How do I handle metadata for SEO in Next.js?
Use the framework's Metadata API to define a unique title, description, canonical information and social tags for every indexable page. For dynamic routes such as product or article pages, generate that metadata from the page's own data rather than falling back to a generic template, which is a common and costly bug. Include Open Graph tags so shared links render properly, and add structured data where rich results are relevant. Always verify a few live dynamic URLs, because template code can look correct while individual pages quietly serve default titles.
Do Core Web Vitals matter for a Next.js app?
Yes. Core Web Vitals measure loading speed, interactivity and visual stability, and they affect both the user experience and search performance. A feature-rich app can regress on them quietly as JavaScript accumulates, so they need watching over time rather than checking once at launch. Next.js provides image optimisation, code splitting and static rendering that help you keep them healthy, but you have to use those tools deliberately and measure real pages. Reserving space for dynamic content and controlling bundle size are two of the most effective habits.
Why is my React app not ranking even though the content is good?
The most common cause is that indexable content is rendered only on the client, so search engines receive a near-empty shell and may not wait to see the real content, which is exactly the problem server rendering solves. Other frequent culprits are a stray noindex tag carried over from staging, a robots file that blocks a section, or internal navigation built as click handlers a crawler cannot follow. These issues fail silently, so the fix is to test live URLs the way a search engine sees them and confirm the real HTML and metadata are present. Moving key pages to server or static rendering usually addresses the root cause.
