GEO con Shopify: Guía completa de implementación
beginnerShopify 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