SEO técnico en Next.js App Router: metadata, sitemap y JSON-LD
Guía completa de SEO técnico en Next.js App Router: generateMetadata, sitemap.ts, robots.ts, JSON-LD estructurado y las trampas más comunes.
- #seo
- #next.js
- #json-ld
- #metadata
- #sitemap
El SEO técnico en Next.js App Router es uno de esos temas donde la documentación oficial es buena pero incompleta. Te dice cómo usar generateMetadata, pero no te dice cuándo la metadata genérica te está costando clics. Esta guía cubre lo que uso en producción.
Metadata: lo que Google ve primero
Next.js App Router exporta metadata como un objeto tipado. El setup básico en layout.tsx debería incluir:
- metadataBase: URL canónica del sitio. Sin esto, las URLs relativas de OG images se rompen.
- title con template:
{ default: 'Mi Sitio', template: '%s — Mi Sitio' }. Cada página define su título y el layout añade el sufijo automáticamente. - description: meta description global. Cada página puede sobreescribirla con generateMetadata.
- alternates.canonical: la URL canónica evita contenido duplicado. Fundamental si tienes parámetros de query o trailing slashes.
generateMetadata para páginas dinámicas
Para un blog o páginas de proyecto, generateMetadata recibe los params de la ruta y genera metadata específica. El patrón que uso:
``typescript
export async function generateMetadata({ params }): Promise``
La clave: cada página tiene su propio title y description únicos. Metadata genérica o duplicada es una señal negativa para Google.
Open Graph y Twitter Cards
OG tags controlan cómo aparece tu link cuando alguien lo comparte. Lo mínimo: og:title, og:description, og:image, og:type. Para artículos, añade publishedTime y tags.
La OG image debería ser de 1200×630px. Si no tienes una por página, al menos define una global de calidad. Una URL compartida sin preview visual pierde un 80% de clics.
sitemap.ts y robots.ts
Next.js permite generar sitemap y robots como archivos TypeScript. Es más mantenible que XML manual.
El sitemap debe listar todas las URLs públicas con su lastModified. Para blogs, genera las rutas dinámicamente a partir de tus posts. El robots.txt debe permitir el crawling general y apuntar al sitemap.
JSON-LD: datos estructurados
JSON-LD es el formato que Google prefiere para datos estructurados. Los schemas que uso en cada portfolio o web de negocio:
- Person: nombre, rol, links sociales, conocimientos.
- WebSite: nombre del sitio, URL, idioma.
- ProfessionalService: para freelance, incluye servicios ofrecidos y área de cobertura.
- Article: para cada post del blog, con headline, datePublished, author.
- BreadcrumbList: ayuda a Google a mostrar la jerarquía de navegación en los resultados.
El truco: inyectar cada schema como un en la página correspondiente. El layout inyecta los globales, cada página de blog inyecta el Article específico.
Trampas comunes
- Olvidar metadataBase: las OG images con rutas relativas aparecen rotas en el preview de Facebook y Twitter.
- Metadata duplicada entre páginas: Google penaliza descriptions idénticas. Cada página necesita la suya.
- No indexar páginas draft: si tienes posts en borrador, asegúrate de que no aparecen en el sitemap ni tienen
index: true. - Canonical incorrecto: si tu sitio responde en www y sin www, define uno como canónico o estarás dividiendo autoridad.
Conclusión
El SEO técnico en Next.js no es difícil, pero requiere disciplina. Configurar metadata, sitemap, robots y JSON-LD una vez bien te ahorra problemas y te da visibilidad orgánica que funciona mientras duermes. Si tu portfolio o web de negocio no tiene estos elementos, estás dejando tráfico sobre la mesa.
¿Construyendo algo?
Si esto te ha resonado, podemos hablar. Contactar →