Guia de SEO no Next.js: escolher SSG, SSR ou ISR, definir metadados e canônicas, gerar sitemap.xml, alimentar um blog por webhook e continuar legível para as IA.

Em resumo
o Next.js é um dos melhores frameworks React para SEO porque entrega aos rastreadores um HTML completo em vez de uma casca vazia. Para ranquear, pré-renderize as páginas de conteúdo (geração estática ou ISR), defina títulos, descrições e canônicas com a Metadata API, gere sitemap.xml e robots.txt a partir da pasta app, use links reais e códigos de status corretos e mantenha o conteúdo principal fora do código que roda só no navegador, já que a maioria dos rastreadores das IA não executa JavaScript.
Quer ir mais longe? Pergunte ao
Quiz rápido
O SEO é para você, e como começar?
4 perguntas rápidas para ver se o Google pode trazer clientes para você.
Nossa recomendação para você
O Sorank é a solução certa para você
As pessoas buscam o que você vende e você pode esperar alguns meses: o Sorank encontra as buscas certas, escreve e publica os artigos e consegue links para você.
O Sorank combina com suas respostas
Teste por 3 dias no seu próprio site ou comece com uma auditoria gratuita para saber onde você está.
3 dias grátis, depois você para quando quiser. Garantia de reembolso de 90 dias.
SEO no Next.js é, acima de tudo, fazer a escolha certa em cada rota: o que é renderizado no servidor, o que fica em cache e o que chega ao HTML antes de qualquer script rodar. O Google explica em seus princípios básicos de SEO para JavaScript que processa apps JavaScript em três fases (rastreamento, renderização e indexação) e que a renderização no servidor ou a pré-renderização "ainda é uma ótima ideia". O Next.js faz isso por padrão. Este guia cobre o App Router (Next.js 13 em diante), com observações sobre o antigo Pages Router.
Sim. Um app React clássico renderizado no cliente envia um arquivo HTML quase vazio e monta a página no navegador; os buscadores precisam renderizá-la, e muitos bots nunca fazem isso. O Next.js renderiza o React no servidor, então a resposta HTML já contém títulos, texto, links e metadados. Nosso guia de SEO para JavaScript explica por que essa diferença importa para a indexação.
No App Router, os componentes são Server Components por padrão. Mesmo os componentes marcados com 'use client' são pré-renderizados em HTML no servidor. O ponto fraco são os dados: tudo o que você carrega dentro de useEffect, ou só depois de um clique, fica fora do HTML inicial. Busque o conteúdo em Server Components e reserve os componentes de cliente para a interatividade.
O Next.js permite combinar modos rota por rota. A escolha afeta a atualização, a velocidade e o que os rastreadores recebem.
| Modo | Quando o HTML é gerado | Veredito de SEO | Ideal para |
|---|---|---|---|
| Geração estática (SSG) | No build | O melhor: HTML completo, muito rápido | Landing pages, documentação, artigos perenes |
| Regeneração estática incremental (ISR) | No build, depois atualizado em segundo plano ou sob demanda | O melhor para sites grandes ou que mudam | Blogs, catálogos de produtos, páginas de CMS |
| Renderização no servidor (SSR) | A cada requisição | Bom: HTML completo, depende da velocidade do servidor | Páginas personalizadas ou em tempo real |
| Renderização no cliente (CSR) | No navegador | Fraco: conteúdo invisível para a maioria dos bots | Painéis atrás de login |
A documentação do Next.js sobre ISR lista as vantagens: atualizar conteúdo estático "sem reconstruir o site inteiro" e lidar com grandes volumes de páginas sem builds demorados. Uma rota com export const revalidate = 3600 é regenerada no máximo uma vez por hora; para controle exato, chame revalidatePath ou revalidateTag quando o conteúdo mudar. O ISR não funciona com exportação estática (output: 'export'). Para apps que precisam continuar renderizados no cliente, nosso guia de SEO para aplicações de página única mostra as alternativas.
Dica
Verifique o que os bots recebem, e não o que seu navegador mostra: rode curl na URL ou abra o view-source e procure uma frase do artigo. Se ela não estiver no HTML bruto, depende de JavaScript.
A Metadata API substitui o next/head no App Router. Segundo a documentação do Next.js sobre metadados, você exporta um objeto metadata estático de um layout ou de uma página, ou uma função generateMetadata quando os valores dependem de dados, e o Next.js gera as tags do head. Os dois só funcionam em Server Components.
export async function generateMetadata({ params }) {
const { slug } = await params
const post = await getPost(slug)
return {
title: post.title,
description: post.excerpt,
alternates: { canonical: `/blog/${slug}` },
openGraph: { images: [post.cover] },
}
}Cinco regras que evitam a maioria dos problemas:
Em páginas dinâmicas, o Next.js envia os metadados por streaming depois dos primeiros bytes para acelerar a renderização. A documentação informa que o streaming fica desativado para bots que esperam os metadados no head, detectados pelo user agent (Bingbot, Twitterbot e Slackbot estão entre os exemplos), e que a opção htmlLimitedBots permite ajustar a lista. Se um rastreador importante para você não estiver nela, adicione-o. No Pages Router, o equivalente é o componente Head do next/head, com um atributo key para evitar tags duplicadas.
Os dois são arquivos especiais da pasta app. Um arquivo sitemap.ts que exporta uma função que retorna URLs vira /sitemap.xml; um arquivo robots.ts vira /robots.txt. A referência do sitemap observa que o arquivo fica em cache por padrão e que o limite do Google é de 50.000 URLs por sitemap; acima disso, generateSitemaps o divide em vários arquivos.
import type { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts()
return posts.map((p) => ({
url: `https://example.com/blog/${p.slug}`,
lastModified: p.updatedAt,
}))
}Inclua apenas URLs canônicas, indexáveis e que respondem 200, com a data real de atualização em lastModified. O sitemap também aceita alternates.languages para sites multilíngues. No robots.ts, aponte para o sitemap e decida quais bots de IA podem rastrear o site; nosso artigo sobre robots.txt para rastreadores de IA lista todos eles. Mais sobre o formato no nosso verbete sobre sitemap XML.
| Problema | O que acontece | Correção |
|---|---|---|
| Navegação com onClick e router.push | O Google só segue elementos a com href | Usar o componente Link do next/link, que gera um link real |
| Conteúdo inexistente servido como página 200 | "Soft 404" no Search Console | Chamar notFound() para que a rota retorne status 404 |
| Redirecionamentos temporários para páginas movidas | redirect() envia um 307 | Usar permanentRedirect() ou permanent: true no next.config (308) |
| Barras finais misturadas | Duas URLs para a mesma página | Escolher uma com a opção trailingSlash e manter as canônicas coerentes |
| Deploys de prévia ou homologação indexados | Cópias duplicadas do site no Google | Enviar noindex nos domínios que não são de produção |
| Conteúdo de abas carregado no clique | Texto ausente do HTML | Renderizar todo o conteúdo no servidor e escondê-lo com CSS se preciso |
Todos esses problemas reduzem a rastreabilidade: um rastreador precisa descobrir cada URL por links e receber um código de status limpo.
A documentação do Next.js recomenda renderizar o JSON-LD em uma tag script do tipo application/ld+json diretamente no componente de página ou de layout, a partir dos mesmos dados da página, e escapar o caractere < no JSON serializado para evitar injeção. Como é renderizado no servidor, o Google e os rastreadores de IA o veem no HTML bruto. Use Article (ou BlogPosting) para posts, Organization no layout raiz, BreadcrumbList para páginas profundas e Product no e-commerce. Um gerador de schema fornece um bloco válido para começar; depois, valide a página com o teste de pesquisa aprimorada do Google.
O Next.js traz componentes que resolvem as causas comuns de Core Web Vitals ruins:
Meça dados de campo, não só uma nota de laboratório: nosso guia do PageSpeed Insights mostra como ler os dois.
Um blog em Next.js costuma ter uma de três formas: arquivos MDX ou Markdown no repositório (simples, mas cada post exige um commit e um deploy), um CMS headless (Sanity, Contentful, Strapi, Payload) consultado em Server Components, ou um webhook de publicação que recebe artigos de uma ferramenta externa. Nos três casos o padrão de SEO é o mesmo: uma rota dinâmica app/blog/[slug] com generateStaticParams, generateMetadata, ISR, um sitemap alimentado pela mesma fonte e uma página de índice que linka todos os posts.
O webhook tira a publicação do ciclo de deploy. Um Route Handler recebe o artigo, salva e revalida as páginas afetadas:
// app/api/publish/route.ts
import { revalidatePath } from 'next/cache'
export async function POST(request) {
if (request.headers.get('authorization') !== `Bearer ${process.env.PUBLISH_SECRET}`) {
return new Response('Unauthorized', { status: 401 })
}
const article = await request.json()
await savePost(article)
revalidatePath('/blog')
revalidatePath(`/blog/${article.slug}`)
return Response.json({ ok: true })
}Atenção
Proteja o endpoint com um segredo e revalide o caminho público exato. A documentação de ISR alerta que, com várias instâncias de servidor e o cache em arquivo padrão, a revalidação sob demanda só limpa a instância que recebe a chamada; use um gerenciador de cache compartilhado.
A renderização no servidor é a primeira condição do GEO (otimização para motores generativos). A análise da Vercel de dezembro de 2024, The rise of the AI crawler, concluiu que "nenhum dos grandes rastreadores de IA renderiza JavaScript atualmente", citando GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot e PerplexityBot, e contou 569 milhões de requisições do GPTBot e 370 milhões do Claude em sua rede em um mês. Uma página Next.js que pré-renderiza texto, títulos e JSON-LD é legível para todos eles; uma página renderizada no cliente, não.
A segunda condição é um conteúdo que mereça ser citado: artigos que respondem a uma pergunta por seção, com fontes, números e definições claras, publicados com regularidade. É essa parte que a Sorank, nosso produto, automatiza. A Sorank é um software de SEO e GEO no autopilot: encontra suas palavras-chave, e o seu gerador de artigos para blog escreve 20, 60 ou 120 artigos por mês com fontes, links internos e imagens. Em um site Next.js, ela se conecta pelo webhook personalizado descrito na página de instalação: seu Route Handler recebe cada artigo, salva e revalida o blog. O monitoramento de menções nas IA verifica depois, toda semana, se ChatGPT, Claude e Gemini citam sua marca.

