/ Caso · Datos y herramientas para ecommerce

Catálogo de proveedores a Shopify

Una empresa de recambios de motor pidió una web nueva. La web estaba bien. La tienda no: tenía 192 productos de más de mil, porque cada proveedor manda su catálogo en un formato distinto y ninguno tiene API. Así que en vez de rediseñar construí la pieza que faltaba: una herramienta que lee cualquier fichero de proveedor, lo unifica, lo clasifica y le da a Shopify un fichero que puede importar.

Cliente
Empresa de recambios de motor, España
Plataforma
Shopify
Hecho con
Python, Streamlit, Admin API de Shopify
Rol
Diagnóstico, herramienta de datos y montaje de la tienda

Qué es esta página: el cliente queda en el anonimato, igual que sus proveedores y marcas. Las cifras salen de pasar la herramienta por los catálogos completos de los proveedores. El código lo escribí programando en pareja con Claude, como el resto de esta web: yo decidí qué construir y comprobé cada resultado contra los datos.

El proyecto en cifras

192productos en una tienda que debería tener más de 1.000
37.948productos de proveedores unificados en una tabla
0conflictos entre fuentes sin explicar
15sistemas del motor, asignados con reglas editables
37pruebas automáticas en cada cambio

Primero, para qué es la web

Antes de proponer nada pregunté para qué era la web: informar, vender o las dos cosas. Las dos. Eso apartó el rediseño y señaló la mitad que fallaba.

Formatos guardados por proveedor

La herramienta reconoce un fichero de proveedor por sus cabeceras. Un formato nuevo se describe una vez, se guarda como perfil y a partir de ahí se reconoce solo.

Reglas en una hoja de cálculo

Categorías, imágenes, IVA y márgenes están en CSV que se abren con Excel. Añadir un proveedor o una categoría es configurar, no programar.

Simula por defecto

El script que monta la tienda solo cuenta lo que haría. Escribe únicamente cuando se le dice, nunca borra y no guarda credenciales.

Actualizar solo precio y coste

Con los productos ya en la tienda, la herramienta compara con lo que hay y envía solo los cambios de precio y coste. Estado, textos y fotos se quedan como están.

Cambios probados con el catálogo completo

Cada cambio se pasó por el catálogo completo y se comparó producto a producto. Un arreglo que parecía obvio habría quitado 840 productos, así que no se hizo.

192 productos en la tienda de más de mil

El encargo era una web nueva. Al mirar la que tenían, no estaba mal, así que la pregunta útil era para qué la querían. La respuesta fue las dos cosas: presentar la empresa y vender. La parte de presentación funcionaba. La tienda tenía 192 productos cuando el catálogo pasa de mil, y ni siquiera esos 192 estaban bien: fallos en las categorías y enlaces del menú que no llevaban a ningún sitio.

La causa estaba antes de la web. Cada proveedor manda precios y referencias a su manera: hojas de Excel, exportaciones en CSV, catálogos en PDF, cada uno con columnas y nombres distintos para lo mismo. Ninguno ofrece API. Subir un producto a la tienda era copiarlo a mano del fichero que lo tuviera, y por eso la mayoría nunca llegó.

Productos en la tienda frente al catálogo

  • En la tienda192
  • En el catálogo del cliente+1.000

La decisión: mantener la web y la plataforma, y arreglar el proceso que alimenta la tienda. Un rediseño se habría visto más y no habría cambiado nada de los 192.

Lo que traen los ficheros de proveedores

Antes de diseñar nada pasé todas las fuentes de proveedores por la misma cadena y conté lo que salía. Los catálogos completos son mucho más grandes que lo que venderá la tienda (unos mil productos para empezar), lo que los convertía en una buena prueba de carga.

De las filas de los proveedores a las fichas de Shopify

Cinco fuentes juntas. Se descartan las filas que no son recambio de motor, se juntan las piezas repetidas y quedan fuera las que ninguna fuente da con precio.

  • Filas leídas110.492
  • Productos distintos37.948
  • Variantes listas para Shopify34.379
  • Fichas de producto34.339
