Hreflang indica a los buscadores qué URL corresponde a cada idioma o región cuando el mismo contenido (o plantillas equivalentes) existe en varios sitios. No traduce páginas, no sustituye rel=canonical ni arregla duplicados por sí solo. Responde a una pregunta más estrecha: para este tema, qué URL preferimos para usuarios en Francia frente a usuarios en el Reino Unido.
Cuando hreflang está mal o incompleto, rara vez verás un aviso claro en Search Console. Rankea la plantilla equivocada en el país equivocado, o ningún locale consolida relevancia. Esta guía cubre implementación en HTML, cabeceras HTTP y sitemaps XML, el papel de x-default y los errores que invalidan un cluster. Para generar bloques antes del deploy, usa el Generador de hreflang. Para auditar URLs en vivo, el Comprobador de hreflang.
Qué es un cluster hreflang
Un cluster es el conjunto de URLs que son alternas de locale del mismo contenido (o del mismo tipo de plantilla, p. ej. cada ficha de producto). Cada URL del cluster debe:
- Referenciar todas las demás, incluida ella misma (autorreferencia).
- Mantener reciprocidad: si A lista B, B debe listar A con los mismos códigos.
- Usar etiquetas IETF válidas (ISO 639-1 + región ISO 3166-1 opcional —
en-GB, noen-UKnien_GB).
Google documenta hreflang en HTML, cabeceras o sitemap. La sintaxis cambia; el set lógico debe ser coherente.
| Método | Dónde vive | Cuándo encaja |
|--------|------------|---------------|
| HTML <link rel="alternate" hreflang> | <head> | El CMS inyecta tags por plantilla |
| Cabecera HTTP Link | Respuesta del servidor | CDN o reglas de servidor |
| Sitemap xhtml:link | Archivo XML | Sitios grandes, headless, generación por lotes |
Implementación en HTML
Forma habitual: una línea por alterna en el head:
<link rel="alternate" hreflang="en-US" href="https://example.com/us/producto/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/producto/" />
<link rel="alternate" hreflang="fr-FR" href="https://example.com/fr/produit/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />Cada URL localizada lleva el bloque completo, no solo las líneas de su idioma. La página US incluye en-GB y fr-FR apuntando a UK y Francia, más su propia línea en-US. Pegar solo dos tags es el fallo más común.
Usa URLs absolutas con https://. Rutas relativas (/fr/pagina) fallan al resolver y en muchos exports de sitemap.
Cabeceras HTTP Link
Las mismas alternas pueden ir en cabecera Link:
Link: <https://example.com/us/producto/>; rel="alternate"; hreflang="en-US", <https://example.com/uk/producto/>; rel="alternate"; hreflang="en-GB"Útil cuando el <head> es frágil pero el edge puede añadir cabeceras. Las reglas del cluster no cambian: set completo, autorreferencia, reciprocidad, códigos válidos.
Evita publicar el mismo set en head y cabecera sin intención clara. Elige una fuente de verdad.
Implementación en sitemap XML
En sitios grandes, hreflang en sitemap saca miles de alternas de plantillas individuales. Cada <url> incluye <loc> e hijos xhtml:link:
<url>
<loc>https://example.com/us/producto/</loc>
<xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/us/producto/" />
<xhtml:link rel="alternate" hreflang="en-GB" href="https://example.com/uk/producto/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
</url>Declara xmlns:xhtml="http://www.w3.org/1999/xhtml" en urlset. Cada URL localizada suele ser un bloque <url> con el mismo set de xhtml:link. Hreflang solo en sitemap sigue exigiendo reciprocidad lógica.
No sustituye canonical correcto en cada URL. Canonical e hreflang resuelven problemas distintos.
x-default
`x-default` es el valor de respaldo para quien no encaja en otro hreflang del cluster. Opciones habituales:
- Página selector de idioma en la raíz.
- Tu mercado principal cuando otros locales son añadidos.
- Inglés global cuando existen URLs en-US y en-GB aparte.
Google recomienda x-default con targeting por país o idioma. Omitirlo no es error duro, pero es un hueco frecuente.
Códigos de locale que pasan validación
Hreflang usa BCP 47, no nombres de país ni IDs de CMS:
- Solo idioma:
en,fr,de. - Idioma + región:
en-GB,es-MX,pt-BR. - Script:
zh-Hans,zh-Hant.
Corrige antes de publicar:
| Error | Correcto |
|-------|----------|
| en-UK | en-GB |
| en_GB | en-GB |
| GB-en | en-GB |
| english | en |
Google ignora en silencio códigos mal formados.
Retornos y autorreferencia
Autorreferencia: la URL US debe incluir hreflang="en-US" apuntando a sí misma.
Retorno: la URL francesa debe listar US y UK con los mismos códigos que esas páginas usan. Si US lista Francia pero la página FR omite US, Google puede ignorar todo el cluster.
Por eso ayuda una hoja: una fila por URL, columnas por locale, generación programática. Editar una plantilla sin actualizar las demás rompe la reciprocidad en días.
Elegir HTML, cabecera o sitemap
No hay ganador universal.
- HTML se inspecciona fácil (código fuente, comprobador).
- Cabeceras encajan con edge cuando el head no.
- Sitemaps escalan cuando cada SKU tiene decenas de locales.
Tras publicar, comprueba URLs con el comprobador de hreflang. El generador valida forma antes del deploy; no ve cachés del CMS.
Errores más allá de la sintaxis
Hreflang entre páginas no equivalentes. Conecta traducciones o variantes regionales del mismo contenido, no home con un post porque ambos tienen versión en francés.
Etiquetar solo el idioma “principal”. Todas las URLs locale participan por igual.
Mezcla http/https o hosts distintos. Alinea hreflang con tu host canónico.
Migrar sin reconstruir clusters. Cambios de dominio o rutas /en/ huerfanan alternas. Regenera, redirige y vuelve a comprobar.
Flujo que usamos
- Inventario de plantillas equivalentes.
- Tabla — filas URLs, columnas locales, celdas con URLs absolutas.
- Generar con el generador (o CMS desde la misma tabla).
- Publicar el mismo día en todas las plantillas del cluster si es posible.
- Verificar cada tipo de plantilla en vivo con el comprobador.
- Repetir tras actualizaciones de plugins de idioma.
CSV url, lang-code, group encaja con el modo bulk del generador para corregir códigos y x-default antes de copiar HTML, cabeceras o XML.
Hreflang es tedioso porque la corrección es en grafo: cada nodo debe apuntar a todos con etiquetas consistentes. Trátalo como datos estructurados: genera desde datos, valida en vivo y arregla reciprocidad antes de teorizar sobre rankings.