🛍️

GEO con Shopify: Guía completa de implementación

beginner

Shopify implementa GEO via theme.liquid para meta tags y schema JSON-LD. Usa los objetos Liquid incorporados article.published_at y article.updated_at para señales de recencia. Añade schemas Product y Article via script tags en el layout. El HTML entregado por el CDN de Shopify es completamente rastreable por bots de IA.

GEO con Shopify: Guía completa de implementación

Shopify implementa GEO via theme.liquid para meta tags y schema JSON-LD. Usa los objetos Liquid incorporados article.published_at y article.updated_at para señales de recencia. Añade schemas Product y Article via script tags en el layout. El HTML entregado por el CDN de Shopify es completamente rastreable por bots de IA.

Shopify genera HTML server-rendered para todas las páginas — productos, colecciones, posts de blog y páginas estáticas. Esto lo hace nativamente compatible con los crawlers de IA. El trabajo principal de GEO es añadir datos estructurados y asegurar que los meta tags estén completos.

Sección head de theme.liquid

Edita layout/theme.liquid para añadir meta tags completos:

{% comment %} layout/theme.liquid {% endcomment %}
<!DOCTYPE html>
<html lang="{{ shop.locale }}">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <!-- TÍTULO Y DESCRIPCIÓN -->
  <title>
    {%- if template == 'index' -%}
      {{ shop.name }} — {{ shop.description }}
    {%- elsif template == 'product' -%}
      {{ product.title }} | {{ shop.name }}
    {%- elsif template == 'article' -%}
      {{ article.title }} | {{ blog.title }} | {{ shop.name }}
    {%- elsif page_title -%}
      {{ page_title }} | {{ shop.name }}
    {%- else -%}
      {{ shop.name }}
    {%- endif -%}
  </title>

  {%- if page_description -%}
    <meta name="description" content="{{ page_description | escape }}">
  {%- else -%}
    <meta name="description" content="{{ shop.description | escape }}">
  {%- endif -%}

  <meta name="author" content="{{ shop.name }}">
  <link rel="canonical" href="{{ canonical_url }}">
  <meta name="robots" content="index, follow">

  <!-- OPEN GRAPH -->
  {%- if template == 'article' -%}
    <meta property="og:type" content="article">
    <meta property="article:published_time" content="{{ article.published_at | date: '%Y-%m-%dT%H:%M:%SZ' }}">
    <meta property="article:modified_time" content="{{ article.updated_at | date: '%Y-%m-%dT%H:%M:%SZ' }}">
    <meta property="article:author" content="{{ article.author }}">
    {%- for tag in article.tags -%}
      <meta property="article:tag" content="{{ tag }}">
    {%- endfor -%}
  {%- elsif template == 'product' -%}
    <meta property="og:type" content="product">
  {%- else -%}
    <meta property="og:type" content="website">
  {%- endif -%}

  <meta property="og:title" content="{{ page_title | escape }}">
  <meta property="og:description" content="{{ page_description | default: shop.description | escape }}">
  <meta property="og:url" content="{{ canonical_url }}">
  <meta property="og:site_name" content="{{ shop.name }}">
  <meta property="og:locale" content="{{ shop.locale | replace: '-', '_' }}">

  {%- if template == 'product' and product.featured_image -%}
    <meta property="og:image" content="{{ product.featured_image | img_url: '1200x630' }}">
  {%- elsif template == 'article' and article.image -%}
    <meta property="og:image" content="{{ article.image | img_url: '1200x630' }}">
  {%- endif -%}

  <!-- SCHEMA JSON-LD -->
  {%- if template == 'article' -%}
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "Article",
      "headline": {{ article.title | json }},
      "description": {{ article.excerpt_or_content | strip_html | truncate: 160 | json }},
      "author": {
        "@type": "Person",
        "name": {{ article.author | json }}
      },
      "publisher": {
        "@type": "Organization",
        "name": {{ shop.name | json }},
        "logo": {
          "@type": "ImageObject",
          "url": {{ shop.url | append: '/assets/logo.png' | json }}
        }
      },
      "datePublished": {{ article.published_at | date: '%Y-%m-%dT%H:%M:%SZ' | json }},
      "dateModified": {{ article.updated_at | date: '%Y-%m-%dT%H:%M:%SZ' | json }},
      "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": {{ canonical_url | json }}
      }
      {%- if article.image -%}
      , "image": {{ article.image | img_url: '1200x630' | json }}
      {%- endif -%}
    }
    </script>
  {%- endif -%}

  {%- if template == 'product' -%}
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "Product",
      "name": {{ product.title | json }},
      "description": {{ product.description | strip_html | truncate: 300 | json }},
      "url": {{ canonical_url | json }},
      "sku": {{ product.selected_or_first_available_variant.sku | json }},
      "brand": {
        "@type": "Brand",
        "name": {{ product.vendor | json }}
      },
      "offers": {
        "@type": "Offer",
        "price": {{ product.selected_or_first_available_variant.price | money_without_currency }},
        "priceCurrency": {{ cart.currency.iso_code | json }},
        "availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
        "url": {{ canonical_url | json }}
      }
      {%- if product.featured_image -%}
      , "image": {{ product.featured_image | img_url: '1200x1200' | json }}
      {%- endif -%}
    }
    </script>
  {%- endif -%}

  {{ content_for_header }}
