agentleFS
marcoscazauxmarcoscazaux/skills/seo-geo/SKILL.md

seo-geo

Skill1 starsChanged 5 months agoMITView on GitHub

Skill especializado en SEO técnico y GEO (Generative Engine Optimization) para aplicaciones web. Úsalo siempre que el usuario mencione: metatags, Open Graph, Twitter Cards, datos estructurados, JSON-LD, Schema.org, canonical, hreflang, sitemap, robots.txt, Core Web Vitals, rendimiento SEO, optimización para motores de búsqueda, optimización para IA (ChatGPT, Perplexity, Gemini, Bing AI), rich snippets, breadcrumbs, FAQ schema, LocalBusiness, posicionamiento web, o cualquier tarea donde se quiera mejorar la visibilidad de una app en buscadores tradicionales o en motores de IA generativa. También debe activarse si el usuario pide "hacer la app más visible", "mejorar el SEO", "añadir metadatos", "optimizar para buscadores", o cuando genere páginas HTML/React/Next.js/Nuxt/Angular que deban estar bien posicionadas.

55 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use seo-agentic, seo-competitor-pages and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • AgriciDanielSkill

    seo-agentic

    Audit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Use when the user asks whether AI agents can use or browse the site, or about llms.txt or WebMCP. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).

    Also in 5 projects that use this

  • megastepSkill

    seo-competitor-pages

    Generate SEO-optimized competitor comparison and alternatives pages. Covers "X vs Y" layouts, "alternatives to X" pages, feature matrices, schema markup, and conversion optimization. Use when user says "comparison page", "vs page", "alternatives page", "competitor comparison", or "X vs Y".

    Also in 21 projects that use this

  • megastepSkill

    seo-images

    Image optimization analysis for SEO and performance. Checks alt text, file sizes, formats, responsive images, lazy loading, and CLS prevention. Use when user says "image optimization", "alt text", "image SEO", "image size", or "image audit".

    Also in 20 projects that use this

  • timruebenachSkill

    seo-google

    Google SEO APIs: Search Console (Search Analytics, URL Inspection, Sitemaps), PageSpeed Insights v5, CrUX field data with 25-week history, Indexing API v3, and GA4 organic traffic. Provides real Google field data for Core Web Vitals, indexation status, search performance, and organic traffic trends. Use when user says "search console", "GSC", "PageSpeed", "CrUX", "field data", "indexing API", "GA4 organic", "URL inspection", "google api setup", "real CWV data", "impressions", "clicks", "CTR", "position data", "LCP", "INP", "CLS", "FCP", "TTFB", or "Lighthouse scores".

    Also in 13 projects that use this

  • timruebenachSkill

    seo-image-gen

    AI image generation for SEO assets: OG/social preview images, blog hero images, schema images, product photography, infographics. Powered by Gemini via nanobanana-mcp. Requires banana extension installed. Use when user says \"generate image\", \"OG image\", \"social preview\", \"hero image\", \"blog image\", \"product photo\", \"infographic\", \"seo image\", \"create visual\", \"image-gen\", \"favicon\", \"schema image\", \"pinterest pin\", \"generate visual\", \"banner\", or \"thumbnail\".

    Also in 12 projects that use this

  • +3 more from megastep
  • +4 more from timruebenach

The file

Files
SKILL.md

SEO & GEO Skill

Guía de referencia profesional para implementar SEO técnico completo y GEO (Generative Engine Optimization) en aplicaciones web modernas. Cubre desde metaetiquetas básicas hasta datos enriquecidos JSON-LD, estrategias de contenido para IA generativa, y auditoría técnica.


Índice

  1. Fundamentos SEO — Etiquetas META
  2. Open Graph y Social Cards
  3. Datos Estructurados JSON-LD
  4. GEO — Generative Engine Optimization
  5. SEO Técnico Avanzado
  6. Core Web Vitals y Rendimiento
  7. SEO Local y Multiidioma
  8. Auditoría y Checklist
  9. Patrones por Framework

1. Fundamentos SEO — Etiquetas META

Bloque <head> mínimo obligatorio

