Guía de SEO en Next.js: elegir SSG, SSR o ISR, definir metadatos y canónicas, generar sitemap.xml, alimentar un blog por webhook y seguir siendo legible para las IA.

En resumen
Next.js es uno de los mejores frameworks de React para SEO porque envía a los rastreadores HTML completo en lugar de una carcasa vacía. Para posicionar, prerrenderiza las páginas de contenido (generación estática o ISR), define títulos, descripciones y canónicas con la Metadata API, genera sitemap.xml y robots.txt desde la carpeta app, usa enlaces reales y códigos de estado correctos, y mantén el contenido principal fuera del código que solo se ejecuta en el navegador, ya que la mayoría de los rastreadores de las IA no ejecutan JavaScript.
¿Quiere ir más lejos? Pregunte a
Quiz rápido
¿Es el SEO para ti y cómo empezar?
4 preguntas rápidas para ver si Google puede traerte clientes.
Nuestro consejo para ti
Sorank es la solución adecuada para usted
La gente busca lo que vendes y puedes esperar unos meses: Sorank encuentra las búsquedas adecuadas, redacta y publica los artículos y te consigue enlaces.
Sorank encaja con tus respuestas
Pruébalo 3 días en tu propia web o empieza con una auditoría gratuita para saber dónde estás.
3 días gratis y luego lo dejas cuando quieras. Garantía de devolución de 90 días.
El SEO en Next.js consiste sobre todo en tomar la decisión correcta en cada ruta: qué se renderiza en el servidor, qué se almacena en caché y qué llega al HTML antes de que se ejecute cualquier script. Google explica en sus conceptos básicos de SEO para JavaScript que procesa las aplicaciones JavaScript en tres fases (rastreo, renderizado e indexación) y que el renderizado en el servidor o el prerrenderizado «sigue siendo una gran idea». Next.js lo hace por defecto. Esta guía cubre el App Router (Next.js 13 y posteriores), con notas para el antiguo Pages Router.
Sí. Una aplicación React clásica renderizada en el cliente envía un archivo HTML casi vacío y construye la página en el navegador; los buscadores deben renderizarla y muchos bots nunca lo hacen. Next.js renderiza React en el servidor, de modo que la respuesta HTML ya contiene encabezados, texto, enlaces y metadatos. Nuestra guía de SEO para JavaScript explica por qué esa diferencia importa para la indexación.
En el App Router, los componentes son Server Components por defecto. Incluso los componentes marcados con 'use client' se prerrenderizan a HTML en el servidor. El punto débil son los datos: todo lo que cargas dentro de useEffect, o solo después de un clic, falta en el HTML inicial. Obtén el contenido en Server Components y reserva los componentes de cliente para la interactividad.
Next.js permite combinar modos ruta por ruta. La elección afecta a la frescura, la velocidad y lo que reciben los rastreadores.
| Modo | Cuándo se genera el HTML | Veredicto SEO | Ideal para |
|---|---|---|---|
| Generación estática (SSG) | En el build | El mejor: HTML completo, muy rápido | Landing pages, documentación, artículos atemporales |
| Regeneración estática incremental (ISR) | En el build y luego actualizado en segundo plano o bajo demanda | El mejor para sitios grandes o cambiantes | Blogs, catálogos de productos, páginas de un CMS |
| Renderizado en el servidor (SSR) | En cada solicitud | Bueno: HTML completo, depende de la velocidad del servidor | Páginas personalizadas o en tiempo real |
| Renderizado en el cliente (CSR) | En el navegador | Débil: contenido invisible para la mayoría de los bots | Paneles tras un inicio de sesión |
La documentación de Next.js sobre ISR enumera sus ventajas: actualizar contenido estático «sin reconstruir todo el sitio» y gestionar grandes cantidades de páginas sin builds eternos. Una ruta con export const revalidate = 3600 se regenera como máximo una vez por hora; para un control exacto, llama a revalidatePath o revalidateTag cuando cambie el contenido. ISR no funciona con una exportación estática (output: 'export'). Para las aplicaciones que deben seguir renderizándose en el cliente, nuestra guía de SEO para aplicaciones de una sola página repasa las soluciones.
Consejo
Comprueba lo que reciben los bots, no lo que muestra tu navegador: ejecuta curl sobre la URL o abre view-source y busca una frase del artículo. Si no está en el HTML sin procesar, depende de JavaScript.
La Metadata API sustituye a next/head en el App Router. Según la documentación de Next.js sobre metadatos, exportas un objeto metadata estático desde un layout o una página, o una función generateMetadata cuando los valores dependen de datos, y Next.js genera las etiquetas del head. Ambos solo se admiten en 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 reglas que evitan la mayoría de los problemas:
En las páginas dinámicas, Next.js transmite los metadatos en streaming después de los primeros bytes para acelerar el renderizado. La documentación indica que el streaming está desactivado para los bots que esperan los metadatos en el head, detectados por su user agent (Bingbot, Twitterbot y Slackbot figuran entre los ejemplos), y que la opción htmlLimitedBots permite ajustar la lista. Si un rastreador que te importa no está incluido, añádelo. En el Pages Router, el equivalente es el componente Head de next/head, con un atributo key para evitar etiquetas duplicadas.
Ambos son archivos especiales de la carpeta app. Un archivo sitemap.ts que exporta una función que devuelve URL se convierte en /sitemap.xml; un archivo robots.ts se convierte en /robots.txt. La referencia del sitemap señala que el archivo se almacena en caché por defecto y que el límite de Google es de 50.000 URL por sitemap; por encima, generateSitemaps lo divide en varios archivos.
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,
}))
}Incluye solo URL canónicas, indexables y que respondan 200, con la fecha real de actualización en lastModified. El sitemap también acepta alternates.languages para sitios multilingües. En robots.ts, apunta al sitemap y decide qué bots de IA pueden rastrear el sitio; nuestro artículo sobre robots.txt para los rastreadores de IA los enumera. Más detalles del formato en nuestra entrada sobre el sitemap XML.
| Problema | Qué ocurre | Solución |
|---|---|---|
| Navegación con onClick y router.push | Google solo sigue elementos a con href | Usar el componente Link de next/link, que genera un enlace real |
| Contenido inexistente servido como página 200 | «Soft 404» en Search Console | Llamar a notFound() para que la ruta devuelva un estado 404 |
| Redirecciones temporales para páginas movidas | redirect() envía un 307 | Usar permanentRedirect() o permanent: true en next.config (308) |
| Barras finales mezcladas | Dos URL para la misma página | Elegir una con la opción trailingSlash y mantener canónicas coherentes |
| Despliegues de preproducción indexados | Copias duplicadas del sitio en Google | Enviar noindex en los dominios que no son de producción |
| Contenido de pestañas cargado al hacer clic | Texto ausente del HTML | Renderizar todo el contenido en el servidor y ocultarlo con CSS si hace falta |
Todos estos fallos reducen la rastreabilidad: un rastreador debe poder descubrir cada URL mediante enlaces y obtener un código de estado limpio.
La documentación de Next.js recomienda renderizar el JSON-LD en una etiqueta script de tipo application/ld+json directamente en el componente de página o de layout, a partir de los mismos datos que la página, y escapar el carácter < en el JSON serializado para evitar inyecciones. Como se renderiza en el servidor, Google y los rastreadores de IA lo ven en el HTML sin procesar. Usa Article (o BlogPosting) para los artículos, Organization en el layout raíz, BreadcrumbList para las páginas profundas y Product en e-commerce. Un generador de schema te da un bloque válido de partida; después valida la página con la prueba de resultados enriquecidos de Google.
Next.js incluye componentes que resuelven las causas habituales de unas malas Core Web Vitals:
Mide datos de campo, no solo una puntuación de laboratorio: nuestra guía de PageSpeed Insights explica cómo leer ambos.
Un blog en Next.js suele adoptar una de tres formas: archivos MDX o Markdown en el repositorio (sencillo, pero cada artículo exige un commit y un despliegue), un CMS headless (Sanity, Contentful, Strapi, Payload) consultado desde Server Components, o un webhook de publicación que recibe artículos de una herramienta externa. En los tres casos el patrón SEO es el mismo: una ruta dinámica app/blog/[slug] con generateStaticParams, generateMetadata, ISR, un sitemap alimentado por la misma fuente y una página índice que enlaza todos los artículos.
El webhook saca la publicación del ciclo de despliegue. Un Route Handler recibe el artículo, lo guarda y revalida las páginas afectadas:
// 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 })
}Atención
Protege el endpoint con un secreto y revalida la ruta pública exacta. La documentación de ISR advierte que, con varias instancias de servidor y la caché de archivos por defecto, la revalidación bajo demanda solo limpia la instancia que recibe la llamada; usa un gestor de caché compartido.
El renderizado en el servidor es la primera condición del GEO (optimización para motores generativos). El análisis de Vercel de diciembre de 2024, The rise of the AI crawler, concluyó que «ninguno de los grandes rastreadores de IA renderiza JavaScript actualmente», citando a GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot y PerplexityBot, y contó 569 millones de solicitudes de GPTBot y 370 millones de Claude en su red en un mes. Una página Next.js que prerrenderiza su texto, sus encabezados y su JSON-LD es legible para todos ellos; una página renderizada en el cliente no lo es.
La segunda condición es un contenido que merezca ser citado: artículos que respondan a una pregunta por sección, con fuentes, cifras y definiciones claras, publicados con regularidad. Esa es la parte que automatiza Sorank, nuestro producto. Sorank es un software de SEO y GEO en autopilot: encuentra tus palabras clave y su generador de artículos de blog redacta 20, 60 o 120 artículos al mes con fuentes, enlaces internos e imágenes. En un sitio Next.js, se conecta mediante el webhook personalizado descrito en la página de instalación: tu Route Handler recibe cada artículo, lo guarda y revalida el blog. El seguimiento de menciones en IA comprueba después cada semana si ChatGPT, Claude y Gemini citan tu marca.