Medido con los ficheros completosResultado
Productos distintos tras juntar todas las fuentes37.948
Listos para Shopify34.379 variantes en 34.339 fichas
Fuera porque ninguna fuente da precio3.569, listados en el informe con el motivo
Conflictos entre fuentes0 (si dos ficheros no coinciden, la herramienta dice qué fichero y qué fila)
Productos que llegan con foto, peso, código de barras o plazo0
Productos que llegan sin descripción36.514

Lo que significaba: la herramienta no podía limitarse a mover datos. Tenía que poner lo que nadie manda, como las imágenes o el aviso de disponibilidad, y decir con claridad lo que sigue faltando en vez de inventarlo.

Cómo funciona la herramienta

Una cadena en Python con una pequeña interfaz web local encima. Los ficheros entran tal como llegan; sale un fichero de importación para Shopify y un informe de calidad. Funciona igual con 200 productos que con 37.948. No hay servidor ni base de datos: todo corre en el ordenador de quien la usa y cada vez se empieza desde los ficheros.

  1. 01Leer

    Excel, CSV o PDF. Encuentra la cabecera aunque haya títulos encima y salta las cabeceras repetidas en cada página del PDF.

  2. 02Reconocer

    Compara las cabeceras con los perfiles de proveedor guardados. Un formato nuevo se describe una vez en la interfaz.

  3. 03Limpiar y juntar

    Normaliza referencias y precios, junta la misma pieza de varios ficheros y apunta cada desacuerdo.

  4. 04Clasificar y completar

    Traduce nombres, asigna uno de 15 sistemas del motor, datos del vehículo, una imagen genérica por tipo de pieza y variantes por medida.

  5. 05Escribir

    CSV de Shopify, una tabla maestra con el origen de cada dato y un informe en Excel de lo que necesita a una persona.

PiezaQué hace
Perfiles de proveedorUn fichero pequeño por formato: qué columna es la referencia, cuál el precio, si los precios llevan IVA, cómo escribe los decimales el proveedor.
Reescritura de nombresLos nombres en inglés llegan como "SUSTANTIVO,DETALLE". Se les da la vuelta y se traducen con un glosario de unas 270 expresiones: "GASKET,EXHAUST MANIFOLD" pasa a "Junta de colector de escape".
Sistemas del motor15 sistemas que siguen las categorías que ya tenía la tienda. Se asignan con reglas en orden en un CSV; 177 de 34.339 fichas siguen cayendo en "Otros".
Imágenes genéricasNingún proveedor manda fotos, así que cada tipo de pieza lleva una imagen genérica, marcada como orientativa en su texto alternativo: 22.211 fichas cubiertas.
InterfazCuatro pasos en el navegador, que se abre con doble clic: subir, revisar las columnas, elegir qué generar y descargar.
Script de montaje de la tiendaCrea los campos propios, una colección automática por sistema del motor y los enlaces del menú, con la Admin API de Shopify (GraphQL).

Decisiones pensadas para quien la usa

Quien la va a usar en el día a día no soy yo. Eso cambió más decisiones que cualquier limitación técnica.

DecisiónPor qué
Disponibilidad bajo consultaSin API de los proveedores no hay una cifra de stock fiable. Cada producto dice "consulta disponibilidad" con el teléfono de la tienda en vez de un "en stock" que nadie puede garantizar. El campo ya existe para cuando haya datos reales.
Imágenes por tipo de pieza, no por nombreBuscar la imagen por palabras del nombre añadiría 3.100 fotos más. Revisé una muestra: casi todas eran erróneas, como una tapa de bomba con la foto de la bomba entera. La opción existe, apagada.
Probar primero con una muestraUna primera importación de unos 33.000 productos se atascó. Desde entonces la herramienta genera muestras del tamaño que se quiera, repartidas entre familias, y puede repetir la misma para comparar el antes y el después.
Un modo aparte para actualizarReimportar todo con "sobrescribir" devolvería a borrador los productos publicados y vaciaría lo que se haya rellenado a mano. El modo actualizar lee la exportación de la tienda, empareja por SKU y envía solo las columnas que cambian.
Montaje seguro de la tiendaSimula salvo que se le diga lo contrario, mira lo que existe antes de crear nada, nunca borra, pide las credenciales al arrancar y usa una llave que caduca en 24 horas.
Avisar antes de elegirDos ficheros que no coinciden, la misma referencia con dos marcas, un perfil a punto de pisar otro: todo se le enseña a quien la usa en vez de decidirlo por su cuenta.