<head>
  <!-- Codificación y viewport -->
  <meta charset="UTF-8" />
  <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0" />

  <!-- Título: 50-60 caracteres. Palabra clave principal al inicio. -->
  <title>Palabra Clave Principal | Marca</title>

  <!-- Meta description: 150-160 caracteres. CTA implícito. -->
  <meta
    name="description"
    content="Descripción clara, relevante y con CTA. Máximo 160 caracteres para evitar truncamiento en SERPs." />

  <!-- Canonical: siempre apuntar a la URL canónica definitiva -->
  <link
    rel="canonical"
    href="https://tudominio.com/ruta-canonica/" />

  <!-- Robots: por defecto index, follow. Ajustar según página -->
  <meta
    name="robots"
    content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" />

  <!-- Autor y copyright (opcional pero recomendado) -->
  <meta
    name="author"
    content="Nombre del autor o empresa" />
</head>

Meta robots — Valores importantes

DirectivaUso
noindexEvitar indexación (páginas de pago, duplicadas)
nofollowNo seguir enlaces de la página
noarchiveGoogle no muestra caché
noimageindexNo indexar imágenes de la página
max-snippet:-1Sin límite de fragmento en SERPs
max-image-preview:largePrevisualización de imagen grande

Etiquetas de control adicionales

<!-- Control de indexación por robots específicos -->
<meta
  name="googlebot"
  content="index, follow" />
<meta
  name="bingbot"
  content="index, follow" />

<!-- Tema de color (PWA y móviles) -->
<meta
  name="theme-color"
  content="#1a73e8" />

<!-- Verificación de propiedad (no SEO pero necesario) -->
<meta
  name="google-site-verification"
  content="TOKEN" />

2. Open Graph y Social Cards

Open Graph (Facebook, LinkedIn, WhatsApp)

<!-- Tipo de contenido -->
<meta
  property="og:type"
  content="website" />
<!-- Valores: website | article | product | book | profile | video.movie -->

<meta
  property="og:url"
  content="https://tudominio.com/pagina/" />
<meta
  property="og:title"
  content="Título para redes sociales (70 chars máx)" />
<meta
  property="og:description"
  content="Descripción para redes sociales (200 chars máx)" />

<!-- Imagen: mínimo 1200×630px, ratio 1.91:1, menos de 8MB -->
<meta
  property="og:image"
  content="https://tudominio.com/og/pagina.jpg" />
<meta
  property="og:image:width"
  content="1200" />
<meta
  property="og:image:height"
  content="630" />
<meta
  property="og:image:alt"
  content="Descripción de la imagen para accesibilidad" />
<meta
  property="og:image:type"
  content="image/jpeg" />

<meta
  property="og:site_name"
  content="Nombre de tu sitio" />
<meta
  property="og:locale"
  content="es_ES" />
<meta
  property="og:locale:alternate"
  content="en_US" />

Twitter / X Cards

<!-- summary_large_image es el tipo más visible -->
<meta
  name="twitter:card"
  content="summary_large_image" />
<!-- Valores: summary | summary_large_image | app | player -->

<meta
  name="twitter:site"
  content="@handle_de_tu_marca" />
<meta
  name="twitter:creator"
  content="@handle_del_autor" />
<meta
  name="twitter:title"
  content="Título para Twitter (70 chars máx)" />
<meta
  name="twitter:description"
  content="Descripción para Twitter (200 chars máx)" />
<meta
  name="twitter:image"
  content="https://tudominio.com/og/pagina.jpg" />
<meta
  name="twitter:image:alt"
  content="Descripción de la imagen" />

Open Graph para artículos

<meta
  property="og:type"
  content="article" />
<meta
  property="article:published_time"
  content="2025-01-15T10:00:00+01:00" />
<meta
  property="article:modified_time"
  content="2025-03-20T14:30:00+01:00" />
<meta
  property="article:author"
  content="https://tudominio.com/autor/nombre/" />
<meta
  property="article:section"
  content="Tecnología" />
<meta
  property="article:tag"
  content="SEO" />
<meta
  property="article:tag"
  content="Marketing Digital" />

3. Datos Estructurados JSON-LD

Regla general: siempre usar <script type="application/ld+json"> en el <head> o al final del <body>. Nunca mezclar con el contenido HTML visible. Validar siempre en schema.org/docs/validator y en Rich Results Test.