En pocas palabras: prerrenderiza cada página que quieras que encuentren, define los metadatos en el servidor y alimenta el sitemap desde la misma fuente que el contenido. Next.js aporta las herramientas; las posiciones y las citas de las IA dependen de lo que publiques con ellas. Para mantener un blog en Next.js con artículos nuevos, consulta los planes de Sorank, desde 49 € al mes con 3 días de prueba gratis.
Next.js está construido sobre React, así que la comparación es entre formas de renderizar. Una aplicación React de una sola página por defecto se renderiza en el navegador y envía un HTML casi vacío, mientras que Next.js prerrenderiza las páginas en el servidor o durante el build. Los rastreadores, incluidos los bots de IA que no ejecutan JavaScript, reciben el contenido completo con Next.js sin configuración adicional.
No por sí solo. En el App Router añades a la carpeta app un archivo sitemap.ts que devuelve tus URL, y Next.js lo sirve en /sitemap.xml. En sitios grandes, generateSitemaps reparte la lista en varios archivos, ya que Google acepta hasta 50.000 URL por sitemap.
Ambos pueden posicionar bien porque los dos prerrenderizan HTML. El App Router es la opción recomendada para proyectos nuevos: los Server Components reducen el JavaScript en el cliente, y la Metadata API, sitemap.ts y robots.ts gestionan de forma nativa los archivos SEO. En un sitio existente con Pages Router, migrar rara vez compensa solo por el SEO.
PROBARON SORANK ANTES QUE USTED