Resumindo: pré-renderize cada página que você quer que seja encontrada, defina os metadados no servidor e alimente o sitemap pela mesma fonte do conteúdo. O Next.js oferece as ferramentas; posições e citações nas IA vêm do que você publica com elas. Para manter um blog em Next.js abastecido de artigos, veja os planos da Sorank, a partir de 49 € por mês com 3 dias de teste grátis.
O Next.js é construído sobre o React, então a comparação é entre formas de renderizar. Um app React de página única padrão renderiza no navegador e envia um HTML quase vazio, enquanto o Next.js pré-renderiza as páginas no servidor ou no build. Os rastreadores, inclusive os bots de IA que não executam JavaScript, recebem o conteúdo completo com o Next.js sem configuração extra.
Não sozinho. No App Router, você adiciona à pasta app um arquivo sitemap.ts que retorna suas URLs, e o Next.js o serve em /sitemap.xml. Em sites grandes, generateSitemaps divide a lista em vários arquivos, já que o Google aceita até 50.000 URLs por sitemap.
Os dois podem ranquear bem porque ambos pré-renderizam HTML. O App Router é a escolha recomendada para projetos novos: os Server Components reduzem o JavaScript no cliente, e a Metadata API, o sitemap.ts e o robots.ts cuidam dos arquivos de SEO de forma nativa. Em um site que já usa Pages Router, migrar raramente vale a pena só pelo SEO.
ELES EXPERIMENTARAM O SORANK ANTES DE VOCÊ