3.1 Organization / WebSite (base de todo sitio)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://tudominio.com/#organization",
      "name": "Nombre de tu empresa",
      "url": "https://tudominio.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://tudominio.com/logo.png",
        "width": 512,
        "height": 512
      },
      "sameAs": [
        "https://www.linkedin.com/company/tu-empresa",
        "https://twitter.com/tu_empresa",
        "https://www.facebook.com/tuempresa",
        "https://www.instagram.com/tuempresa"
      ],
      "contactPoint": {
        "@type": "ContactPoint",
        "telephone": "+34-900-000-000",
        "contactType": "customer service",
        "availableLanguage": ["Spanish", "English"]
      }
    },
    {
      "@type": "WebSite",
      "@id": "https://tudominio.com/#website",
      "url": "https://tudominio.com",
      "name": "Nombre del sitio web",
      "publisher": { "@id": "https://tudominio.com/#organization" },
      "potentialAction": {
        "@type": "SearchAction",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://tudominio.com/buscar?q={search_term_string}"
        },
        "query-input": "required name=search_term_string"
      }
    }
  ]
}
</script>

3.2 WebPage (página genérica)

{
  "@context": "https://schema.org",
  "@type": "WebPage",
  "@id": "https://tudominio.com/pagina/#webpage",
  "url": "https://tudominio.com/pagina/",
  "name": "Título de la página",
  "description": "Descripción de la página",
  "isPartOf": { "@id": "https://tudominio.com/#website" },
  "about": { "@id": "https://tudominio.com/#organization" },
  "datePublished": "2025-01-01",
  "dateModified": "2025-03-15",
  "breadcrumb": { "@id": "https://tudominio.com/pagina/#breadcrumb" }
}

3.3 BreadcrumbList

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "@id": "https://tudominio.com/categoria/producto/#breadcrumb",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Inicio",
      "item": "https://tudominio.com"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Categoría",
      "item": "https://tudominio.com/categoria/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Nombre del Producto"
    }
  ]
}

3.4 Article / BlogPosting

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Título del artículo (máx 110 chars)",
  "description": "Descripción del artículo",
  "image": {
    "@type": "ImageObject",
    "url": "https://tudominio.com/img/articulo.jpg",
    "width": 1200,
    "height": 630
  },
  "datePublished": "2025-01-15T10:00:00+01:00",
  "dateModified": "2025-03-20T14:30:00+01:00",
  "author": {
    "@type": "Person",
    "name": "Nombre del Autor",
    "url": "https://tudominio.com/autor/nombre/",
    "sameAs": "https://www.linkedin.com/in/nombre-autor"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Nombre del sitio",
    "logo": {
      "@type": "ImageObject",
      "url": "https://tudominio.com/logo.png"
    }
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://tudominio.com/blog/titulo-articulo/"
  },
  "articleSection": "SEO",
  "wordCount": 2500,
  "inLanguage": "es-ES"
}

3.5 Product (e-commerce)

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Nombre del producto",
  "description": "Descripción detallada del producto",
  "image": ["https://tudominio.com/img/producto-1.jpg", "https://tudominio.com/img/producto-2.jpg"],
  "sku": "SKU-12345",
  "mpn": "MPN-67890",
  "brand": {
    "@type": "Brand",
    "name": "Nombre de la marca"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://tudominio.com/producto/nombre/",
    "priceCurrency": "EUR",
    "price": "29.99",
    "priceValidUntil": "2025-12-31",
    "itemCondition": "https://schema.org/NewCondition",
    "availability": "https://schema.org/InStock",
    "seller": {
      "@type": "Organization",
      "name": "Tu Tienda"
    },
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": "0",
        "currency": "EUR"
      },
      "deliveryTime": {
        "@type": "ShippingDeliveryTime",
        "handlingTime": {
          "@type": "QuantitativeValue",
          "minValue": 0,
          "maxValue": 1,
          "unitCode": "DAY"
        },
        "transitTime": {
          "@type": "QuantitativeValue",
          "minValue": 1,
          "maxValue": 3,
          "unitCode": "DAY"
        }
      }
    }
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "128",
    "bestRating": "5",
    "worstRating": "1"
  },
  "review": [
    {
      "@type": "Review",
      "reviewRating": {
        "@type": "Rating",
        "ratingValue": "5"
      },
      "author": {
        "@type": "Person",
        "name": "Usuario Ejemplo"
      },
      "reviewBody": "Excelente producto, muy recomendable."
    }
  ]
}

