Un catálogo, todos los canales de venta: Rozetka, Prom, Epicentr, Google y KeyCRM desde un solo hub
Una tienda que además vende en tres marketplaces y en Google mantiene cinco copias de su catálogo, y cada cambio de precio tiene que llegar a todas. El hub de Ezeden guarda un solo catálogo y habla el idioma de cada canal, sin borrar ni recrear nunca un anuncio que ya vende.
El reto
Ezeden vende en su propia tienda online y en otras cuatro plataformas: los marketplaces ucranianos Rozetka, Prom.ua y Epicentr, y Google Merchant Center, que lleva los productos gratis a la Búsqueda y a Shopping de Google. Cada marketplace ya tenía unos miles de anuncios de la tienda, creados a mano durante años, y cada plataforma quiere el catálogo a su manera. Los pedidos se gestionan en KeyCRM.
Mantener cinco copias del catálogo a mano significa precios que se quedan atrás, stock que se vende dos veces y anuncios que dejan de coincidir. El objetivo: un único catálogo en el hub que alimente todos los canales, sin borrar ni recrear nada en los marketplaces.
Cada marketplace en su idioma
Un marketplace solo acepta un anuncio con sus propios identificadores. Cada noche el hub descarga las categorías, características y valores permitidos de cada plataforma y los guarda por versiones, así que el responsable ve exactamente qué ha añadido, renombrado o quitado la plataforma.
La correspondencia traduce el catálogo a esos identificadores en tres niveles: categoría a categoría, característica a característica y valor a valor.
Una categoría puede dividirse: los fregaderos de granito pueden ir a una categoría de Rozetka y los de acero a otra, según el valor de una característica. Las unidades y los formatos también son reglas: los milímetros pasan a centímetros, y una regla que no puede convertir la unidad se rechaza al guardarla.
Una característica puede alimentar dos. Epicentr pide un color básico y el color del fabricante, y los dos salen del mismo color del catálogo. Un campo que la plataforma exige y que el catálogo no recoge, como “para cocina” en todos los grifos de cocina, se fija una vez por categoría como valor fijo.
Cada producto tiene un estado de preparación por marketplace: sin categoría, con una característica obligatoria vacía o con un valor sin equivalente, no sale. Si una plataforma elimina una entrada, las correspondencias que la usaban pasan a una cola de correspondencias rotas.
Un asistente de IA para la correspondencia
El asistente hace la primera pasada. Preselecciona las entradas de la plataforma cuyos nombres se parecen a los del catálogo, en todos los idiomas que tiene el catálogo. Un nombre idéntico, o una correspondencia ya confirmada en otra parte del mismo canal, se propone como segura, y el responsable las confirma todas con un botón. Cuando varios nombres solo se parecen, un modelo de IA elige uno, siempre de la preselección, o indica que ninguno encaja. Con listas de prueba emparejó valores entre idiomas: el “круглая” en ruso del catálogo con el “Кругла” en ucraniano de Rozetka.
Cada propuesta se confirma una sola vez; a partir de ahí la correspondencia se aplica a todos los productos sin volver a consultar al modelo.
Vincular los anuncios que ya venden
Los anuncios de los marketplaces se crearon a mano durante años y ya venden. Recrearlos tiraría ese trabajo, así que el hub sigue una regla: vincular, nunca recrear. Lee lo que vende cada plataforma, por API o desde la exportación de la cuenta de vendedor, y empareja cada anuncio con un producto:
- el SKU de la tienda en el campo de código del vendedor, la referencia del fabricante o el código de barras deciden la vinculación;
- una referencia dentro del nombre del anuncio, o los códigos de modelo del nombre, solo la proponen.
Todo lo dudoso, como dos claves que apuntan a productos distintos o dos anuncios para un mismo producto, espera en Por revisar con el motivo. Solo las coincidencias seguras se vinculan en bloque, y quien prefiera una hoja de cálculo puede exportar la lista, rellenar los SKU y subirla con las mismas comprobaciones.
La única escritura de esta parte es en Prom.ua: a petición del responsable, el hub pone el SKU de la tienda como identificador externo del anuncio y luego lee la plataforma para confirmarlo.
Precios y stock: enviado, aceptado, mostrado
Una vez vinculado, el anuncio recibe su precio y su stock de las reglas de precios y del registro de existencias del hub.
Cada actualización lleva cifras absolutas, nunca diferencias: “el precio es X, el stock es Y”, con un número de versión. Por eso repetir un envío no hace daño, y uno antiguo que llega tarde se descarta.
Un cambio llega a las plataformas rápido, unos 30 segundos después, pero agrupado, así que una importación que cambia cinco mil existencias se convierte en una sola actualización por canal. Una revisión cada cinco minutos recoge lo que ningún evento avisa, como una promoción que empieza a medianoche.
Que la plataforma acepte un precio no significa que lo muestre. Por eso, para cada anuncio la pantalla muestra tres cifras: lo que quiere el hub, lo que aceptó la plataforma y lo que muestra de verdad al volver a leerla. Rozetka, por ejemplo, retiene para revisión de su propio personal un precio que sube más de 1,5 veces o baja a menos de la mitad. La llamada sale bien igualmente, así que el hub marca esos anuncios como pendientes de la plataforma hasta que la lectura lo aclara.
Todo el flujo es seguro por diseño: nunca se envía un precio cero, todo stock pasa por el margen de seguridad del canal y un producto que debe dejar de venderse recibe stock cero. Nada borra ni oculta un anuncio.
Los rechazos van a una cola de errores con las palabras de la propia plataforma.
Nuevos anuncios por reglas
Qué productos debe tener cada marketplace lo deciden unas reglas de publicación por marca, categoría o proveedor, con condiciones como correspondencia completa, stock o foto. Las condiciones solo deciden si se crea un anuncio nuevo, y una regla puede esperar al responsable en los dos sentidos, de modo que restringir una regla nunca retira anuncios sin que nadie lo vea. Las fichas salen por API, como feed o como archivo para subir, según la plataforma.
Google Merchant Center
Las fichas gratuitas de Google muestran productos en la Búsqueda y en Shopping, cada uno con enlace a la página de la tienda. El hub genera el feed a partir de la tienda: título, descripción, fotos, el precio y la disponibilidad de la propia tienda (Google rechaza una oferta cuyo precio no coincide con su página), la categoría de la taxonomía de Google, marca, código de barras o referencia, el grupo de colores y todas las características. Un producto cuenta como publicado cuando Google ha descargado el archivo.
Pedidos y KeyCRM
El hub consulta los pedidos de cada marketplace y los registra igual que los de la tienda, con los precios de la plataforma: un pedido de marketplace es un hecho, no una petición. Una línea sin producto se guarda en vez de perderse, y la falta de stock va a la cola del responsable en lugar de anular el pedido.
Cada pedido pasa a KeyCRM nada más hacerse; si el CRM no responde, espera en una cola y se reenvía solo. De vuelta llegan estados, albaranes de envío, tickets fiscales y marcas de pago. Un mapa de estados en el panel dice qué estado del CRM equivale a cuál del hub, y un ajuste decide qué estado manda. Los clientes también se sincronizan, con una cola de conflictos para las coincidencias dudosas.
Estado de los canales y un arranque prudente
La pantalla de estado de los canales muestra, por plataforma, si acepta el token, cuándo funcionó y falló por última vez cada intercambio y qué está pendiente. Los tokens se comprueban cada seis horas, lo que además mantiene vivo el de Rozetka, que desactiva un token sin uso durante 24 horas. “La clave fue rechazada” y “la plataforma no respondió” se avisan por separado, porque solo lo primero necesita a una persona.
Para arrancar con calma, cada escritura en un canal puede esperar la confirmación del responsable mientras las lecturas siguen funcionando.
Stack tecnológico
- Hub: Laravel 13 + Inertia + React 19 + Ant Design
- Conectores: Rozetka, Prom.ua, Epicentr, Google Merchant Center, KeyCRM
- Correspondencia con IA: Anthropic Claude, solo dentro de una preselección por nombre
- Tareas en segundo plano: Laravel Horizon sobre Redis 7, con límite por plataforma
- Datos: MySQL 8.4; los feeds los sirve el propio hubResultado
La tienda mantiene un solo catálogo. Desde él llegan precios, stock, fichas y pedidos a Rozetka, Prom.ua, Epicentr, Google y KeyCRM, cada cifra se comprueba después de enviarla y los anuncios que ya vendían conservan su historial.