Reimportar todo con “sobrescribir”

Una celda vacía en el CSV borra el valor de la tienda.

  • Los productos publicados vuelven a borrador
  • Los textos y fotos puestos a mano se vacían
  • Cada fila se sube aunque no haya cambiado nada
Se descarta

Modo actualizar

Lee la exportación de la tienda, empareja por SKU y compara.

  • Solo cambian precio y coste, en un CSV de 7 columnas
  • Los productos nuevos van en un fichero aparte, como borrador
  • Estado, textos y fotos no se tocan
Lo que hace la herramienta

Incidencias y cómo se resolvieron

Casi todo lo de arriba existe porque antes algo salió mal. Donde la causa no se investigó, la tabla lo dice.

SíntomaCausaLección
Importación de ~33.000 productos atascadaSin investigar; se volvió a empezar por partes.Empezar por una muestra. De ahí salió el modo muestra.
~3.000 productos importados invisiblesNo estaban publicados en el canal de la tienda online.Publicar va ahora en la importación, como una columna más.
Las bombas de mano desaparecían"HAND" se traducía como "manual", y el filtro descarta los manuales de mantenimiento.Una traducción puede hacer saltar un filtro más adelante. Ahora es "de mano".
514 productos en "Otros"Faltaban reglas para cojinetes, retenes, mangueras, piezas hidráulicas y útiles de taller.Reglas nuevas y un sistema nuevo, Hidráulica: bajó a 177. El orden de las reglas importa.
12 productos con la foto de otroSin analizar; se encontraron revisando la tienda a ojo.Retiradas y comprobadas una a una: 124 de 188 productos con imagen, ninguno de los 12.
El script de montaje fallaba en WindowsEl Python del equipo se fiaba de un certificado caducado.Llevar los certificados (certifi) con la herramienta en vez de fiarse del equipo.
No se podía crear la app como antesShopify dejó de permitir apps personalizadas nuevas en el panel el 1 de enero de 2026.App creada en el Dev Dashboard con credenciales de cliente. Cada app pertenece a su tienda.
"0.206" kg leído como 206 kgUn punto seguido de tres cifras se tomaba como miles, como en las tarifas europeas.Encontrado al revisar el código, antes de que llegara ningún peso. Cada perfil indica ahora su formato de decimales.
El filtro encajaba dentro de otras palabras"RING" también encaja en "SPRING".Sin cambiar. Con palabras completas saldrían 840 productos, 420 de ellos muelles. Qué piezas se venden es una decisión de negocio, no un arreglo de código.

Lo que demuestra

AfirmaciónPrueba
Diagnóstico antes de proponerEl encargo era una web; el arreglo fue un proceso de datos. Los 192 frente a más de 1.000 lo decidieron.
Cada exclusión, listada37.948 productos de fuentes que no coinciden en formato, idioma ni datos, con cada exclusión y cada conflicto listados en vez de escondidos.
Segura para la tiendaMontaje que simula, sin borrados, sin credenciales guardadas, y un modo actualizar que no puede tocar estado, textos ni fotos.
Cada cambio, comprobado37 pruebas automáticas, y cada cambio comparado producto a producto con el catálogo completo antes de darlo por bueno.
Escalable sin tocar códigoProbada con 37.948 productos cuando la tienda empieza con unos mil. Un proveedor nuevo es un formato que se guarda una vez, y categorías, imágenes y márgenes son CSV. El mismo proceso sirve para una muestra de 200 o para el catálogo entero.
EntregadaUna interfaz de cuatro pasos, una guía de dos páginas para quien la usa, documentación completa y un repositorio privado con un commit por cambio.

Los datos de detrás: qué traen las cinco fuentes, contado campo a campo frente a lo que necesitan Shopify y Google, está en un estudio aparte: ¿Qué le falta a un catálogo de proveedor para Shopify?

/ Siguiente

¿Tienes un catálogo parecido?

Si tu tienda depende de ficheros de proveedores que no encajan entre sí, escríbeme y lo miramos.