3.6 FAQPage

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "¿Cuál es la pregunta frecuente 1?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Respuesta completa y detallada a la pregunta 1."
      }
    },
    {
      "@type": "Question",
      "name": "¿Cuál es la pregunta frecuente 2?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Respuesta completa y detallada a la pregunta 2."
      }
    }
  ]
}

3.7 LocalBusiness (negocios físicos)

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://tudominio.com/#local-business",
  "name": "Nombre del negocio",
  "description": "Descripción del negocio",
  "url": "https://tudominio.com",
  "telephone": "+34 900 000 000",
  "email": "info@tudominio.com",
  "priceRange": "€€",
  "currenciesAccepted": "EUR",
  "paymentAccepted": "Cash, Credit Card",
  "image": "https://tudominio.com/img/negocio.jpg",
  "logo": "https://tudominio.com/logo.png",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Calle Ejemplo, 123",
    "addressLocality": "Madrid",
    "addressRegion": "Madrid",
    "postalCode": "28001",
    "addressCountry": "ES"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 40.4168,
    "longitude": -3.7038
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "09:00",
      "closes": "18:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "10:00",
      "closes": "14:00"
    }
  ],
  "sameAs": [
    "https://www.google.com/maps/place/TU_PLACE_ID",
    "https://www.yelp.com/biz/tu-negocio"
  ],
  "hasMap": "https://www.google.com/maps?q=40.4168,-3.7038"
}

3.8 HowTo

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Cómo hacer X paso a paso",
  "description": "Guía completa para hacer X",
  "image": "https://tudominio.com/img/howto.jpg",
  "totalTime": "PT30M",
  "estimatedCost": {
    "@type": "MonetaryAmount",
    "currency": "EUR",
    "value": "0"
  },
  "supply": [{ "@type": "HowToSupply", "name": "Herramienta 1" }],
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "Paso 1: Nombre descriptivo",
      "text": "Descripción detallada del paso 1.",
      "image": "https://tudominio.com/img/paso1.jpg",
      "url": "https://tudominio.com/como-hacer-x/#paso-1"
    }
  ]
}

3.9 Event

{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Nombre del evento",
  "startDate": "2025-06-15T18:00:00+02:00",
  "endDate": "2025-06-15T21:00:00+02:00",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
  "location": {
    "@type": "Place",
    "name": "Nombre del lugar",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "Calle Ejemplo, 1",
      "addressLocality": "Barcelona",
      "addressCountry": "ES"
    }
  },
  "image": "https://tudominio.com/img/evento.jpg",
  "description": "Descripción del evento",
  "offers": {
    "@type": "Offer",
    "url": "https://tudominio.com/evento/registro/",
    "price": "0",
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock",
    "validFrom": "2025-01-01T00:00:00+01:00"
  },
  "organizer": {
    "@type": "Organization",
    "name": "Tu empresa",
    "url": "https://tudominio.com"
  }
}

3.10 SoftwareApplication (apps web/móvil)

{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Nombre de la App",
  "description": "Descripción de la app",
  "operatingSystem": "Web, iOS, Android",
  "applicationCategory": "BusinessApplication",
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "EUR"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "ratingCount": "2500"
  },
  "screenshot": "https://tudominio.com/img/app-screenshot.jpg",
  "featureList": "Feature 1, Feature 2, Feature 3",
  "softwareVersion": "2.1.0"
}

4. GEO — Generative Engine Optimization

GEO es la optimización del contenido para que los motores de IA generativa (ChatGPT, Perplexity, Gemini, Bing Copilot, Claude) citen o referencien tu contenido en sus respuestas.

Principios fundamentales GEO

Los LLMs no indexan HTML, indexan texto semántico legible. El contenido debe estar:

  • Claramente estructurado con jerarquía H1 > H2 > H3
  • Escrito en párrafos informativos completos (no solo bullets)
  • Con definiciones explícitas ("X es...", "Se define como...")
  • Con citas a fuentes autoritativas verificables

Estrategias concretas de GEO

