En casi cada reunión con una agencia que tiene banderas en el header aparece la misma frase:
“Pero si el usuario puede cambiar el idioma…”
Sí. El usuario. Googlebot no hace clic en la bandera italiana. Recorre <a href>. Si esa bandera apunta a la home del .it desde la ficha del Camino Inca en inglés, el crawler recibe una señal de que esas dos URLs están relacionadas como portada, no como el mismo trek. Y el italiano que estaba a un paso de reservar vuelve a inicio a buscar el producto. Muchos no lo hacen.
Canonical, hreflang y la bandera hacen tres trabajos distintos. Si las usas como sinónimos, el índice recibe señales que no coinciden.
1. Canonical elige entre duplicados
Declara la versión preferida cuando el mismo contenido (o casi) vive en varias URLs: con y sin www, con parámetros UTM, con una copia /tour/x/ y /tour/x-2/ que el CMS duplicó.
Es una señal, no una orden. Si el resto del sitio (enlaces internos, sitemap, hreflang, título) apunta a otra URL, Google puede elegir esa otra como canónica. Por eso “poner canonical y ya” no arregla un duplicado si el menú sigue enlazando las dos.
En un caso real en español, dos slugs del mismo bike tour convivían en el sitemap. La corrección no es hreflang. Es: GSC, cuál rankea, 301 a esa, menú y sitemap alineados. Hreflang no fusiona duplicados del mismo idioma.
2. Hreflang agrupa traducciones
Mismo producto, distinto idioma. URLs distintas, contenido distinto (tiene que serlo: traducir mal y dejar el precio en USD en la ficha PT es contenido distinto y peor). El grupo existe para que Google elija según el usuario, no para que “gane la más fuerte”.
No sustituye canonical. Una ficha PT tiene canonical a sí misma y hreflang a EN/ES/IT.
No se pone hreflang a una URL que canónicamente declara otra. Primero la canónica coherente, después el grupo.
3. La bandera es navegación
HTML, visible, humano. Su único deber SEO es no mentir el grafo interno:
- Si existe ficha hermana →
hrefa esa ficha. - Si no existe → o no se muestra esa bandera, o se va a una categoría honesta (“tours en italiano”), no a fingir que la home es el producto.
hreflangen el<head>además. El clic humano no reemplaza la anotación.
Bandera decorativa
Bandera de red
Señales que se pisan: la lista corta
| Si haces esto | Google puede entender |
|---|---|
| Canonical PT → EN, más hreflang PT | “¿Esta página existe o no?” |
| Hreflang a una URL que 301 | “El grupo incluye un fantasma” |
| Sitemap con las dos duplicadas ES, más canonical a una | “El sitemap discute al head” |
| Bandera a home, hreflang a ficha | El humano y el bot hacen caminos distintos |
noindex en el italiano “porque aún está corto” y hreflang hacia él | El grupo incluye una URL que pediste no indexar |
La higiene es aburrida y es el trabajo: una historia. Sitemap, canonical, hreflang, menú, banderas, 301 del dominio viejo. Si el dominio legacy redirige bien página a página, no lo metas en el hreflang. El grupo vive en las URLs 200.
Cómo lo auditas en una hora
- Home EN: ¿canonical a sí misma? ¿hreflang? ¿href de cada bandera?
- Ficha de tour EN: lo mismo. Compara el
hrefde la bandera IT con elhreflang="it". Tienen que ser la misma URL, o una de las dos está mal. - Esa URL IT: ¿200? ¿canonical propia? ¿bloque recíproco?
- Sitemap: ¿aparece la duplicada que ya 301-easte?
No hace falta un crawler de 10.000 URLs para descubrir que las banderas mienten. Hace falta abrir dos fichas. El crawler entra después, para ver cuántas mienten.
Cómo se relacionan las tres
El selector es para el cliente que ya está en el sitio. Hreflang es para el que todavía está en Google. Canonical es para no tener dos fichas peleándose en español. Si las tres cuentan la misma historia, el brasileño ve portugués, el duplicado muere, y el que ya estaba en la ficha no salta a la portada. Si cada una cuenta la suya, Google elige, y suele elegir mal para el mercado que más les importa.
El plugin de banderas que vino con el theme no hace ese trabajo.