Un producto en Pampling vive simultáneamente en 3 sistemas, con responsabilidades claras:
| Sistema | Rol | Source of truth |
|---|---|---|
| Odoo | PIM + ERP. Stock, precios, datos básicos del producto. | Sí, para producto y stock |
| Shopify | Catálogo público + carrito + checkout. Recibe sync de Odoo. | Para presentación en tienda |
| Sanity | Contenido editorial (banners PDP, traducciones de textos largos). Recibe sync de Shopify vía Sanity Connect. | Para contenido editorial |
| PostgreSQL (backoffice) | Reseñas, favoritos, contenido custom referenciado al producto por GID. | No es source — referencia |
Odoo (IT)
│
│ (sync IT — fuera del alcance de la web)
▼
Shopify (catalogo público)
│
│ (Sanity Connect — sincroniza product + collection;
│ NO productVariant por cuota)
▼
Sanity (dataset develop / production)
Cada producto en Shopify debe seguir las convenciones de Tailor para que la web funcione:
Color, Size, Target gender.filter:<categoría>:<valor> para filtros.custom para agrupación parent/child.Guía completa: Alta de productos en Shopify
{
_type: "product",
store: {
id: "gid://shopify/Product/15432800207179",
title: "Camiseta Friends Iconic",
slug: "friends-iconic",
isDeleted: false,
status: "active",
vendor: "Pampling",
tags: ["filter:base-color:azul", ...],
options: [{name: "Color", values: ["Blue Denim"]}, ...]
},
// Campos editoriales añadidos por marketing en Studio:
pdpContent: { reference a otro doc },
shortDescription: "...",
careInfo: "...", // Contenido del acordeón "Cuidado camisetas"
additionalInfo: "...", // Contenido del acordeón "Información adicional"
seoTitle: "...",
seoDescription: "..."
}
productVariant desactivadoSanity Connect puede sincronizar también productVariant (un doc por variante). Está desactivado porque:
_type == "collection": una collection de Shopify. Sincronizada también._type == "pdpContent": contenido editorial enriquecido que se asocia a un producto (bloques de imágenes, vídeos, gráficos)._type == "plpFeed": feed de productos custom para PLPs (ej. "Más vendidos del mes").El backoffice no tiene su propia tabla products. Cuando necesita referirse a un producto, usa el GID de Shopify como varchar.
Ejemplo: tabla reviews:
content_id VARCHAR(...) -- p.ej. "gid://shopify/Product/15432800207179"
Tabla favourites:
item_id VARCHAR(...) -- mismo formato
Esto significa:
| Tipo de agrupación | Dónde se define | Cómo se usa |
|---|---|---|
| Categoría principal | Colección Shopify | Camisetas, Sudaderas, Calcetines, etc. |
| Subcategoría | Colección Shopify | Manga corta, Manga larga, Oversize, etc. |
| Temática | Colección Shopify + tag | Manga, Gatos, Videojuegos, etc. |
| Filtros adicionales | Tags filter:* |
base-color, fit, stamping-area, design, designer |
URL resultante: /camisetas/manga-corta/videojuegos (compuesta por la jerarquía de colecciones).
pampling-staging.myshopify.com los productos tienen vendor = "Pampling-dev" (residuo del seed de Tailor).pampling-com.myshopify.com los productos deben tener vendor = "Pampling".vendor → hay que actualizarlas al cambiar de tienda.| Acción | Disparador |
|---|---|
| Producto nuevo en Shopify | Sanity Connect lo crea en el dataset destino |
| Producto editado en Shopify | Sanity Connect actualiza el documento |
| Producto eliminado en Shopify | Sanity Connect marca store.isDeleted = true (soft delete) |
| Documento editado en Sanity | NO se replica a Shopify (Sanity es lectura unidireccional desde Shopify) |
| Stock cambia en Odoo | Cuando Odoo→Shopify lo sincroniza, Shopify Storefront API lo expone en tiempo real al storefront. No pasa por Sanity. |