4.1 E-E-A-T reforzado (Experience, Expertise, Authoritativeness, Trustworthiness)

<!-- Mostrar autor con credenciales verificables -->
<div
  itemscope
  itemtype="https://schema.org/Person">
  <span itemprop="name">Dr. Nombre Apellido</span>
  <span itemprop="jobTitle">Especialista en SEO con 10 años de experiencia</span>
  <a
    itemprop="sameAs"
    href="https://www.linkedin.com/in/nombre"
    >LinkedIn</a
  >
</div>

<!-- Fechas visibles y actualizadas en el contenido -->
<time datetime="2025-03-20">Actualizado el 20 de marzo de 2025</time>

4.2 Contenido optimizado para citas de IA

<!-- ✅ Correcto: definición directa y citable -->

## ¿Qué es el SEO técnico?

El SEO técnico es el conjunto de optimizaciones aplicadas a la
infraestructura de un sitio web para mejorar su rastreo e indexación
por parte de los motores de búsqueda. Incluye la optimización de
velocidad, estructura de URLs, datos estructurados y accesibilidad.

<!-- ❌ Incorrecto para GEO: fragmentado, sin definición clara -->

## SEO técnico

- Velocidad
- URLs
- Datos estructurados

4.3 Metaetiquetas específicas para rastreadores de IA

<!-- Permitir a los rastreadores de IA indexar el contenido -->
<!-- NOTA: OAI-SearchBot y PerplexityBot respetan robots.txt -->

<!-- Si quieres bloquear rastreadores de IA para entrenamiento pero no para RAG -->
<meta
  name="robots"
  content="noai, noimageai" />
<!-- noai: no usar contenido para entrenamiento de modelos -->
<!-- noimageai: no usar imágenes para entrenamiento -->

<!-- Para permitir rastreo de Perplexity explícitamente en robots.txt: -->
<!-- User-agent: PerplexityBot -->
<!-- Allow: / -->

4.4 llms.txt — Archivo de contexto para LLMs

Crea /llms.txt en la raíz del dominio (convención emergente, inspirada en robots.txt):

# Nombre de tu empresa

> Descripción concisa de qué hace tu empresa o producto.

Esta web es la fuente oficial de información sobre [tema].

## Contenido principal

