Los Metafields fueron durante mucho tiempo la solución estándar para datos personalizados en Shopify. Pero había un problema: eran planos, desproporcionados e inadecuados para estructuras complejas. Con los Metaobjects, Shopify dio una respuesta más elegante.
Tras cinco años de desarrollo en Shopify, vemos a diario proyectos en los que los Metaobjects forman la base de experiencias de storefront convincentes. En este artículo te mostramos lo que realmente importa.
¿Qué son los Metaobjects? El concepto fundamental
Los Metaobjects son tipos de datos estructurados que Shopify introdujo en 2023. A diferencia de los Metafields, que están vinculados a un recurso (por ejemplo, un producto), los Metaobjects son registros independientes con sus propios campos y relaciones.
Imagina que vendes vinos. Con Metafields, podrías añadir una nota a cada producto ("Taninos: Medio, Acidez: Alta"). Con Metaobjects, creas un tipo "WineProfile" con campos estructurados: Taninos (número), Acidez (número), Notas de sabor (multilínea), Región de origen (enlace a Metaobject de región).
Metafields vs. Metaobjects: La diferencia
| Aspecto | Metafields | Metaobjects |
|---|---|---|
| Estructura | Plana, tipos de campo limitados | Jerárquica, tipos propios |
| Vinculación | Ligados a productos, colecciones, pedidos | Registros independientes |
| Relaciones | Limitadas | Campos de relación nativos |
| Gestión | UI de admin o API | UI de admin con apps personalizadas |
| Reutilización | Definido por recurso | Definido una vez, utilizable en todas partes |
Para muchos casos simples (por ejemplo, "número de entrega del fabricante"), los Metafields son suficientes. Pero en cuanto necesitas estructuras complejas, los Metaobjects son más elegantes.
¿Cuándo necesitas realmente Metaobjects?
No todos los proyectos necesitan Metaobjects. Hay algunos indicadores claros:
1. Los campos estándar no son suficientes ¿Tu producto tiene más de 50 campos personalizados? La UI de administración se vuelve confusa. Los Metaobjects permiten interfaces de gestión dedicadas para datos relacionados.
2. Contenido multilingüe Con Metaobjects puedes estructurar contenido específico por idioma — por ejemplo, descripciones diferentes para la storefront en alemán y en inglés, sin necesidad de herramientas externas.
Tipo de Metaobject: "ProductDescription"
- Campo: title (Texto, multilingüe)
- Campo: shortDescription (Texto, multilingüe)
- Campo: longDescription (Rich Text, multilingüe)
- Campo: seoKeyword (Texto)
3. Gestión de contenidos sin apps externas Muchas tiendas utilizan CMS headless externos para contenido flexible. Con Metaobjects puedes gestionar gran parte directamente en Shopify — más económico, más rápido, más integrado.
4. Relaciones complejas entre registros Digamos que tienes "Certificaciones" para tus productos. Cada certificación tiene un logo, una descripción y fechas de validez. Con Metaobjects lo defines una vez y lo vinculas a muchos productos.
Casos de uso reales de nuestra práctica:
- JClay: Colecciones con storytelling — cada colección tenía artículos asociados, galerías de imágenes y perfiles de autor. Los Metaobjects hicieron la gestión clara y organizada.
- Marca de moda: Tablas de tallas con nombres de tallas, medidas y vídeos por artículo
- Fabricante de alimentos: Tablas nutricionales, alérgenos y certificaciones como datos estructurados
Cómo construir Metaobjects
Paso 1: Definir el tipo de Metaobject
Esto se hace en el Admin de Shopify en Settings → Data Models → Metaobject Definitions.
Para nuestro ejemplo de vinos:
Name: Wine Profile
Plural: Wine Profiles
Description: Perfiles de sabor para vinos
Añadir campos:
| Nombre del campo | Tipo | ¿Obligatorio? | Notas |
|---|---|---|---|
| Taninos | Integer | Sí | Escala 1-10 |
| Acidez | Integer | Sí | Escala 1-10 |
| Notas de sabor | List | No | Array de texto |
| Región de origen | Link (Collection) | No | Enlace a región |
| Tiempo de envejecimiento | Text | No | p. ej., "5-10 años" |
Paso 2: Crear instancias de Metaobject
En el Admin en Content → Metaobjects:
Display Name: "Pinot Noir 2019"
Taninos: 7
Acidez: 6
Notas de sabor: ["Cerezas", "Setas", "Tierra"]
Región de origen: Burgundy Region
Tiempo de envejecimiento: "8-12 años"
Paso 3: Conectar con la Storefront
La parte mágica: cada producto puede tener ahora un Metaobject de Wine Profile.
Con GraphQL (API):
query {
products(first: 1) {
edges {
node {
id
title
metafield(namespace: "custom", key: "wine_profile") {
reference {
... on Metaobject {
type
field(key: "tannine") {
value
}
field(key: "sauere") {
value
}
field(key: "geschmacksnoten") {
value
}
}
}
}
}
}
}
}
Con Liquid (Theme):
{% assign wine_profile = product.metafields.custom.wine_profile.reference %}
{% if wine_profile %}
<div class="wine-profile">
<h3>{{ wine_profile.field.tannine.value }} / 10 Taninos</h3>
<p>{{ wine_profile.field.sauere.value }} / 10 Acidez</p>
<p>Notas de sabor: {{ wine_profile.field.geschmacksnoten.value | join: ", " }}</p>
</div>
{% endif %}
Ese es el núcleo. Los Metaobjects no son complicados — simplemente están bien estructurados.
Ejemplos prácticos y código
Ejemplo 1: Atributos de producto personalizados (Moda)
Muchas tiendas de moda necesitan atributos adicionales más allá de talla y color: composición del material, instrucciones de cuidado, país de origen.
Definir tipo de Metaobject: "FabricInfo"
Fields:
- material (Text): "100% Algodón"
- composition (List): ["60% Algodón", "40% Poliéster"]
- careInstructions (Rich Text)
- sustainabilityBadge (Link to Badge Metaobject)
- manufacturingCountry (Text)
GraphQL para Frontend:
query GetProductWithFabric($handle: String!) {
productByHandle(handle: $handle) {
title
variants(first: 10) {
edges {
node {
id
title
metafield(namespace: "custom", key: "fabric_info") {
reference {
... on Metaobject {
field(key: "material") { value }
field(key: "careInstructions") { value }
field(key: "sustainabilityBadge") {
reference {
... on Metaobject {
field(key: "name") { value }
field(key: "icon") { value }
}
}
}
}
}
}
}
}
}
}
}
Salida Liquid:
{% assign fabric = variant.metafields.custom.fabric_info.reference %}
<div class="fabric-details">
<h4>Material y cuidados</h4>
<p><strong>Material:</strong> {{ fabric.field.material.value }}</p>
<div class="care-instructions">
{{ fabric.field.careInstructions.value }}
</div>
{% if fabric.field.sustainabilityBadge.reference %}
<span class="badge">
{{ fabric.field.sustainabilityBadge.reference.field.name.value }}
</span>
{% endif %}
</div>
Ejemplo 2: Testimonios sin una app externa
En lugar de una app de testimonios externa, puedes usar Metaobjects:
Tipo de Metaobject: "CustomerTestimonial"
Fields:
- customerName (Text)
- customerTitle (Text): "CEO de XYZ"
- testimonialText (Rich Text)
- rating (Integer): 1-5
- productLink (Link to Product)
- image (File): Foto de perfil del cliente
- datePublished (Date)
- featured (Boolean): Destacar en la página principal
Experiencia de administración: Tu equipo crea testimonios directamente en el Admin en Content → Metaobjects. Sin servicios externos, sin integraciones de API.
Consulta en la Storefront:
query GetFeaturedTestimonials {
metaobjects(type: "customer_testimonial", first: 10) {
edges {
node {
id
field(key: "customerName") { value }
field(key: "testimonialText") { value }
field(key: "rating") { value }
field(key: "featured") { value }
field(key: "image") { reference { ... } }
}
}
}
}
Ejemplo 3: Bundles de productos complejos
Un bundle con múltiples productos, descuentos escalonados y narrativa.
Tipo de Metaobject: "ProductBundle"
Fields:
- bundleName (Text)
- bundleDescription (Rich Text)
- bundleImage (File)
- products (List of Product Links): [Prod1, Prod2, Prod3]
- bundlePrice (Number): Precio de bundle opcional
- discountPercentage (Integer): 0-100
- validFrom (Date)
- validUntil (Date)
Liquid para la página de Bundle:
{% assign bundle = page.metafield.reference %}
<div class="bundle-card">
<h2>{{ bundle.field.bundleName.value }}</h2>
<img src="{{ bundle.field.bundleImage.reference.url }}" alt="Bundle">
<div class="bundle-products">
{% for product_link in bundle.field.products.value %}
{% assign product = product_link.reference %}
<div class="bundle-item">
<p>{{ product.title }}</p>
<span class="price">{{ product.priceRange.minVariantPrice.amount }}</span>
</div>
{% endfor %}
</div>
<div class="bundle-discount">
<strong>{{ bundle.field.discountPercentage.value }}% de descuento en el bundle</strong>
</div>
</div>
Rendimiento y mejores prácticas
Cuándo los Metaobjects son más rápidos que las apps
Las apps añaden latencia. Necesitan llamar a APIs externas, cachear datos y luego devolverlos a Shopify. Los Metaobjects son parte de Shopify — los datos son locales.
Comparación:
- Con App: Solicitud de storefront → Shopify → Servidor de app (100ms+) → Shopify → Navegador
- Con Metaobjects: Solicitud de storefront → Shopify → Navegador
Para datos consultados frecuentemente (descripciones de productos, atributos, certificaciones), los Metaobjects son significativamente más rápidos.
Escalabilidad
Los Metaobjects escalan excelentemente hasta más de 10.000 registros por tipo. Más allá de eso, deberías usar paginación:
query GetMetaobjects($first: Int, $after: String) {
metaobjects(type: "wine_profile", first: $first, after: $after) {
pageInfo {
hasNextPage
endCursor
}
edges {
node {
id
field(key: "title") { value }
}
}
}
}
Implicaciones SEO
Los datos estructurados son críticos para el SEO. Los Metaobjects te ayudan a generar schema markup limpio.
Ejemplo: Structured Data para producto con Wine Profile
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{{ product.title }}",
"description": "{{ product.description }}",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{{ wine_profile.field.tannine.value }}",
"reviewCount": "{{ reviews.size }}"
}
}
</script>
Los motores de búsqueda entienden mejor tus datos cuando están estructurados. Esto conduce a mejores rich snippets y mayores tasas de clics.
Errores comunes
Demasiados campos por Metaobject Problema: Mala UX de administración. Solución: Divide los Metaobjects grandes en varios más pequeños.
Sin paginación para grandes volúmenes Problema: Timeouts con más de 5.000 objetos. Solución: Usa paginación basada en cursor.
Referencias circulares Problema: Metaobject A referencia a B, B referencia a A. Solución: Establece una jerarquía clara.
Actualizaciones obsoletas de Metaobjects Problema: El admin cambia datos, el frontend muestra valores antiguos. Solución: Piensa bien las estrategias de caché (ISR con Next.js, TTL con Liquid).
Conclusión
Los Metaobjects no son solo una mejora técnica sobre los Metafields — cambian la forma en que piensas sobre la arquitectura de datos en Shopify. En lugar de mantener todo plano, ahora puedes definir tipos de datos estructurados y reutilizables.
Nuestra regla general tras años de práctica: Usa Metaobjects cuando tus datos tengan una estructura clara y se reutilicen múltiples veces.
¿Necesitas ayuda con la configuración? Hemos implementado Metaobjects en más de 50 proyectos — desde pequeños conjuntos de atributos hasta sistemas complejos de gestión de contenidos basados en Shopify. Escríbenos.
Sobre el autor
Claudio Gerlich es el fundador de smplx. y socio técnico de Shopify desde 2020. Con base en Munsterland, NRW, ha aportado su profundo conocimiento de la arquitectura de Shopify a cientos de proyectos — desde tiendas en fase inicial hasta negocios con ingresos de seis cifras. Le apasionan las soluciones técnicas elegantes que resuelven problemas de negocio reales.