Una de las tareas más pesadas en e-commerce siempre es la misma: enlazar el catálogo de un proveedor con tu tienda. Los ficheros suelen llegar en CSV, cada uno con sus propias reglas: columnas con nombres distintos, el stock en un archivo separado, categorías jerárquicas que no encajan a la primera… un pequeño laberinto.
En este artículo te muestro cómo hacerlo con Lovecherry. Da igual si usas ShopinCloud, Prestashop o cualquier otra plataforma: lo que verás es la lógica básica para poner orden y no perderte en el intento.
1. Categorías: ordenar el árbol
Lovecherry entrega un CSV con las categorías, pero las columnas vienen con nombres como id categoria o id padre . Lo primero es renombrarlas a algo claro, tipo id
y parent_id
. Con eso puedes reconstruir fácilmente el árbol jerárquico con una función sencilla.
El resultado: un diccionario en el que cada categoría sabe quién es su madre y cuál es su nombre. Así, cuando cargues los productos, tu cliente verá que un Body encaje está en Lencería > Bodies y no perdido en un listado de números.
2. Productos y stock: unir piezas
Aquí viene otra parte clave. Los productos van en un CSV y el stock en otro. Para complicarlo un poco más, el stock puede depender de combinaciones de talla o color.
Si no unes bien esos dos ficheros, te encontrarás con productos sin stock o stock que no sabes a qué variante pertenece.
La solución es clara: haz un join por idProducto
y idCombinacion
. Así cada producto se enriquece con el stock real que le corresponde.
3. Dar sentido al producto
Cuando ya tienes producto + stock, toca añadir la categoría principal. Lovecherry mete varias en un campo separado por #
. Lo práctico es quedarte con la primera como principal y después añadirle el nombre de esa categoría para que tu sistema lo entienda.
Al final tendrás un JSON ordenado con campos básicos: idProducto
, nombre
, precio
, stock
, category_id
y category
.
4. Ejemplo de salida
[
{
"idProducto": "12345",
"nombre": "Body encaje Luna",
"precio": 29.95,
"stock": 14,
"category_id": "12",
"category": "Lencería > Bodies"
},
{
"idProducto": "12346",
"nombre": "Lubricante Aloe 100ml",
"precio": 7.90,
"stock": 120,
"category_id": "22",
"category": "Bienestar > Lubricantes"
}
]
No es el JSON real, pero sirve para visualizar lo que deberías conseguir.
5. Errores típicos y cómo evitarlos
- Encoding: a veces los acentos se rompen. Forza UTF-8.
- Columnas que cambian de nombre: hoy es “Id producto”, mañana “id producto”. Ten un mapa de alias preparado.
- Categorías vacías: pon una por defecto (Uncategorized) y evitas errores.
- Stock nulo: si no hay datos, decide si lo interpretas como 0 o lo dejas vacío.
- Archivos enormes: procesa por partes o usa caché.
6. Checklist rápido
- Variables de entorno para las URLs de Lovecherry (nunca hardcodees).
- Cachear los CSV para no descargarlos una y otra vez.
- Validar precios y stocks (que sean números reales).
- Guardar logs: cuántos productos entran y cuántos se descartan.
7. ¿Y ahora qué?
Con el JSON limpio ya puedes:
- Importar productos en tu tienda.
- Pasarlos a una cola de procesos en segundo plano.
- Filtrar categorías que no te interesen.
- Aplicar reglas de márgenes o impuestos.
Lo bueno es que este patrón no se limita a Lovecherry. Con pequeños ajustes (URLs y nombres de columna) sirve para cualquier otro proveedor que use CSV.
Para terminar
Trabajar con proveedores externos siempre pasa por lo mismo: normalizar datos, unir CSV y acabar con una estructura limpia. Si controlas esos tres pasos, tu tienda —sea ShopinCloud o cualquier otra— funcionará sin sobresaltos.
Ejemplo en código con Shopping Cloud
{% set file = 'URL_CATEGORIAS' %}
{% set csvCategories = sh().read_csv(file) %}
{% set csvCategories = sh().arrays_replace_key("id categoria","id",csvCategories) %}
{% set csvCategories = sh().arrays_replace_key("id padre","parent_id",csvCategories) %}
{% set categoriesPaths = sh().buildTreeInOneLevel(csvCategories, 2, 'parent_id', 'id', 'nombre') %}
{% set file = 'URL_PRODUCTOS' %}
{% set csvProducts = sh().read_csv(file) %}
{% set file = 'URL_STOCK' %}
{% set csvStocks = sh().read_csv(file) %}
{% set csvStocks = sh().arrays_replace_key("Id producto","idProducto",csvStocks) %}
{% set csvStocks = sh().arrays_replace_key("Id combinacion","idCombinacion",csvStocks) %}
{% set csvProducts = sh().unionArraysByKeys(csvProducts, csvStocks, ['idProducto','idCombinacion']) %}
{% set newData = [] %}
{% for row in csvProducts%}
{% set categoryID = row.categorias|split('#')|first%}
{% set newItem = row|merge({'category_id':categoryID,'category': categoriesPaths[categoryID]['nombre'] }) %}
{% set newData = newData|merge([newItem]) %}
{% endfor %}
{{ newData|json_encode }}