</head>

robots.txt en Shopify

Shopify genera robots.txt automáticamente. Para personalizarlo, ve a Tienda online → Temas → Editar código y crea templates/robots.txt.liquid:

{% comment %} templates/robots.txt.liquid {% endcomment %}
User-agent: GPTBot
Allow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: Claude-User
Allow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: Google-Extended
Allow: /

User-agent: BingBot
Allow: /

{% for group in robots.default_groups %}
User-agent: {{ group.user_agent }}
{% for rule in group.rules %}{{ rule }}
{% endfor %}
{% endfor %}

Sitemap: {{ routes.root_url }}sitemap.xml
Sitemap: {{ routes.root_url }}llms.txt

llms.txt via página Shopify

Crea una nueva página con handle llms-txt y configura una ruta.

En config/routes.json:

{
  "/llms.txt": "page?handle=llms-txt"
}

Crea un template templates/page.llms-txt.liquid:

{% layout none %}
HTTP/1.1 200 OK
Content-Type: text/plain

# {{ shop.name }}
> {{ shop.description }}

## Productos
{% for product in collections.all.products limit: 20 %}
- [{{ product.title }}]({{ shop.url }}{{ product.url }}): {{ product.description | strip_html | truncate: 100 }}
{% endfor %}

## Blog
{% for article in blogs.news.articles limit: 20 %}
- [{{ article.title }}]({{ shop.url }}{{ article.url }}): {{ article.excerpt | strip_html | truncate: 100 }}
{% endfor %}

## Páginas
- [Sobre nosotros]({{ shop.url }}/pages/about): Información de nuestra empresa
- [Contacto]({{ shop.url }}/pages/contact): Información de contacto

Checklist GEO para Shopify

  • theme.liquid: meta tags completos con og:type, og:title, og:description, og:url, og:image
  • Páginas de artículo: article:published_time y article:modified_time via article.published_at y article.updated_at
  • Páginas de artículo: schema JSON-LD Article en el head
  • Páginas de producto: schema JSON-LD Product con precio y disponibilidad
  • URL canónica: variable Liquid canonical_url en el head
  • robots.txt.liquid: los 8 crawlers de IA explícitamente permitidos
  • llms.txt: creado como página Shopify con template personalizado
  • Contenido de posts de blog: pirámide invertida (respuesta en el primer párrafo)
  • Descripciones de producto: declaración de valor directa en la primera frase
  • Core Web Vitals: LCP < 2.5s, INP < 200ms, CLS < 0.1