# Referencia de reglas (/es/docs/rules)

> Cada regla que comprueba Loomaly, con su gravedad, dimensión de la puntuación, ID, qué significa y cómo corregirla.

{/* Generated by scripts/gen-rules-docs.ts — edit the script, not this file. */}

Cada problema que informa Loomaly sale de una de las 81 reglas de esta página, y cada regla la emite exactamente una parte del escaneo. Las explicaciones y los prompts de corrección vienen de plantillas fijas, así que el mismo problema recibe el mismo ID de regla y la misma redacción en cada escaneo. Así distingue Loomaly si un problema es nuevo, sigue ahí o ya está corregido. Para trabajar los problemas, consulta [Problemas](/docs/issues).

## Cómo afectan las reglas a tu puntuación de salud [#health-score]

Cada regla tiene una **gravedad** (**Error**, **Advertencia** o **Aviso**) y una **dimensión**: la parte de la salud en buscadores que mide. En una página, un error deja esa dimensión en 0, una advertencia cuesta 25 puntos y un aviso cuesta 5 (como máximo 10 entre avisos). La puntuación del sitio es una media ponderada de las cinco dimensiones. [Cómo funciona la puntuación de salud](/docs/scoring) tiene el detalle y un ejemplo resuelto.

## Cómo se comprueban las reglas [#checked-by]

La última columna de cada tabla indica qué parte de un escaneo puede informar la regla. Consulta [Cómo funciona un escaneo](/docs/how-scans-work) para ver cuándo corre cada parte.

| Comprobado por | Qué significa | Grupo del hallazgo |
| --- | --- | --- |
| Comprobación de reglas | El código comprueba el HTML de la página, siempre de la misma forma, en cada página que encuentra Loomaly. | **Estructural** |
| Juicio de IA | Un modelo de IA responde una pregunta fija sobre la página (por ejemplo, si ofrece un siguiente paso claro), en cada página. Solo las respuestas en las que confía se convierten en problemas, y el código decide qué preguntas se aplican a cada tipo de página. | **Semántica** |
| Prueba de rendimiento | Se mide con Google PageSpeed Insights en móvil, con datos reales de usuarios de Chrome cuando existen, en las páginas representativas de cada plantilla. | **Rendimiento** |
| Juicio de página | La IA juzga las páginas que el código marcó como sospechosas (casi duplicadas, o que parecen vacías o desaparecidas) después de un escaneo del sitio. | **Juicios de página** |
| Comprobación del sitio | El código comprueba `robots.txt` y el sitemap una vez por escaneo, y compara el sitemap con lo que declaran las páginas. Se muestra como un solo problema de todo el sitio y se puntúa una vez, no por página. | **Estructural** |

Cuando una página está en `noindex`, solo se informa el propio noindex, y las páginas que redirigen a otro sitio no se comprueban.