- [Página de inicio](https://tudominio.com/): Descripción de la home
- [Guía completa de X](https://tudominio.com/guia/): Guía definitiva sobre X
- [API Reference](https://tudominio.com/docs/api/): Documentación técnica
- [Blog](https://tudominio.com/blog/): Artículos y tutoriales

## Información importante

- Fundada en: 2020
- Sede: Madrid, España
- Contacto: info@tudominio.com
- Licencia de contenido: CC BY-SA 4.0

## Lo que NO somos

No somos [empresa similar]. No ofrecemos [servicio que no ofrecemos].

También puedes crear /llms-full.txt con el contenido completo del sitio para ingesta directa.

4.5 Citabilidad estructural

Para que los LLMs citen correctamente tu contenido, incluye:

<!-- Referencias y fuentes en el contenido -->
<article>
  <h2>Afirmación basada en datos</h2>
  <p>
    Según el informe de Google Search Central (2024), el 53% de los usuarios abandona una página que
    tarda más de 3 segundos en cargar.
  </p>
  <footer>
    <cite>
      Fuente:
      <a
        href="URL_FUENTE"
        rel="noopener"
        >Google Web Vitals Report 2024</a
      >
    </cite>
  </footer>
</article>

5. SEO Técnico Avanzado

5.1 robots.txt

User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/private/
Disallow: /checkout/
Disallow: /*?*sessionid=
Disallow: /buscar?

# Archivos de mapa del sitio
Sitemap: https://tudominio.com/sitemap.xml
Sitemap: https://tudominio.com/sitemap-images.xml

# Rastreadores de IA para entrenamiento (opcional bloquear)
User-agent: GPTBot
Disallow: /contenido-exclusivo/

User-agent: Claude-Web
Disallow: /

# Rastreadores de IA para búsqueda (dejar pasar)
User-agent: PerplexityBot
Allow: /

User-agent: OAI-SearchBot
Allow: /

5.2 sitemap.xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">

  <url>
    <loc>https://tudominio.com/</loc>
    <lastmod>2025-03-20</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
    <!-- Imágenes en sitemap -->
    <image:image>
      <image:loc>https://tudominio.com/img/hero.jpg</image:loc>
      <image:caption>Descripción de la imagen para SEO</image:caption>
    </image:image>
    <!-- Versiones en otros idiomas -->
    <xhtml:link rel="alternate" hreflang="es" href="https://tudominio.com/" />
    <xhtml:link rel="alternate" hreflang="en" href="https://tudominio.com/en/" />
  </url>

</urlset>

5.3 Hreflang (multiidioma)

<!-- En el <head> de cada versión de la página -->
<link
  rel="alternate"
  hreflang="es"
  href="https://tudominio.com/pagina/" />
<link
  rel="alternate"
  hreflang="es-ES"
  href="https://tudominio.com/pagina/" />
<link
  rel="alternate"
  hreflang="es-MX"
  href="https://mx.tudominio.com/pagina/" />
<link
  rel="alternate"
  hreflang="en"
  href="https://tudominio.com/en/page/" />
<link
  rel="alternate"
  hreflang="en-US"
  href="https://tudominio.com/en/page/" />
<link
  rel="alternate"
  hreflang="x-default"
  href="https://tudominio.com/pagina/" />

Reglas hreflang:

  • Cada página debe apuntar a todas las variantes, incluida ella misma.
  • x-default indica la página por defecto cuando ningún idioma encaja.
  • Debe ser recíproco: si A apunta a B, B debe apuntar a A.

5.4 Preconnect, Prefetch y Preload

<!-- Preconnect: establecer conexión anticipada con dominios externos críticos -->
<link
  rel="preconnect"
  href="https://fonts.googleapis.com" />
<link
  rel="preconnect"
  href="https://fonts.gstatic.com"
  crossorigin />
<link
  rel="dns-prefetch"
  href="https://www.google-analytics.com" />

<!-- Preload: cargar recursos críticos del LCP antes -->
<link
  rel="preload"
  as="image"
  href="/img/hero.webp"
  fetchpriority="high" />
<link
  rel="preload"
  as="font"
  href="/fonts/Inter.woff2"
  type="font/woff2"
  crossorigin />
<link
  rel="preload"
  as="style"
  href="/css/critical.css" />

5.5 URLs canónicas — Casos especiales

<!-- Página con parámetros UTM: canonical a la URL limpia -->
<!-- URL real: /producto?utm_source=newsletter -->
<link
  rel="canonical"
  href="https://tudominio.com/producto/" />

<!-- Paginación: cada página tiene su propia canonical -->
<!-- /blog/page/2/ apunta a sí misma, no a /blog/ -->
<link
  rel="canonical"
  href="https://tudominio.com/blog/page/2/" />

<!-- AMP: en la página AMP, canonical apunta a la versión normal -->
<link
  rel="canonical"
  href="https://tudominio.com/articulo/" />
<!-- En la versión normal, apuntar a la AMP -->
<link
  rel="amphtml"
  href="https://tudominio.com/articulo/amp/" />

6. Core Web Vitals y Rendimiento

Los CWV son factores de ranking confirmados por Google. Objetivo: pasar todos en verde.

MétricaDescripciónObjetivoBuenoMejorarMalo
LCPLargest Contentful PaintCarga del elemento principal< 2.5s2.5-4s> 4s
INPInteraction to Next PaintRespuesta a interacciones< 200ms200-500ms> 500ms
CLSCumulative Layout ShiftEstabilidad visual< 0.10.1-0.25> 0.25

Optimización LCP

<!-- 1. Priorizar la imagen del LCP -->
<img
  src="/img/hero.webp"
  alt="Descripción relevante"
  width="1200"
  height="630"
  fetchpriority="high"
  loading="eager" />

<!-- 2. Evitar lazy loading en imágenes above-the-fold -->
<!-- ❌ Incorrecto -->
<img
  src="/img/hero.webp"
  loading="lazy" />

<!-- 3. Usar formatos modernos con fallback -->
<picture>
  <source
    type="image/avif"
    srcset="/img/hero.avif" />
  <source
    type="image/webp"
    srcset="/img/hero.webp" />
  <img
    src="/img/hero.jpg"
    alt="Descripción"
    width="1200"
    height="630" />
</picture>

Optimización CLS

<!-- Reservar espacio para imágenes con width y height -->
<img
  src="/img/producto.webp"
  width="400"
  height="300"
  alt="..." />

<!-- Reservar espacio para ads y embeds -->
<div style="min-height: 250px;">
  <!-- Anuncio o embed cargado dinámicamente -->
</div>

<!-- Fuentes web sin FOUT/FOIT -->
<style>
  @font-face {
    font-family: 'Inter';
    src: url('/fonts/Inter.woff2') format('woff2');
    font-display: swap; /* Usar fuente del sistema hasta cargar la web font */
  }
</style>

7. SEO Local y Multiidioma

Señales SEO local

<!-- NAP consistente en toda la web (Name, Address, Phone) -->
<address
  itemscope
  itemtype="https://schema.org/PostalAddress">
  <span itemprop="streetAddress">Calle Mayor, 10</span>,
  <span itemprop="addressLocality">Madrid</span>, <span itemprop="postalCode">28001</span>,
  <span itemprop="addressCountry">España</span>
</address>
<a
  href="tel:+34900000000"
  itemprop="telephone"
  >+34 900 000 000</a
>

Google Business Profile — Optimización complementaria

El JSON-LD de LocalBusiness debe ser idéntico a los datos en Google Business Profile:

  • Nombre exacto del negocio
  • Dirección en el mismo formato
  • Teléfono con prefijo internacional
  • Categorías de negocio alineadas

Meta de idioma y región

<html lang="es-ES">
  <!-- Valores: es | es-ES | es-MX | en | en-US | ca | gl | eu -->

  <!-- Content-Language en HTTP headers (configurar en servidor) -->
  <!-- Content-Language: es-ES -->
</html>

8. Auditoría y Checklist

Checklist SEO técnico por página

✅ Metadatos básicos

  • <title> único, 50-60 chars, keyword al inicio
  • <meta description> único, 150-160 chars
  • <link rel="canonical"> correcto y sin trailing slash inconsistente
  • <meta name="robots"> configurado según tipo de página
  • <html lang="xx-XX"> definido

✅ Open Graph y Social

  • og:title, og:description, og:image (1200×630px mínimo)
  • og:type correcto según el tipo de página
  • og:url igual a la canonical
  • twitter:card, twitter:title, twitter:image

✅ JSON-LD

  • Organization + WebSite en el home
  • BreadcrumbList en páginas internas
  • Schema específico del tipo de página (Article, Product, FAQ, etc.)
  • Validado en Rich Results Test de Google
  • Sin errores en Schema.org Validator

✅ Técnico

  • HTTPS activo y sin mixed content
  • Redirects 301 (no 302) para URLs movidas
  • Sin broken links internos (404)
  • robots.txt correcto y accesible
  • sitemap.xml enviado en Google Search Console
  • Imágenes con width + height + alt descriptivo
  • Fuentes con font-display: swap
  • LCP < 2.5s, CLS < 0.1, INP < 200ms

✅ GEO

  • /llms.txt creado y actualizado
  • Definiciones explícitas en el contenido
  • E-E-A-T visible: autor, fechas, fuentes
  • noai/noimageai configurado según política de contenido

Herramientas de validación

HerramientaURLPara qué
Rich Results Testsearch.google.com/test/rich-resultsValidar JSON-LD
Schema Validatorvalidator.schema.orgValidar Schema.org
PageSpeed Insightspagespeed.web.devCWV y rendimiento
Google Search Consolesearch.google.com/search-consoleIndexación y cobertura
Open Graph Debuggerdevelopers.facebook.com/tools/debugValidar OG
Twitter Card Validatorcards-dev.twitter.com/validatorValidar Twitter Cards
Ahrefs Webmasterahrefs.com/webmaster-toolsBacklinks y auditoría
Screaming Frogscreamingfrog.co.uk/seo-spiderCrawl completo del sitio

9. Patrones por Framework

Next.js 14+ (App Router)

// app/layout.tsx o app/[slug]/page.tsx
import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: {
    template: '%s | Nombre del Sitio',
    default: 'Nombre del Sitio',
  },
  description: 'Descripción global del sitio',
  metadataBase: new URL('https://tudominio.com'),
  alternates: {
    canonical: '/',
    languages: {
      'es-ES': '/es',
      'en-US': '/en',
    },
  },
  openGraph: {
    title: 'Título OG',
    description: 'Descripción OG',
    url: 'https://tudominio.com',
    siteName: 'Nombre del Sitio',
    images: [{ url: '/og-image.jpg', width: 1200, height: 630 }],
    locale: 'es_ES',
    type: 'website',
  },
  twitter: {
    card: 'summary_large_image',
    title: 'Título Twitter',
    description: 'Descripción Twitter',
    site: '@handle',
    images: ['/og-image.jpg'],
  },
  robots: {
    index: true,
    follow: true,
    googleBot: {
      index: true,
      follow: true,
      'max-video-preview': -1,
      'max-image-preview': 'large',
      'max-snippet': -1,
    },
  },
};

// JSON-LD en Next.js
export default function Page() {
  const jsonLd = {
    '@context': 'https://schema.org',
    '@type': 'WebPage',
    name: 'Título de la página',
  };

  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
      />
      {/* Contenido */}
    </>
  );
}

Angular (con SSR/SSG obligatorio para SEO)

// En el componente o en un servicio SEO centralizado
import { Component, OnInit } from '@angular/core';
import { Meta, Title } from '@angular/platform-browser';
import { DOCUMENT } from '@angular/common';

@Component({
  /* ... */
})
export class MiPaginaComponent implements OnInit {
  constructor(
    private meta: Meta,
    private title: Title,
    @Inject(DOCUMENT) private doc: Document,
  ) {}

  ngOnInit() {
    this.title.setTitle('Título de la página | Sitio');

    this.meta.updateTag({ name: 'description', content: 'Descripción de 150-160 chars' });
    this.meta.updateTag({ property: 'og:title', content: 'Título OG' });
    this.meta.updateTag({ property: 'og:description', content: 'Descripción OG' });
    this.meta.updateTag({ property: 'og:image', content: 'https://tudominio.com/og.jpg' });
    this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });

    // Canonical
    const link = this.doc.createElement('link');
    link.setAttribute('rel', 'canonical');
    link.setAttribute('href', 'https://tudominio.com/pagina/');
    this.doc.head.appendChild(link);

    // JSON-LD
    const script = this.doc.createElement('script');
    script.type = 'application/ld+json';
    script.text = JSON.stringify({ '@context': 'https://schema.org', '@type': 'WebPage' });
    this.doc.head.appendChild(script);
  }
}

⚠️ Importante en Angular: Sin SSR (Angular Universal) o SSG, los bots no ejecutan JavaScript y el SEO es nulo. Usar @angular/ssr es obligatorio para SEO real.

Nuxt.js 3

// En el composable o en la página
useHead({
  title: 'Título de la página',
  meta: [
    { name: 'description', content: 'Descripción 150-160 chars' },
    { property: 'og:title', content: 'Título OG' },
    { property: 'og:image', content: 'https://tudominio.com/og.jpg' },
  ],
  link: [{ rel: 'canonical', href: 'https://tudominio.com/pagina/' }],
  script: [
    {
      type: 'application/ld+json',
      innerHTML: JSON.stringify({ '@context': 'https://schema.org', '@type': 'WebPage' }),
    },
  ],
});

// O con useSeoMeta (Nuxt 3.x):
useSeoMeta({
  title: 'Título',
  description: 'Descripción',
  ogTitle: 'Título OG',
  ogImage: 'https://tudominio.com/og.jpg',
  twitterCard: 'summary_large_image',
});

HTML estático (sin framework)

Usar los bloques de código directamente de las secciones 1, 2 y 3 de esta guía.


Notas de uso del skill

  • Siempre validar el JSON-LD generado en Rich Results Test antes de desplegarlo.
  • No inventar datos: todos los valores de Schema.org deben corresponder a información real y verificable.
  • Los tipos de Schema.org soportados para rich results varían. Consultar la galería de rich results de Google para la lista oficial actualizada.
  • GEO es una disciplina emergente (2024-2025). Las mejores prácticas evolucionan rápido; /llms.txt es una convención en adopción, no un estándar oficial a fecha de creación de este skill.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.