## Etiquetas meta [#category-meta]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Falta la etiqueta `<title>`](#missing-title) | Error | Aspectos básicos de la página | Comprobación de reglas |
| [El título es demasiado corto](#title-too-short) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [El título es demasiado largo](#title-too-long) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Falta la metadescripción](#missing-meta-description) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Título compartido con otras páginas](#duplicate-title) | Advertencia | Aspectos básicos de la página | Juicio de página |
| [Metadescripción compartida con otras páginas](#duplicate-meta-description) | Aviso | Aspectos básicos de la página | Juicio de página |
| [La metadescripción es demasiado corta](#meta-description-too-short) | Aviso | Aspectos básicos de la página | Comprobación de reglas |
| [La metadescripción es demasiado larga](#meta-description-too-long) | Aviso | Aspectos básicos de la página | Comprobación de reglas |
| [Falta el enlace canonical](#missing-canonical) | Aviso | Indexabilidad | Comprobación de reglas |
| [El canonical apunta a una URL distinta](#canonical-mismatch) | Advertencia | Indexabilidad | Comprobación de reglas |
| [Falta la meta viewport](#missing-viewport) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [La página de acceso o de la app se puede indexar](#indexable-app-page) | Advertencia | Indexabilidad | Comprobación de reglas |
| [La página está en noindex](#robots-noindex) | Error | Indexabilidad | Comprobación de reglas |
| [La página está en nofollow](#robots-nofollow) | Advertencia | Indexabilidad | Comprobación de reglas |
| [El título no coincide con la página](#title-content-mismatch) | Advertencia | Contenido y legibilidad para IA | Juicio de IA |
| [Faltan las etiquetas Open Graph](#missing-og-tags) | Aviso | Aspectos básicos de la página | Comprobación de reglas |
| [Falta la imagen Open Graph](#missing-og-image) | Aviso | Aspectos básicos de la página | Comprobación de reglas |

### Falta la etiqueta `<title>` [#missing-title]

**Gravedad:** Error · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-title` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** La página no tiene `<title>`, o el título está vacío. El título es el titular que los buscadores muestran en tu resultado y la señal en la página más fuerte sobre de qué trata.

**Cómo corregirlo:** Añade un `<title>` único y descriptivo en el `<head>` de la página: primero el tema de la página, al final tu marca, de 20 a 70 caracteres.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### El título es demasiado corto [#title-too-short]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `title-too-short` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** El título tiene menos de 20 caracteres, demasiado corto para decir a quien busca qué ofrece la página. Un carácter chino, japonés o coreano cuenta como dos, porque ocupa el doble de ancho.

**Cómo corregirlo:** Amplíalo con el tema o producto principal de la página y un detalle que lo distinga. Apunta a entre 20 y 70 caracteres.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### El título es demasiado largo [#title-too-long]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `title-too-long` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** El título tiene más de 70 caracteres, así que los resultados de búsqueda lo cortan. Un carácter chino, japonés o coreano cuenta como dos, porque ocupa el doble de ancho.

**Cómo corregirlo:** Pon primero las palabras más importantes y recorta el relleno o los nombres de marca repetidos hasta que quepa en 70 caracteres.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### Falta la metadescripción [#missing-meta-description]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-meta-description` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** La página no tiene metadescripción, o está vacía. Los buscadores escriben entonces su propio fragmento a partir del texto de la página, y pierdes el control de lo que lee quien busca antes de hacer clic.

**Cómo corregirlo:** Añade `<meta name="description" content="...">` con un resumen de 70 a 160 caracteres que diga qué obtiene el visitante y por qué hacer clic.

**Guía oficial:** [developers.google.com/search/docs/appearance/snippet](https://developers.google.com/search/docs/appearance/snippet)

### Título compartido con otras páginas [#duplicate-title]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `duplicate-title` · **Comprobado por:** Juicio de página · **Esfuerzo:** medio

**Qué significa:** Otras páginas del sitio usan exactamente el mismo `<title>`; el problema dice cuántas y nombra una. Los buscadores tienen que elegir una página para la consulta, y quien busca no puede distinguir los resultados.

**Cómo corregirlo:** Dale a cada página un título que diga de qué trata esa página: primero el producto, el tema del artículo o el nombre de la categoría, y la marca al final. Si las páginas son realmente la misma, quédate con una y apunta las demás hacia ella con un canonical o una redirección.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### Metadescripción compartida con otras páginas [#duplicate-meta-description]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `duplicate-meta-description` · **Comprobado por:** Juicio de página · **Esfuerzo:** medio

**Qué significa:** Otras páginas del sitio usan la misma metadescripción, así que sus fragmentos de búsqueda se leen igual.

**Cómo corregirlo:** Escribe una descripción para cada página a partir de su propio contenido, o déjala vacía en las páginas en las que no tengas nada concreto que decir: Google escribirá una a partir de la página.

**Guía oficial:** [developers.google.com/search/docs/appearance/snippet](https://developers.google.com/search/docs/appearance/snippet)

### La metadescripción es demasiado corta [#meta-description-too-short]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `meta-description-too-short` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La metadescripción tiene menos de 70 caracteres, así que queda sin usar la mayor parte del espacio del fragmento. Un carácter chino, japonés o coreano cuenta como dos, porque ocupa el doble de ancho.

**Cómo corregirlo:** Amplíala a entre 70 y 160 caracteres con un beneficio concreto, un detalle o una llamada a la acción.

**Guía oficial:** [developers.google.com/search/docs/appearance/snippet](https://developers.google.com/search/docs/appearance/snippet)

### La metadescripción es demasiado larga [#meta-description-too-long]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `meta-description-too-long` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La metadescripción tiene más de 160 caracteres, así que los resultados de búsqueda la cortan. Un carácter chino, japonés o coreano cuenta como dos, porque ocupa el doble de ancho.

**Cómo corregirlo:** Deja el mensaje clave en los primeros 160 caracteres y quita el resto.

**Guía oficial:** [developers.google.com/search/docs/appearance/snippet](https://developers.google.com/search/docs/appearance/snippet)

### Falta el enlace canonical [#missing-canonical]

**Gravedad:** Aviso · **Dimensión:** Indexabilidad · **ID de la regla:** `missing-canonical` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** La página no declara ningún `<link rel="canonical">`. Los buscadores deciden entonces por su cuenta qué variante de la URL (con parámetros, con o sin barra final) es la principal.

**Cómo corregirlo:** Añade un enlace canonical que apunte a la URL preferida de la propia página. La mayoría de los frameworks y plugins de SEO pueden generar un canonical que se autorreferencia en cada página.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### El canonical apunta a una URL distinta [#canonical-mismatch]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `canonical-mismatch` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** El enlace canonical apunta a una URL distinta de la de la propia página (comparadas tras las redirecciones; una barra final o un host en mayúsculas no cuenta como diferencia). Los buscadores pueden indexar esa otra URL en lugar de esta.

**Cómo corregirlo:** Si esta página debe posicionarse por sí sola, apunta el canonical a su propia URL. Si es un duplicado deliberado que debe ceder sus señales a otra página, déjalo e ignora el problema con un motivo.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Falta la meta viewport [#missing-viewport]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-viewport` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** La página no tiene `<meta name="viewport">`, así que los teléfonos la muestran como una página de escritorio alejada. Google indexa la versión móvil de tu sitio.

**Cómo corregirlo:** Añade `<meta name="viewport" content="width=device-width, initial-scale=1">` al `<head>`.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing](https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing)

### La página de acceso o de la app se puede indexar [#indexable-app-page]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `indexable-app-page` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** Esta dirección parece de acceso, cuenta o aplicación y responde 200 sin noindex. La búsqueda puede mostrar un muro de inicio de sesión.

**Cómo corregirlo:** Añade noindex en la meta robots o en la cabecera X-Robots-Tag. No escribas título ni descripción para estas páginas.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/robots-meta-tag](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

### La página está en noindex [#robots-noindex]

**Gravedad:** Error · **Dimensión:** Indexabilidad · **ID de la regla:** `robots-noindex` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** La página les dice a los buscadores que no la indexen, así que no aparecerá en los resultados de búsqueda. Loomaly no informa de esto en páginas que suelen quedar fuera de la búsqueda a propósito, como las de inicio de sesión, cuenta, carrito, pago y las páginas legales.

**Cómo corregirlo:** Si la página debe aparecer en la búsqueda, quita `noindex` de la metaetiqueta robots (y de cualquier cabecera `X-Robots-Tag`). Si es intencionado, ignora el problema con un motivo.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/block-indexing](https://developers.google.com/search/docs/crawling-indexing/block-indexing)

### La página está en nofollow [#robots-nofollow]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `robots-nofollow` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** El ajuste de robots a nivel de página dice `nofollow`, así que los buscadores no siguen ningún enlace de la página. Las páginas a las que enlaza no reciben descubrimiento ni crédito desde ella.

**Cómo corregirlo:** Quita `nofollow` de la metaetiqueta robots de la página. Para que enlaces concretos no transmitan crédito, pon `rel="nofollow"` en esos enlaces.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/robots-meta-tag](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

### El título no coincide con la página [#title-content-mismatch]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `title-content-mismatch` · **Comprobado por:** Juicio de IA · **Esfuerzo:** pequeño

**Qué significa:** El `<title>` promete algo que los encabezados y el texto de la página no cumplen. Quien busca y hace clic se va pronto, y Google puede reescribir el título en sus resultados.

**Cómo corregirlo:** Reescribe el título para describir lo que la página ofrece de verdad, con las palabras de su encabezado principal, o cambia la página para que cumpla lo que promete el título.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### Faltan las etiquetas Open Graph [#missing-og-tags]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-og-tags` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página no tiene `og:title`, `og:description` ni `og:image`. Las redes sociales, las aplicaciones de chat y los asistentes de IA usan estas etiquetas Open Graph para crear la vista previa cuando alguien comparte el enlace.

**Cómo corregirlo:** Añade al menos `og:title`, `og:description` y `og:image` (e idealmente `og:url`) al `<head>`. La mayoría de los plugins de SEO y frameworks pueden generarlos a partir del título y la descripción de la página.

**Guía oficial:** [ogp.me](https://ogp.me/)

### Falta la imagen Open Graph [#missing-og-image]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-og-image` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página tiene etiquetas Open Graph pero no `og:image`, así que los enlaces compartidos aparecen sin imagen de vista previa o con una al azar.

**Cómo corregirlo:** Añade `og:image` con una URL absoluta a una imagen representativa. 1200 x 630 píxeles es el tamaño habitual.

**Guía oficial:** [ogp.me](https://ogp.me/)

## Encabezados [#category-headings]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Falta el H1](#missing-h1) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Varias etiquetas H1](#multiple-h1) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Niveles de encabezado saltados](#heading-skip-level) | Aviso | Aspectos básicos de la página | Comprobación de reglas |

### Falta el H1 [#missing-h1]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-h1` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página no tiene `<h1>`. El H1 es el encabezado visible principal de la página y una señal fuerte de su tema.

**Cómo corregirlo:** Añade exactamente un H1 que indique el tema principal de la página. Puede coincidir con el título o repetirlo de cerca.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/seo-starter-guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)

### Varias etiquetas H1 [#multiple-h1]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `multiple-h1` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página tiene más de un `<h1>`, lo que difumina cuál es el tema principal. Una causa habitual es un tema que marca el logotipo o los títulos de sección como H1.

**Cómo corregirlo:** Conserva un H1 para el tema principal de la página y cambia los demás a H2 o H3.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/seo-starter-guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)

### Niveles de encabezado saltados [#heading-skip-level]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `heading-skip-level` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Los niveles de encabezado saltan, por ejemplo de H1 directamente a H3. Los lectores de pantalla y los rastreadores usan los encabezados como el esquema de la página, y los huecos lo hacen más difícil de seguir.

**Cómo corregirlo:** Usa los niveles de encabezado en orden (H1, luego H2, luego H3) según la estructura, y define su tamaño con CSS en lugar de elegir otro nivel.

**Guía oficial:** [developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements)

## Contenido [#category-content]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Compite con otra página por la misma búsqueda](#duplicate-intent) | Advertencia | Contenido y legibilidad para IA | Juicio de página |
| [Elemento no disponible que aún se puede indexar](#unavailable-item) | Advertencia | Contenido y legibilidad para IA | Juicio de página |
| [Página de relleno sin contenido real](#placeholder-page) | Advertencia | Contenido y legibilidad para IA | Juicio de página |
| [Sin un siguiente paso claro para el visitante](#missing-next-step) | Advertencia | Contenido y legibilidad para IA | Juicio de IA |
| [Contenido escaso](#thin-content) | Advertencia | Contenido y legibilidad para IA | Juicio de IA |
| [Pocas palabras](#low-word-count) | Aviso | Contenido y legibilidad para IA | Comprobación de reglas |
| [Posible saturación de palabras clave](#keyword-stuffing) | Advertencia | Contenido y legibilidad para IA | Juicio de IA |
| [La frase objetivo no está en el título](#keyword-missing-title) | Advertencia | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [La frase objetivo no está en el H1](#keyword-missing-h1) | Aviso | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [La frase objetivo no está en la metadescripción](#keyword-missing-description) | Aviso | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [La frase objetivo no está en la apertura](#keyword-missing-intro) | Aviso | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [Una frase buscada no está en el título](#gsc-query-title-gap) | Advertencia | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [La frase objetivo no está al inicio del título](#keyword-not-title-start) | Aviso | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [El sitio no tiene llms.txt](#llms-txt-missing) | Aviso | Contenido y legibilidad para IA | Comprobación del sitio |
| [llms.txt no es un mapa de páginas utilizable](#llms-txt-invalid) | Aviso | Contenido y legibilidad para IA | Comprobación del sitio |
| [llms.txt enlaza a páginas que fallan](#llms-txt-broken-links) | Advertencia | Contenido y legibilidad para IA | Comprobación del sitio |
| [Página no optimizada para citas de IA](#page-not-citable-by-llm) | Aviso | Contenido y legibilidad para IA | Juicio de IA |
| [Falta la firma del autor](#missing-author-byline) | Aviso | Contenido y legibilidad para IA | Juicio de IA |
| [Falta la fecha de publicación](#missing-publish-date) | Aviso | Contenido y legibilidad para IA | Juicio de IA |

### Compite con otra página por la misma búsqueda [#duplicate-intent]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `duplicate-intent` · **Comprobado por:** Juicio de página · **Esfuerzo:** grande

**Qué significa:** Otra página de tu sitio responde a la misma búsqueda, y el problema la nombra. Los buscadores suelen elegir una de las dos y la otra pierde. No se señalan las páginas que ya se declaran entre sí como canonical o como versiones de idioma.

**Cómo corregirlo:** Fusiona las dos en una página y redirige la URL más débil, apunta una a la otra con un canonical, o hazlas claramente distintas (público, producto o pregunta diferentes).

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Elemento no disponible que aún se puede indexar [#unavailable-item]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `unavailable-item` · **Comprobado por:** Juicio de página · **Esfuerzo:** medio

**Qué significa:** La página es de algo que ya no está disponible (agotado, descatalogado, un evento que ya terminó) pero aún se puede encontrar en la búsqueda.

**Cómo corregirlo:** Consérvala solo si ayuda a los visitantes a seguir, por ejemplo con alternativas o una fecha de reposición. Si no, redirígela a la alternativa más cercana o márcala como `noindex`.

**Guía oficial:** [developers.google.com/crawling/docs/troubleshooting/http-status-codes](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes)

### Página de relleno sin contenido real [#placeholder-page]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `placeholder-page` · **Comprobado por:** Juicio de página · **Esfuerzo:** grande

**Qué significa:** La página es un cascarón de plantilla o un borrador sin nada para el visitante, como texto de relleno, una categoría vacía o una página de próximamente.

**Cómo corregirlo:** Rellénala con contenido real, o mantenla fuera de la búsqueda (`noindex`, o retírala de la publicación) hasta que lo tenga.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/creating-helpful-content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

### Sin un siguiente paso claro para el visitante [#missing-next-step]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `missing-next-step` · **Comprobado por:** Juicio de IA · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Una página de inicio, de destino o de producto no le da al visitante un siguiente paso claro: registrarse, comprar, reservar, contactarte o seguir leyendo. La página puede posicionarse y aun así perder a los visitantes que consigue. El juicio de IA ve los botones y los enlaces de llamada a la acción de la página, y esto solo se comprueba en las páginas en las que Loomaly los registró.

**Cómo corregirlo:** Añade una llamada a la acción principal cerca del inicio y otra vez después del contenido principal, con un verbo que diga qué ocurre ("Empieza la prueba gratis", "Reserva una llamada"). Deja los enlaces secundarios visualmente más discretos.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/creating-helpful-content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

### Contenido escaso [#thin-content]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `thin-content` · **Comprobado por:** Juicio de IA · **Esfuerzo:** grande

**Qué significa:** Para lo que es la página (un producto, un artículo, una página de destino), no le da al visitante suficiente sustancia: poco más que un encabezado y unas líneas. Los buscadores tratan estas páginas como de poco valor.

**Cómo corregirlo:** Añade contenido que responda a lo que un visitante de esta página necesita de verdad. Si la página no tiene un propósito propio, fusiónala con una página relacionada o mantenla fuera de la búsqueda.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/creating-helpful-content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

### Pocas palabras [#low-word-count]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `low-word-count` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** grande

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página tiene menos texto del que el tema suele necesitar para posicionarse.

**Cómo corregirlo:** Amplíala con detalle útil, como especificaciones, respuestas a preguntas frecuentes o ejemplos, no con relleno.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/creating-helpful-content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

### Posible saturación de palabras clave [#keyword-stuffing]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-stuffing` · **Comprobado por:** Juicio de IA · **Esfuerzo:** medio

**Qué significa:** El texto no se lee como el de una persona que escribe para otras personas: los términos de búsqueda se repiten mucho más de lo que haría una redacción natural. Se lee mal y arriesga una penalización de búsqueda.

**Cómo corregirlo:** Reescribe los pasajes afectados con naturalidad, usa sinónimos y recorta la repetición en encabezados, texto alt y pies de página.

**Guía oficial:** [developers.google.com/search/docs/essentials/spam-policies#keyword-stuffing](https://developers.google.com/search/docs/essentials/spam-policies#keyword-stuffing)

### La frase objetivo no está en el título [#keyword-missing-title]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-missing-title` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

**Qué significa:** La frase por la que esta página debería posicionarse no está en la parte del `<title>` que Google muestra. Una coincidencia solo en la segunda mitad del título se corta en los resultados de búsqueda.

**Cómo corregirlo:** Pon esa frase en la primera mitad del `<title>`, antes del nombre de la marca.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### La frase objetivo no está en el H1 [#keyword-missing-h1]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-missing-h1` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La frase por la que esta página debería posicionarse no está en ningún H1, así que el encabezado que el visitante ve primero no dice para qué es la página.

**Cómo corregirlo:** Usa la frase en el H1 de la página, con las palabras que usaría quien busca.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/seo-starter-guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)

### La frase objetivo no está en la metadescripción [#keyword-missing-description]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-missing-description` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La frase por la que esta página debería posicionarse no está en la metadescripción, así que el fragmento bajo el resultado no la menciona.

**Cómo corregirlo:** Integra la frase una vez en la metadescripción, en una frase sobre lo que obtiene el visitante.

**Guía oficial:** [developers.google.com/search/docs/appearance/snippet](https://developers.google.com/search/docs/appearance/snippet)

### La frase objetivo no está en la apertura [#keyword-missing-intro]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-missing-intro` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La frase por la que esta página debería posicionarse no aparece en la apertura de la página, así que la primera pantalla no confirma que el visitante está en el lugar correcto.

**Cómo corregirlo:** Usa la frase en el primer párrafo, o en la primera línea de una página escrita en chino, japonés, coreano o tailandés.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/creating-helpful-content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

### Una frase buscada no está en el título [#gsc-query-title-gap]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `gsc-query-title-gap` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

**Qué significa:** Google ya muestra esta página para una consulta con demanda real, y esa consulta no está ni en el título ni en el H1. El título ignora una búsqueda que la página ya consigue.

**Cómo corregirlo:** Integra la consulta en el título o en el H1, si la página de verdad la responde. Déjala fuera cuando la página trate de otra cosa.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### La frase objetivo no está al inicio del título [#keyword-not-title-start]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-not-title-start` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

**Qué significa:** La frase por la que debería posicionarse esta página está en el título, pero no al inicio (el primer tercio del ancho, o las primeras palabras). Quien busca ve primero el comienzo del título.

**Cómo corregirlo:** Mueve esa frase al inicio del título, antes del nombre de la marca.

**Guía oficial:** [developers.google.com/search/docs/appearance/title-link](https://developers.google.com/search/docs/appearance/title-link)

### El sitio no tiene llms.txt [#llms-txt-missing]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `llms-txt-missing` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Falta `/llms.txt`, o esa dirección responde con una página web. Una página HTML comodín cuenta como que falta. Algunos productos leen este archivo para encontrar páginas, y tiene que ser texto plano.

**Cómo corregirlo:** Publica `/llms.txt` en la raíz del dominio como `text/plain`: un título `#`, un resumen opcional de una línea y enlaces Markdown a páginas reales. Next.js: `public/llms.txt` o `app/llms.txt/route.ts`. Astro y TanStack Start: `public/llms.txt`. Fumadocs: genéralo desde la fuente de la documentación. Docusaurus y otros sitios estáticos: `static/llms.txt` o la carpeta pública del host.

**Guía oficial:** [llmstxt.org](https://llmstxt.org/)

### llms.txt no es un mapa de páginas utilizable [#llms-txt-invalid]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `llms-txt-invalid` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** `/llms.txt` se publica como texto plano, pero no es un mapa utilizable: necesita un título (`# …`) y al menos un enlace Markdown a una página. Algunos productos leen este archivo para encontrar páginas. Si falta el archivo, o esa dirección devuelve HTML, es otra comprobación.

**Cómo corregirlo:** Dale a `/llms.txt` un título `#`, un resumen opcional y una lista de enlaces Markdown a las páginas que quieres que se lean, por ejemplo `- [Precios](https://example.com/pricing): planes y precios`. Sírvelo como `text/plain`. Next.js puede usar `public/llms.txt` o `app/llms.txt/route.ts`; Astro y TanStack Start usan `public/llms.txt`; Fumadocs puede generarlo desde la documentación; Docusaurus y otros sitios estáticos usan `static/llms.txt`.

**Guía oficial:** [llmstxt.org](https://llmstxt.org/)

### llms.txt enlaza a páginas que fallan [#llms-txt-broken-links]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `llms-txt-broken-links` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** `/llms.txt` enlaza a páginas de este sitio que responden con un error. El problema lista las que se comprobaron. Quien siga el archivo llega a una página que no carga.

**Cómo corregirlo:** Apunta cada enlace a una página que responda 200, o quita la línea. El aviso lista las primeras que fallan. El archivo suele ser `public/llms.txt` o la ruta que lo sirve.

**Guía oficial:** [llmstxt.org](https://llmstxt.org/)

### Página no optimizada para citas de IA [#page-not-citable-by-llm]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `page-not-citable-by-llm` · **Comprobado por:** Juicio de IA · **Esfuerzo:** grande

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Las secciones de la página no empiezan con una respuesta clara, o no se entienden por sí solas. Las respuestas de IA y los fragmentos destacados citan pasajes que dicen lo importante al principio; no hay un atajo de marcado para esto.

**Cómo corregirlo:** Empieza cada sección con una frase que responda directamente a su encabezado y luego añade el detalle. Usa encabezados que coincidan con cómo pregunta la gente, y enuncia hechos y números concretos.

**Guía oficial:** [developers.google.com/search/docs/appearance/ai-features](https://developers.google.com/search/docs/appearance/ai-features)

### Falta la firma del autor [#missing-author-byline]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `missing-author-byline` · **Comprobado por:** Juicio de IA · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** El artículo no dice quién lo escribió, ni en la página ni en sus datos estructurados. Un autor con nombre ayuda a los lectores a valorar el contenido y forma parte de lo que buscan las directrices de calidad de Google.

**Cómo corregirlo:** Muestra el nombre del autor con un enlace a una biografía breve o a una página de autor, y añade el autor al JSON-LD Article de la página.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/creating-helpful-content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

### Falta la fecha de publicación [#missing-publish-date]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `missing-publish-date` · **Comprobado por:** Juicio de IA · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** El artículo no muestra cuándo se publicó o se actualizó, ni en la página ni en sus datos estructurados, así que los lectores no pueden saber si está al día.

**Cómo corregirlo:** Muestra la fecha de publicación (y de actualización) en la página y añade `datePublished` y `dateModified` al JSON-LD de la página.

**Guía oficial:** [developers.google.com/search/docs/appearance/publication-dates](https://developers.google.com/search/docs/appearance/publication-dates)

## Imágenes [#category-images]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Imágenes sin texto alt](#image-missing-alt) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Imágenes sin carga diferida](#image-no-lazy-loading) | Aviso | Rendimiento | Comprobación de reglas |

### Imágenes sin texto alt [#image-missing-alt]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `image-missing-alt` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** Uno o más elementos `<img>` no tienen atributo `alt`, y el problema dice cuántas imágenes de la página están afectadas. Los lectores de pantalla no pueden describirlas y Google Images tiene menos en qué basarse.

**Cómo corregirlo:** Dale a cada imagen con significado un `alt` breve que la describa. Las imágenes puramente decorativas deben llevar un `alt=""` vacío.

**Guía oficial:** [developers.google.com/search/docs/appearance/google-images](https://developers.google.com/search/docs/appearance/google-images)

### Imágenes sin carga diferida [#image-no-lazy-loading]

**Gravedad:** Aviso · **Dimensión:** Rendimiento · **ID de la regla:** `image-no-lazy-loading` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Las imágenes más abajo en la página se cargan de inmediato con ella y compiten por el ancho de banda con lo que el visitante ve primero.

**Cómo corregirlo:** Añade `loading="lazy"` a las imágenes por debajo del pliegue. No apliques carga diferida a la imagen principal de la parte superior de la página, porque eso ralentiza el Largest Contentful Paint.

**Guía oficial:** [web.dev/articles/browser-level-image-lazy-loading](https://web.dev/articles/browser-level-image-lazy-loading)

## Enlaces [#category-links]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Sin enlaces internos](#no-internal-links) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Pocos enlaces internos](#too-few-internal-links) | Aviso | Aspectos básicos de la página | Comprobación de reglas |
| [Demasiados enlaces externos](#excessive-external-links) | Aviso | Aspectos básicos de la página | Comprobación de reglas |
| [Ningún enlace interno usa la frase objetivo](#keyword-anchor-missing) | Aviso | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [La página de enfoque tiene pocos enlaces internos](#focus-page-few-inlinks) | Advertencia | Contenido y legibilidad para IA | Comprobación de palabras clave |
| [Enlaces internos a páginas que responden con un error](#internal-links-to-errors) | Advertencia | Aspectos básicos de la página | Comprobación del sitio |
| [Páginas del sitemap a las que ninguna otra página enlaza](#orphan-pages) | Advertencia | Aspectos básicos de la página | Comprobación del sitio |

### Sin enlaces internos [#no-internal-links]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `no-internal-links` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** La página no enlaza a ninguna otra página de tu sitio. No transmite valor al resto del sitio, y los rastreadores descubren menos desde ella.

**Cómo corregirlo:** Añade enlaces a páginas relacionadas en el contenido, más navegación o migas de pan. Asegúrate de que los enlaces sean elementos `<a href>` reales, no controladores de clic.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/links-crawlable](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### Pocos enlaces internos [#too-few-internal-links]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `too-few-internal-links` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página tiene muy pocos enlaces a otras páginas de tu sitio, así que puede estar infravalorada y ayuda poco a que los visitantes sigan.

**Cómo corregirlo:** Enlaza a productos, artículos o categorías relacionados siempre que ayude al lector.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/links-crawlable](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### Demasiados enlaces externos [#excessive-external-links]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `excessive-external-links` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página enlaza a muchos dominios externos. Cada enlace saliente debería estar ahí para el lector.

**Cómo corregirlo:** Quita los enlaces que no tengan justificación editorial. Marca los enlaces de pago o de afiliación con `rel="sponsored"` y los enlaces enviados por usuarios con `rel="ugc"`.

**Guía oficial:** [developers.google.com/search/docs/fundamentals/seo-starter-guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)

### Ningún enlace interno usa la frase objetivo [#keyword-anchor-missing]

**Gravedad:** Aviso · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `keyword-anchor-missing` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Otras páginas del sitio enlazan aquí, y ninguno de esos enlaces usa la frase por la que esta página debería posicionarse. El texto de anclaje es la pista que esos enlaces transmiten.

**Cómo corregirlo:** En al menos un enlace interno a esta página, usa la frase como texto visible del enlace.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/links-crawlable](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### La página de enfoque tiene pocos enlaces internos [#focus-page-few-inlinks]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `focus-page-few-inlinks` · **Comprobado por:** Comprobación de palabras clave · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** Menos de cinco páginas enlazan a la página de enfoque, o esos enlaces usan menos de cinco textos de anclaje distintos. La página recibe poca atención interna del sitio.

**Cómo corregirlo:** Añade enlaces internos desde páginas relacionadas. En un asistente, llama a link_suggestions y aprueba los que encajen.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/links-crawlable](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### Enlaces internos a páginas que responden con un error [#internal-links-to-errors]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `internal-links-to-errors` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** Páginas de tu sitio enlazan a otras páginas de tu sitio que responden con un error (4xx o 5xx). El problema dice cuántas páginas enlazan a cuántas muertas, con ejemplos. Los visitantes que siguen estos enlaces llegan a un callejón sin salida, y los rastreadores gastan su visita en ellas.

**Cómo corregirlo:** Apunta cada enlace a la dirección actual de la página, o quítalo. Si la página se movió, redirige la dirección antigua a la nueva para que los enlaces externos también sigan funcionando.

**Guía oficial:** [developers.google.com/crawling/docs/troubleshooting/http-status-codes](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes)

### Páginas del sitemap a las que ninguna otra página enlaza [#orphan-pages]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `orphan-pages` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** Tu sitemap incluye páginas a las que ninguna página de tu sitio enlaza. El problema dice cuántas y da ejemplos; cada una se comprobó y carga. Los visitantes solo pueden llegar desde fuera, y los buscadores dan poco peso a las páginas a las que nadie enlaza. A veces son páginas que no deberían estar en el sitemap (una plantilla, un archivo de verificación, una campaña antigua).

**Cómo corregirlo:** Enlaza cada página que importe desde una página relacionada, una página central o la navegación. Quita del sitemap las que no deberían ser públicas.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/links-crawlable](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

## Datos estructurados [#category-structured-data]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Sin datos estructurados JSON-LD](#missing-structured-data) | Aviso | Datos estructurados | Comprobación de reglas |
| [Página de producto sin datos estructurados Product](#missing-product-schema) | Advertencia | Datos estructurados | Comprobación de reglas |
| [Datos estructurados no válidos](#invalid-structured-data) | Advertencia | Datos estructurados | Comprobación de reglas |
| [Falta el schema Organization](#missing-organization-schema) | Aviso | Datos estructurados | Comprobación de reglas |
| [Falta el schema de migas de pan](#missing-breadcrumb-schema) | Aviso | Datos estructurados | Comprobación de reglas |

### Sin datos estructurados JSON-LD [#missing-structured-data]

**Gravedad:** Aviso · **Dimensión:** Datos estructurados · **ID de la regla:** `missing-structured-data` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página no tiene un bloque JSON-LD. Los datos estructurados describen la página (un producto, un artículo, tu negocio) de una forma que los buscadores leen directamente, y muchos resultados enriquecidos los exigen.

**Cómo corregirlo:** Añade un bloque `<script type="application/ld+json">` del tipo de Schema.org que corresponda. Pide a tu asistente (`problem`) un bloque listo para pegar, elegido para tu tipo de sitio; sustituye los valores de marcador antes de publicar.

**Guía oficial:** [developers.google.com/search/docs/appearance/structured-data/intro-structured-data](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### Página de producto sin datos estructurados Product [#missing-product-schema]

**Gravedad:** Advertencia · **Dimensión:** Datos estructurados · **ID de la regla:** `missing-product-schema` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** Esta es una página de producto, pero no tiene datos estructurados `Product`. Google Shopping, los resultados enriquecidos y los asistentes de IA leen el nombre, el precio, la moneda y la disponibilidad de un producto en ese marcado; sin él tienen que adivinarlo a partir de la página, si es que pueden verla.

**Cómo corregirlo:** Añade un bloque JSON-LD `Product` con `name`, `image`, `description` y un objeto `offers` (`price`, `priceCurrency`, `availability`, `url`), generado a partir de los mismos datos que muestra la página. En un sitio que se renderiza en el navegador, tiene que estar en el HTML que envía el servidor.

**Guía oficial:** [developers.google.com/search/docs/appearance/structured-data/product-snippet](https://developers.google.com/search/docs/appearance/structured-data/product-snippet)

### Datos estructurados no válidos [#invalid-structured-data]

**Gravedad:** Advertencia · **Dimensión:** Datos estructurados · **ID de la regla:** `invalid-structured-data` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** El JSON-LD de la página tiene errores respecto a las reglas de Schema.org. Loomaly lo comprueba con su propio validador, no con IA, y el problema muestra la ruta del primer error y cuántos más hay. Solo se informan errores, no avisos.

**Cómo corregirlo:** Corrige la propiedad en la ruta indicada. Pide a tu asistente (`problem`) una copia reparada de tu propio marcado, qué cambió y qué sigue necesitando un dato que solo tú tienes. Luego prueba la página en la Prueba de resultados enriquecidos de Google.

**Guía oficial:** [developers.google.com/search/docs/appearance/structured-data/sd-policies](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)

### Falta el schema Organization [#missing-organization-schema]

**Gravedad:** Aviso · **Dimensión:** Datos estructurados · **ID de la regla:** `missing-organization-schema` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página de inicio no tiene JSON-LD Organization (o LocalBusiness), que les dice a los buscadores tu nombre, logotipo y perfiles y te permite optar a un panel de conocimiento.

**Cómo corregirlo:** Añade JSON-LD Organization a la página de inicio con `name`, `url`, `logo` y enlaces `sameAs` a tus perfiles. Los negocios locales deben usar LocalBusiness con la dirección y el horario. Pide a tu asistente (`problem`) una plantilla para rellenar.

**Guía oficial:** [developers.google.com/search/docs/appearance/structured-data/organization](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Falta el schema de migas de pan [#missing-breadcrumb-schema]

**Gravedad:** Aviso · **Dimensión:** Datos estructurados · **ID de la regla:** `missing-breadcrumb-schema` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La página no tiene JSON-LD BreadcrumbList, que permite a Google mostrar el lugar de la página en tu sitio en lugar de una URL desnuda.

**Cómo corregirlo:** Añade JSON-LD BreadcrumbList que coincida con la posición de la página en tu navegación. La mayoría de las plataformas y plugins de SEO pueden generarlo a partir de tus migas de pan. Pide a tu asistente (`problem`) una plantilla.

**Guía oficial:** [developers.google.com/search/docs/appearance/structured-data/breadcrumb](https://developers.google.com/search/docs/appearance/structured-data/breadcrumb)

## Técnico [#category-technical]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Página de error servida como página normal](#soft-404) | Error | Indexabilidad | Juicio de página |
| [Los rastreadores que no ejecutan JavaScript ven una página vacía](#client-rendered-without-ssr) | Error | Indexabilidad | Comprobación de reglas |
| [Solo los buscadores reciben la página renderizada; los rastreadores de IA la ven vacía](#prerendered-for-search-engines-only) | Advertencia | Contenido y legibilidad para IA | Comprobación de reglas |
| [Página servida por HTTP](#non-https) | Error | Indexabilidad | Comprobación de reglas |
| [robots.txt no es un archivo robots válido](#robots-txt-invalid) | Advertencia | Indexabilidad | Comprobación del sitio |
| [robots.txt no apunta a un sitemap](#robots-txt-no-sitemap) | Aviso | Indexabilidad | Comprobación del sitio |
| [robots.txt solo tiene comentarios](#robots-only-comments) | Aviso | Indexabilidad | Comprobación del sitio |
| [robots.txt bloquea los rastreadores de las respuestas de búsqueda con IA](#ai-search-crawlers-blocked) | Advertencia | Contenido y legibilidad para IA | Comprobación del sitio |
| [robots.txt bloquea rastreadores de IA](#ai-crawler-blocked) | Advertencia | Contenido y legibilidad para IA | Comprobación del sitio |
| [El sitio pide a los motores de respuesta de IA que no usen sus páginas](#content-signal-blocks-ai-answers) | Advertencia | Contenido y legibilidad para IA | Comprobación del sitio |
| [No hay sitemap](#sitemap-missing) | Advertencia | Indexabilidad | Comprobación del sitio |
| [El sitemap omite páginas indexables](#sitemap-stale) | Advertencia | Indexabilidad | Comprobación del sitio |
| [El sitemap no es XML válido](#sitemap-invalid) | Advertencia | Indexabilidad | Comprobación del sitio |
| [El sitemap incluye páginas que no son la versión a indexar](#sitemap-lists-non-canonical) | Advertencia | Indexabilidad | Comprobación del sitio |
| [Los canonical apuntan a direcciones que redirigen o fallan](#canonical-target-broken) | Advertencia | Indexabilidad | Comprobación del sitio |
| [Sitio móvil aparte sin rel="alternate"](#mobile-site-not-annotated) | Advertencia | Indexabilidad | Comprobación del sitio |
| [Otras versiones de la dirección no redirigen de forma permanente](#host-variants-not-redirected) | Advertencia | Indexabilidad | Comprobación del sitio |
| [Falta el favicon](#missing-favicon) | Aviso | Aspectos básicos de la página | Comprobación de reglas |
| [La página devolvió un estado distinto de 200](#non-200-status) | Error | Indexabilidad | Comprobación de reglas |

### Página de error servida como página normal [#soft-404]

**Gravedad:** Error · **Dimensión:** Indexabilidad · **ID de la regla:** `soft-404` · **Comprobado por:** Juicio de página · **Esfuerzo:** medio

**Qué significa:** La página dice que no se encuentra o que está rota, pero responde con HTTP 200, así que los buscadores la mantienen indexada como una página real.

**Cómo corregirlo:** Devuelve un estado 404 o 410 real para las páginas que ya no existen, o redirige (301) a la página correcta.

**Guía oficial:** [developers.google.com/crawling/docs/troubleshooting/http-status-codes](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes)

### Los rastreadores que no ejecutan JavaScript ven una página vacía [#client-rendered-without-ssr]

**Gravedad:** Error · **Dimensión:** Indexabilidad · **ID de la regla:** `client-rendered-without-ssr` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** grande

**Qué significa:** Obtenida sin ejecutar JavaScript, la página es un documento considerable (20 KB de HTML o más) con menos de 150 caracteres de texto: el contenido solo aparece después de que se ejecuta JavaScript. Eso es lo que ven los rastreadores que no ejecutan JavaScript, incluidos la mayoría de los rastreadores de IA (ChatGPT, Perplexity, Claude) y las vistas previas de enlaces. Algunos sitios envían una página renderizada solo a Googlebot; Google ve entonces el contenido y los rastreadores de IA siguen sin verlo. Páginas así están demasiado vacías para juzgarlas, así que reciben este problema en lugar del juicio de IA.

**Cómo corregirlo:** Renderiza la página en el servidor o prerrenderízala en el momento de la compilación, para que el HTML ya contenga el contenido. La mayoría de los frameworks ofrecen renderizado en el servidor o generación estática.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

### Solo los buscadores reciben la página renderizada; los rastreadores de IA la ven vacía [#prerendered-for-search-engines-only]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `prerendered-for-search-engines-only` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** grande

**Qué significa:** Obtenida como un visitante normal, la página es un cascarón vacío que JavaScript rellena después; obtenida como Googlebot, llega completamente renderizada. El sitio prerrenderiza las páginas solo para los buscadores. Google y Bing ven por tanto el contenido y pueden posicionarlo, pero los rastreadores de IA (ChatGPT, Perplexity, Claude y otros) no ejecutan JavaScript y no están en la lista de prerrenderizado, así que ven la página vacía y no pueden citar precios, existencias o detalles en sus respuestas.

**Cómo corregirlo:** Añade los principales rastreadores de IA (GPTBot, OAI-SearchBot, PerplexityBot, ClaudeBot y similares) a la lista de prerrenderizado, que suele ser un cambio de una línea en el servicio de prerrenderizado o en la regla de la CDN. A más largo plazo, renderiza el contenido en el servidor para todo el mundo.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering](https://developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering)

### Página servida por HTTP [#non-https]

**Gravedad:** Error · **Dimensión:** Indexabilidad · **ID de la regla:** `non-https` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** La página se sirve por HTTP sin cifrar. HTTPS es un factor de posicionamiento confirmado de Google, y los navegadores marcan las páginas HTTP como no seguras.

**Cómo corregirlo:** Instala un certificado TLS, redirige cada URL HTTP a su versión HTTPS con un 301, y actualiza los enlaces internos y los canonical a HTTPS.

**Guía oficial:** [developers.google.com/search/docs/appearance/page-experience](https://developers.google.com/search/docs/appearance/page-experience)

### robots.txt no es un archivo robots válido [#robots-txt-invalid]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `robots-txt-invalid` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

**Qué significa:** `/robots.txt` en la raíz de tu dominio responde con una página web o un error del servidor en lugar de reglas en texto plano. Los rastreadores no encuentran reglas ni un sitemap en él, y un error del servidor ahí hace que Google pause el rastreo del sitio.

**Cómo corregirlo:** Sirve `/robots.txt` como `text/plain` desde la raíz del dominio, con tus reglas `User-agent` y una línea `Sitemap:`. Asegúrate de que la ruta comodín de la aplicación o una redirección a la página de inicio no responda por él.

**Guía oficial:** [developers.google.com/crawling/docs/robots-txt/create-robots-txt](https://developers.google.com/crawling/docs/robots-txt/create-robots-txt)

### robots.txt no apunta a un sitemap [#robots-txt-no-sitemap]

**Gravedad:** Aviso · **Dimensión:** Indexabilidad · **ID de la regla:** `robots-txt-no-sitemap` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** `robots.txt` no tiene una línea `Sitemap:`, o el sitio no tiene robots.txt. Los buscadores a los que enviaste el sitemap siguen teniéndolo; Bing, los rastreadores de IA y otros tienen que encontrarlo por su cuenta.

**Cómo corregirlo:** Añade `Sitemap: https://your-domain/sitemap.xml` (la URL completa de cada sitemap) a `/robots.txt`. Si el sitio no tiene robots.txt (la evidencia dice `no robots.txt`), crea uno: esa línea sola es un archivo válido y no bloquea nada.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap#addsitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap#addsitemap)

### robots.txt solo tiene comentarios [#robots-only-comments]

**Gravedad:** Aviso · **Dimensión:** Indexabilidad · **ID de la regla:** `robots-only-comments` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** robots.txt no tiene reglas ni una línea Sitemap, solo comentarios. Un alojamiento como Cloudflare publica un archivo así y lo gestiona, de modo que la copia del proyecto puede no ser la que leen los rastreadores.

**Cómo corregirlo:** Añade una línea Sitemap en los ajustes de robots.txt del alojamiento. Si controlas el archivo, sustituye los comentarios por reglas reales y una línea Sitemap.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap#addsitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap#addsitemap)

### robots.txt bloquea los rastreadores de las respuestas de búsqueda con IA [#ai-search-crawlers-blocked]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `ai-search-crawlers-blocked` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

**Qué significa:** `robots.txt` bloquea uno o más de los rastreadores que obtienen páginas para respuestas de IA con búsqueda: OAI-SearchBot (búsqueda de ChatGPT), Claude-SearchBot (Claude) y PerplexityBot (Perplexity). El problema dice cuáles. Esos productos no pueden leer el sitio, así que no pueden citarlo ni enlazarlo. Esto es distinto de los rastreadores de entrenamiento (GPTBot, ClaudeBot, Google-Extended): bloquearlos solo deja tus páginas fuera del entrenamiento futuro de modelos, y muchos sitios bloquean ambos grupos a la vez sin querer. Los bloqueos configurados en la CDN, como un interruptor de bloqueo de bots, no están en robots.txt y no se comprueban aquí.

**Cómo corregirlo:** Si quieres aparecer en las respuestas de IA, quita las líneas `Disallow` de los rastreadores nombrados, o dale a cada uno su propio grupo con `Allow: /`, por ejemplo `User-agent: OAI-SearchBot` seguido de `Allow: /`. Puedes seguir bloqueando GPTBot, ClaudeBot y Google-Extended si no quieres que tu contenido se use para el entrenamiento. Si el bloqueo es a propósito, ignora este problema.

**Guía oficial:** [developers.openai.com/api/docs/bots](https://developers.openai.com/api/docs/bots)

### robots.txt bloquea rastreadores de IA [#ai-crawler-blocked]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `ai-crawler-blocked` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

**Qué significa:** `robots.txt` impide que uno o más rastreadores de IA lean la página de inicio. Los de búsqueda y respuesta (OAI-SearchBot, Claude-SearchBot, PerplexityBot) son una advertencia: esos productos no pueden leer el sitio. Los de entrenamiento (GPTBot, ClaudeBot, Google-Extended y similares como Applebot-Extended y CCBot) son solo un aviso: bloquearlos deja las páginas fuera del entrenamiento futuro y no saca al sitio de las respuestas de IA por sí solo. El aviso dice cuáles. Un rechazo por Content-Signal es otra comprobación. Los bloqueos del CDN no están en robots.txt y no se comprueban aquí.

**Cómo corregirlo:** Si quieres el sitio en las respuestas de IA, quita el `Disallow` de los rastreadores de búsqueda que nombra el aviso, o dale a cada uno su grupo con `Allow: /`. Puedes seguir bloqueando los de entrenamiento; eso queda como aviso. Si el bloqueo es a propósito, ignora este aviso.

**Guía oficial:** [developers.openai.com/api/docs/bots](https://developers.openai.com/api/docs/bots)

### El sitio pide a los motores de respuesta de IA que no usen sus páginas [#content-signal-blocks-ai-answers]

**Gravedad:** Advertencia · **Dimensión:** Contenido y legibilidad para IA · **ID de la regla:** `content-signal-blocks-ai-answers` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** `robots.txt` define `Content-Signal` de modo que el uso para búsqueda o como entrada de IA está apagado (`search=no` o `ai-input=no`) para los rastreadores que obtienen páginas para respuestas de IA: OAI-SearchBot, Claude-SearchBot y PerplexityBot. Se les pide que no usen las páginas en sus respuestas. Bloquear solo el entrenamiento (`ai-train=no`) no genera este problema.

**Cómo corregirlo:** En la línea `Content-Signal` que aplica a `*` o a esos rastreadores, pon `ai-input=yes` y `search=yes` si quieres permitir que usen las páginas. Puedes dejar `ai-train=no`. Si el rechazo es a propósito, ignora este problema.

**Guía oficial:** [contentsignals.org](https://contentsignals.org/)

### No hay sitemap [#sitemap-missing]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `sitemap-missing` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

**Qué significa:** sitemap.xml no responde y robots.txt no indica uno. Con tantas páginas, los rastreadores tienen que descubrir cada URL por los enlaces.

**Cómo corregirlo:** Genera un sitemap XML desde las rutas o el contenido y añade una línea Sitemap a robots.txt. Luego envíalo desde Loomaly. No hace falta abrir Search Console.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### El sitemap omite páginas indexables [#sitemap-stale]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `sitemap-stale` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** El sitio tiene sitemap y las páginas indexables que encontró el rastreo no están. Una barra final, www o una consulta no es otra página.

**Cómo corregirlo:** Genera el sitemap desde el mismo origen que las rutas o el contenido para que las páginas nuevas entren solas. No añadas URL a mano. Deja fuera el acceso y la app.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### El sitemap no es XML válido [#sitemap-invalid]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `sitemap-invalid` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** Una dirección de sitemap responde con algo que no es un sitemap: normalmente la propia página web del sitio, servida por una ruta comodín, o un 404 donde robots.txt dice que hay un sitemap. Los rastreadores no obtienen de ahí una lista de URL.

**Cómo corregirlo:** Sirve el sitemap como XML (`<urlset>` o `<sitemapindex>`) con un tipo de contenido XML, y apunta robots.txt solo a URL de sitemap que existan.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### El sitemap incluye páginas que no son la versión a indexar [#sitemap-lists-non-canonical]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `sitemap-lists-non-canonical` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** El sitemap incluye URL que no son la versión que Google debería indexar: declaran otra URL como canonical, redirigen a otra página o responden con un error. El problema dice cuántas, con ejemplos (una redirección muestra a dónde va). Google confía menos en un sitemap cuando no coincide con las páginas.

**Cómo corregirlo:** Genera el sitemap desde la misma fuente que las etiquetas canonical, incluye solo URL que respondan 200 sin redirigir y apunten su canonical a sí mismas, y sustituye las rutas antiguas por las direcciones a las que redirigen.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### Los canonical apuntan a direcciones que redirigen o fallan [#canonical-target-broken]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `canonical-target-broken` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** Algunas páginas nombran una URL canonical (la versión que los buscadores deberían indexar) que a su vez redirige o responde con un error. El problema enumera cada una de esas direcciones y qué respondió, y cuántas páginas la nombran. Los buscadores van a un rodeo o a un callejón sin salida, y pueden ignorar el canonical o descartar la página.

**Cómo corregirlo:** Apunta cada canonical a la dirección final que responde 200: normalmente la propia página, o el lugar al que ahora redirige la dirección antigua. Los canonical suelen definirse en una plantilla compartida o en un ajuste de un plugin de SEO.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Sitio móvil aparte sin rel="alternate" [#mobile-site-not-annotated]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `mobile-site-not-annotated` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** medio

**Qué significa:** Los teléfonos, incluido el rastreador de smartphones de Googlebot, se redirigen a un sitio móvil aparte en otro host (el problema lo nombra). Google pide que el par se declare en ambos sentidos: el canonical de la página móvil apunta a la página de escritorio, y la página de escritorio tiene un enlace `rel="alternate"` con un atributo `media` que apunta a la página móvil. La página de escritorio no tiene ese enlace.

**Cómo corregirlo:** En cada página de escritorio, añade `<link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.your-site/...">` para su URL móvil, y mantén el canonical de la página móvil apuntando de vuelta. O sirve un solo sitio adaptable en una sola dirección.

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing](https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing)

### Otras versiones de la dirección no redirigen de forma permanente [#host-variants-not-redirected]

**Gravedad:** Advertencia · **Dimensión:** Indexabilidad · **ID de la regla:** `host-variants-not-redirected` · **Comprobado por:** Comprobación del sitio · **Esfuerzo:** pequeño

**Qué significa:** Tu sitio responde en más de una dirección: la versión `http://`, o la versión con o sin `www.`, o bien muestra el propio sitio o envía a los visitantes con una redirección temporal (302 o 307). El problema enumera cada dirección y qué respondió. Los buscadores pueden tratarlas entonces como sitios distintos y repartir enlaces y señales entre ellas.

**Cómo corregirlo:** Haz que cada otra versión responda con una redirección permanente (301 o 308) directa a tu dirección principal, por ejemplo en los ajustes de dominio de tu hosting o de la CDN (en Cloudflare: **Always Use HTTPS** y una regla de redirección para el otro host).

**Guía oficial:** [developers.google.com/search/docs/crawling-indexing/301-redirects](https://developers.google.com/search/docs/crawling-indexing/301-redirects)

### Falta el favicon [#missing-favicon]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-favicon` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** La página no declara un favicon. Google lo muestra junto a tu resultado, y los navegadores lo muestran en las pestañas y los favoritos.

**Cómo corregirlo:** Añade `<link rel="icon" href="/favicon.ico">` (o un icono PNG o SVG) al `<head>`.

**Guía oficial:** [developers.google.com/search/docs/appearance/favicon-in-search](https://developers.google.com/search/docs/appearance/favicon-in-search)

### La página devolvió un estado distinto de 200 [#non-200-status]

**Gravedad:** Error · **Dimensión:** Indexabilidad · **ID de la regla:** `non-200-status` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** La página responde con un estado de error (tras seguir cualquier redirección), lo que la deja fuera de la indexación normal. El problema muestra el código de estado.

**Cómo corregirlo:** Si la página debe existir, corrige el error del servidor o restaura la página. Si se quitó a propósito, redirígela a un reemplazo, o quita los enlaces hacia ella y sácala de tu sitemap.

**Guía oficial:** [developers.google.com/crawling/docs/troubleshooting/http-status-codes](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes)

## Rendimiento [#category-performance]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Largest Contentful Paint por encima de 2.5s](#cwv-lcp-poor) | Advertencia | Rendimiento | Prueba de rendimiento |
| [Interaction to Next Paint por encima de 200ms](#cwv-inp-poor) | Advertencia | Rendimiento | Prueba de rendimiento |
| [Cumulative Layout Shift por encima de 0.1](#cwv-cls-poor) | Advertencia | Rendimiento | Prueba de rendimiento |
| [Time to First Byte por encima de 800ms](#cwv-ttfb-slow) | Advertencia | Rendimiento | Prueba de rendimiento |
| [Puntuación de rendimiento de Lighthouse por debajo de 50](#lighthouse-perf-low) | Advertencia | Rendimiento | Prueba de rendimiento |
| [La imagen de LCP no se carga con prioridad](#lcp-image-no-fetchpriority) | Advertencia | Rendimiento | Prueba de rendimiento |

### Largest Contentful Paint por encima de 2.5s [#cwv-lcp-poor]

**Gravedad:** Advertencia · **Dimensión:** Rendimiento · **ID de la regla:** `cwv-lcp-poor` · **Comprobado por:** Prueba de rendimiento · **Esfuerzo:** grande

**Qué significa:** Largest Contentful Paint, el tiempo hasta que el contenido principal es visible, supera los 2.5 segundos en el móvil. Loomaly usa datos de usuarios reales de Chrome cuando la página tiene suficiente tráfico, y una medición de laboratorio en caso contrario.

**Cómo corregirlo:** Localiza el elemento que Lighthouse cronometra como LCP y en qué se va su tiempo. Para texto, quita el CSS y el JavaScript que bloquean el renderizado, precarga la fuente web y usa `font-display`, y renderízalo en el servidor. Para una imagen, haz que se cargue primero (`fetchpriority="high"`, sin carga diferida, en el HTML inicial) y sírvela en un formato moderno al tamaño correcto. Una respuesta lenta del servidor retrasa ambas.

**Guía oficial:** [web.dev/articles/lcp](https://web.dev/articles/lcp)

### Interaction to Next Paint por encima de 200ms [#cwv-inp-poor]

**Gravedad:** Advertencia · **Dimensión:** Rendimiento · **ID de la regla:** `cwv-inp-poor` · **Comprobado por:** Prueba de rendimiento · **Esfuerzo:** grande

**Qué significa:** Interaction to Next Paint, lo rápido que la página reacciona a toques y clics, supera los 200 ms en el móvil. Esto solo se informa a partir de datos de usuarios reales, así que aparece en páginas con suficiente tráfico de Chrome.

**Cómo corregirlo:** Divide las tareas largas de JavaScript, aplaza los scripts que no hagan falta de inmediato y recorta o retrasa los scripts de terceros.

**Guía oficial:** [web.dev/articles/inp](https://web.dev/articles/inp)

### Cumulative Layout Shift por encima de 0.1 [#cwv-cls-poor]

**Gravedad:** Advertencia · **Dimensión:** Rendimiento · **ID de la regla:** `cwv-cls-poor` · **Comprobado por:** Prueba de rendimiento · **Esfuerzo:** medio

**Qué significa:** Cumulative Layout Shift, cuánto salta la página mientras carga, supera 0.1 en el móvil.

**Cómo corregirlo:** Define `width` y `height` en las imágenes y el contenido incrustado, reserva espacio para anuncios y banners, y evita insertar contenido por encima de lo que ya está en pantalla.

**Guía oficial:** [web.dev/articles/cls](https://web.dev/articles/cls)

### Time to First Byte por encima de 800ms [#cwv-ttfb-slow]

**Gravedad:** Advertencia · **Dimensión:** Rendimiento · **ID de la regla:** `cwv-ttfb-slow` · **Comprobado por:** Prueba de rendimiento · **Esfuerzo:** grande

**Qué significa:** Time to First Byte, lo que tarda el servidor en empezar a responder, supera los 800 ms. Todo lo demás en la página espera por eso.

**Cómo corregirlo:** Pon las páginas en caché en el borde con una CDN, acelera el servidor o el hosting, activa la compresión y evita redirecciones antes de la página.

**Guía oficial:** [web.dev/articles/ttfb](https://web.dev/articles/ttfb)

### Puntuación de rendimiento de Lighthouse por debajo de 50 [#lighthouse-perf-low]

**Gravedad:** Advertencia · **Dimensión:** Rendimiento · **ID de la regla:** `lighthouse-perf-low` · **Comprobado por:** Prueba de rendimiento · **Esfuerzo:** grande

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** La puntuación de rendimiento de Lighthouse de la página en móvil, de Google PageSpeed Insights, está por debajo de 50. Eso suele significar varios cuellos de botella a la vez.

**Cómo corregirlo:** Empieza por los problemas de rendimiento concretos informados para la misma página; el informe de PageSpeed Insights de la URL enumera más oportunidades.

**Guía oficial:** [developer.chrome.com/docs/lighthouse/performance/performance-scoring](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring)

### La imagen de LCP no se carga con prioridad [#lcp-image-no-fetchpriority]

**Gravedad:** Advertencia · **Dimensión:** Rendimiento · **ID de la regla:** `lcp-image-no-fetchpriority` · **Comprobado por:** Prueba de rendimiento · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** PageSpeed Insights detectó que el elemento más grande de la página es una imagen que el navegador no solicita primero. En un `<img>` eso significa que no hay `fetchpriority="high"`, que hay carga diferida, o que la imagen solo aparece después de que se ejecuta un script. En un fondo CSS el elemento no es un `<img>`, así que `fetchpriority` en él no hace nada. Corregir la solicitud suele quitar de 200 a 500 ms al LCP.

**Cómo corregirlo:** Si el elemento es un `<img>`, dale `fetchpriority="high"`, quita `loading="lazy"` y ponlo en el HTML que envía el servidor. Si es un fondo CSS en otro elemento, no añadas `fetchpriority` a ese elemento: precarga la imagen con `<link rel="preload" as="image" fetchpriority="high">`, o renderízala como un `<img>`.

**Guía oficial:** [web.dev/articles/fetch-priority](https://web.dev/articles/fetch-priority)

## Internacional [#category-international]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [hreflang sin autorreferencia](#hreflang-self-referential-missing) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |
| [Falta hreflang x-default](#hreflang-x-default-missing) | Aviso | Aspectos básicos de la página | Comprobación de reglas |

### hreflang sin autorreferencia [#hreflang-self-referential-missing]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `hreflang-self-referential-missing` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** medio

**Qué significa:** La página enumera sus otras versiones de idioma en hreflang, pero no a sí misma. Cada conjunto hreflang debe incluir la URL propia de la página.

**Cómo corregirlo:** Añade una entrada hreflang para el idioma propio de la página que apunte a su propia URL.

**Guía oficial:** [developers.google.com/search/docs/specialty/international/localized-versions](https://developers.google.com/search/docs/specialty/international/localized-versions)

### Falta hreflang x-default [#hreflang-x-default-missing]

**Gravedad:** Aviso · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `hreflang-x-default-missing` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

**Qué significa:** El conjunto hreflang no tiene `x-default`, la versión de reserva para los visitantes cuyo idioma no ofreces.

**Cómo corregirlo:** Añade `hreflang="x-default"` apuntando a tu selector de idioma o a la versión predeterminada.

**Guía oficial:** [developers.google.com/search/docs/specialty/international/localized-versions](https://developers.google.com/search/docs/specialty/international/localized-versions)

## Accesibilidad [#category-accessibility]

| Regla | Gravedad | Dimensión | Comprobado por |
| --- | --- | --- | --- |
| [Falta el atributo lang en `<html>`](#missing-html-lang) | Advertencia | Aspectos básicos de la página | Comprobación de reglas |

### Falta el atributo lang en `<html>` [#missing-html-lang]

**Gravedad:** Advertencia · **Dimensión:** Aspectos básicos de la página · **ID de la regla:** `missing-html-lang` · **Comprobado por:** Comprobación de reglas · **Esfuerzo:** pequeño

> Buena práctica, no un requisito de Google: por sí sola no decide el posicionamiento.

**Qué significa:** El elemento `<html>` no tiene atributo `lang`, así que los lectores de pantalla y las herramientas de traducción no pueden saber en qué idioma está la página.

**Cómo corregirlo:** Ponlo en el código de idioma de la página, por ejemplo `<html lang="en">`, `lang="de"` o `lang="zh-CN"`.

**Guía oficial:** [developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang)
