← Volver al portafolio
Repuestolandia
Caso · Automatización e-commerce · Brasil → Chile

Una tienda de repuestos en piloto automático

Repuestolandia es mi tienda Shopify de repuestos importados desde Brasil. La manejo solo, así que construí un sistema con n8n, la API de Gemini y un servidor Linux de 5 USD al mes que hace el trabajo pesado por mí: catálogo, traducción, filtros, precio con envío incluido, colecciones, metacampos, stock y registro de cada venta. El único paso manual es correr el scraper; desde ahí, todo lo hace n8n.

Tomás Venegas Osses · Fundador, Repuestolandia SpA · LinkedIn
5 USDal mes de infraestructura
24/7n8n en Docker sobre Linux
~4kproductos scrapeados
3workflows en producción

El problema

En Chile, conseguir ciertos repuestos es difícil: piezas específicas para Jeep o Fiat que no están en las tiendas locales o que cuestan mucho más de lo razonable. En Brasil, en cambio, esas mismas piezas se consiguen con facilidad, porque muchos de estos modelos se fabrican y se venden allá. Ahí vi la oportunidad de Repuestolandia: traer directamente desde Brasil los repuestos difíciles de encontrar.

El desafío era la operación. Cada producto viene en portugués, con precio en reales y sin peso ni medidas, y el stock del proveedor cambia sin aviso. Publicar y mantener miles de productos a mano habría requerido un equipo que no tenía. Por eso decidí automatizar todo lo posible desde el primer día, para que un negocio de una sola persona pudiera operar como uno mucho más grande, con costos mínimos.

En 30 segundos

¿Qué hacen las automatizaciones que construí?

1

Arma el catálogo solo.

Toma los productos de Brasil, los traduce, calcula cuánto cuesta traerlos y los publica en la tienda con su precio final.

2

Evita vender lo que no hay.

Cada vez que alguien compra, revisa si el proveedor todavía tiene el producto. Si se agotó, lo saca de la venta.

3

Lleva la cuenta de cada venta.

Registra automáticamente cada pedido con sus costos y deja una planilla para seguir el paquete hasta que llega al cliente.

Arquitectura

Esta es la foto completa antes de entrar en detalle. Todo corre en un solo servidor: Google Sheets funciona como base de datos intermedia () y como libro de ventas, orquesta cada paso, y Shopify guarda los datos estructurados de cada producto.

Arquitectura de RepuestolandiaDel scraper a Shopify; cada venta dispara en paralelo el chequeo de stock y el registro de ventas. Scraper en ChromeÚnico paso manualGoogle SheetsCatálogo crudoWorkflow 1 · n8n + GeminiTraduce, filtra y pone precioShopifyCliente hace un pedidoWorkflow 2 · stockSi se agotó, inventario 0Workflow 3 · ventasFila con costos en SheetsArma el catálogoCorre con cada venta
Cada venta en Shopify dispara los workflows 2 y 3 en paralelo.

Ubuntu en · Compose · proxy reverso con HTTPS (Let's Encrypt) · subdominio propio vía Cloudflare DNS

Antes y después de un producto

Así llega un producto desde la web del proveedor (una fila en Google Sheets) y así queda publicado en Shopify después de pasar por y .

Fila scrapeada · Google Sheets
titulo_br: Farol Dianteiro Esquerdo Jeep Renegade 2016 2017 2018 Original 51953126
precio_br: R$ 1.250,00
link: autorizadapecas.com.br/…
imagen: og:image de la ficha
Producto en Shopify
Título
Foco delantero izquierdo Jeep Renegade 2016–2018 (: 51953126)
Estado IA
APROBADO · tamaño Media
Peso
2,4 kg real → 4,32 kg cobrable (×1,8)
Flete int.
R$133 + R$58,7 × 4,32 = R$386,58
51953126
Etiquetas
JEEP
link_brasilcosto_brlcosto_total_landed_clp+4

Ejemplo ilustrativo: los campos y cálculos son los que genera el flujo; el producto y su peso son de muestra.

Los tres workflows

Ahora, paso a paso: qué hace cada , qué problema resuelve y cómo lo construí.

1 · Catálogo: Google Sheets → IA → Shopify

~4.000 productos · traducción · filtros · envío · precio
  • Inicio manual
  • Leer Sheets
  • Code: diccionario PT→ES
  • Gemini (JSON)
  • Code: parser
  • If: ¿rechazado?
  • Code: costo landed
  • Filter
  • Sheets "salida"
  • Wait
  • POST producto
Captura del workflow Product Catalog Automation en n8n
Product Catalog Automation, en . Los nodos desactivados los uso para pruebas: limitar a pocos productos, probar filtros y pausas.

Crear miles de productos a mano no era viable, así que el proceso parte con un script de JavaScript que corro en la consola de Chrome. Con fetch + DOMParser recorre todas las páginas del buscador del proveedor y extrae título, precio en BRL, link e imagen, que pego en Google Sheets. Es el único paso manual de todo el sistema. Lo hice en dos fases (primero el listado, después cada ficha, leyendo la imagen desde og:image) porque en el listado se mezclaban las imágenes de productos vecinos.

Pero ese dato crudo todavía no sirve para vender en Chile: el título viene en portugués y no dice cuánto pesa ni para qué auto es. Ahí entra , que devuelve un estructurado con el título traducido con terminología chilena, una descripción HTML, el número , las marcas compatibles, el peso estimado, el tamaño y un estado. Antes de llegar a Gemini, un nodo Code aplica mi propio diccionario de unos 100 términos técnicos PT→ES, para que una misma pieza se llame igual en todo el catálogo.

Antes · dato
  • Título en portugués, sin traducir
  • Precio en reales (BRL)
  • Sin peso, tamaño ni clasificación
Después · JSON de Gemini
  • Título traducido (terminología chilena)
  • Descripción HTML + número OEM
  • Marcas compatibles detectadas
  • Peso y tamaño estimados
  • Estado: aprobado, rechazado o cotizar

Filtro de productos

No todo se puede o conviene traer por correo: motores completos, cajas de cambio, piezas usadas o fluidos inflamables. Gemini clasifica cada producto por peso y riesgo, pero a veces fallaba: se colaron motores completos con precios de millones. Por eso agregué un respaldo : una lista de palabras prohibidas en portugués que fuerza el rechazo sin depender del criterio de la IA.

Filtro de productosGemini clasifica cada producto y una regla fija de palabras prohibidas fuerza el rechazo; el resultado es rechazado, cotizar o aprobado. Producto scrapeadoGemini clasificaPeso, tamaño y riesgoRespaldo determinísticoPalabra prohibida: rechazo forzadoRechazadoMotores, cajas, usadosCotizarMás de 25 kg o 120 cmAprobadoFlete por Factor KCriterio de la IARegla fija

Cómo se arma el precio

Con eso, cada producto aprobado recibe su precio. La idea es que cubra todo lo que cuesta traer la pieza, así que primero calculo el : (costo BRL + flete interno) × tipo de cambio + flete internacional volumétrico + (IVA + arancel sobre el ). Sobre ese costo aplico mi margen.

Cómo se arma el precioBarra apilada: producto, flete interno, flete internacional y provisión aduanera forman el costo landed; encima va el margen. Precio de ventaTu margenSobre el costo landedProvisión aduaneraIVA + arancel sobre el CIFFlete internacionalPeso cobrable × Factor KFlete internoProveedor → casa del socioProductoPrecio BRL × tipo de cambioCosto landedTodo lo que cuestatraer la piezaProporciones ilustrativas

Estimación del envío por producto

El envío es lo más difícil de estimar: los proveedores no publican peso ni medidas, y Correios cobra por peso volumétrico, es decir, también por el espacio que ocupa la caja. Por eso Gemini estima el peso real y clasifica el tamaño de la pieza, y con eso calculo el y el flete internacional:

peso cobrable = peso real × Factor Kflete = R$133 fijo por paquete + R$58,7 × kg cobrable
¿Qué es el Factor K?

Es un multiplicador según el tamaño de la pieza: las piezas grandes ocupan más espacio en el envío aunque pesen poco, así que se les cobra como si pesaran más. Es la forma de aproximar el peso volumétrico sin medir cada paquete.

TamañoEjemplosFactor K
AltaParrillas, parachoques, tableros× 3,5
MediaFocos, mangueras, espejos× 1,8
BajaDepósitos, sensores, pernos× 1,1

Calibré la fórmula con boletas reales de envíos por Correios. Además, a propósito, aplico el costo fijo completo a cada producto, aunque en la práctica varios viajan en un mismo paquete. Es un criterio conservador: prefiero sobrestimar el envío, y al consolidar paquetes el margen real sale mejor.

Prueba tu propio cálculo

Usa la fórmula real del workflow: cambia el peso y el tamaño y mira cómo se calculan el peso cobrable y el flete.

Tamaño
Peso cobrable 4,32 kg
Flete internacional (Brasil → Chile)
R$386,58 ≈ $66.780 CLP · US$70,29

Esto es solo el flete internacional — no incluye el valor del producto ni impuestos. Conversión a CLP/USD referencial, no en tiempo real.

2 · Chequeo de stock con proveedores

se dispara con cada venta
  • Pedido creado
  • Split por producto
  • Leer metacampo link_brasil
  • GET ficha en Brasil
  • ¿"Esgotado"?
  • Token OAuth fresco
  • Obtener variante
  • Inventario = 0
Captura del workflow Inventory Validation en n8n
Inventory Validation, en n8n

Vendo bajo pedido: no tengo stock propio, y el proveedor puede quedarse sin una pieza sin avisarme. Sin un control, podría vender algo que no puedo entregar.

Para evitarlo, un Shopify Trigger activa este workflow con cada pedido creado. El workflow separa el pedido por producto (Split Out), lee el link_brasil y hace un GET a la ficha del proveedor buscando la palabra "Esgotado" (agotado). Si la encuentra, pide un nuevo, obtiene la variante y deja el inventario en 0 en Shopify. Un detalle que aprendí en el camino: la búsqueda corta el HTML antes de la sección "Produtos relacionados", porque los productos relacionados agotados daban falsas alarmas.

3 · Registro de ventas y seguimiento → Google Sheets

se dispara con cada venta
  • Pedido creado
  • Split por producto
  • Leer metacampos de costo
  • Code: desglose y márgenes
  • Code: formato de fila
  • Sheets: fila de venta
Captura del workflow Registro de Ventas Google Sheets en n8n
Registro de Ventas Google Sheets, en n8n

En cada venta necesito saber cuánto costó realmente traer el producto, cuánto gané y en qué parte del viaje va el paquete. Hacerlo a mano en cada pedido es lento y propenso a errores.

Por eso, con cada pedido, el workflow separa los productos, lee los metacampos de costo con la de Shopify y, con dos nodos Code, arma el desglose y le da formato a la fila. Después la agrega (append) al libro de contabilidad en Google Sheets, con el producto, el link del proveedor, los datos del comprador y el desglose completo del precio. Lo clave: no recalcula nada, porque usa los costos que el workflow 1 ya guardó en cada producto.

Desglose de cada venta

ColumnaDe dónde sale
Costo del producto (BRL y CLP) y tipo de cambioMetacampos del producto
Envío Brasil → casa del socioFlete interno del proveedor
Envío Brasil → ChileFlete volumétrico (Factor K)
Provisión aduaneraIVA + arancel sobre el CIF
Precio de ventaPedido de Shopify
Nombre, correo y teléfono del clientePedido de Shopify

Seguimiento del pedido

La misma fila sirve para seguir el pedido. El workflow la crea al momento de la venta, y yo completo la fecha de cada tramo a medida que avanza el paquete:

  1. Ventaautomático
  2. Compra en Brasilfecha y hora
  3. Llega a casa del sociofecha
  4. Socio lo envía a ChileCorreios
  5. Llega a mi casaaduana lista
  6. Enviado al clienteentrega final

Shopify como base de datos: etiquetas y metacampos

No solo publico productos. Cada ficha queda con datos estructurados que ordenan la tienda sola y alimentan a los otros .

Etiquetas → colecciones automáticas

Quería que alguien con un Jeep encontrara rápido las piezas para su auto. Por eso extrae del título las marcas compatibles como un arreglo (solo las que aparecen, nunca las inventa) y cada marca se guarda como etiqueta. Así, las colecciones inteligentes de Shopify (Jeep, Fiat, RAM…) se llenan solas, y una pieza compatible con varias marcas aparece en todas sus colecciones.

JEEPFIATRAMCOTIZAR

La etiqueta COTIZAR marca las piezas grandes o pesadas. En vez de sacarlas del catálogo, se publican como borrador con un aviso para cotizar el envío caso a caso.

Variante lista para operar

El producto se crea con un HTTP Request directo a la REST de Shopify, no con el nodo nativo de , porque ese nodo no permitía controlar la variante completa (precio, peso y ). Así cada producto queda listo para vender:

  • SKU = número , que también va en el título para mejorar la búsqueda, porque muchos clientes buscan la pieza por ese número.
  • Peso real en kg.
  • Inventario gestionado por Shopify. Como vendo bajo pedido, cada producto parte disponible, y el workflow 2 lo baja a 0 si el proveedor se queda sin stock.

Metacampos por producto

Los son campos extra que Shopify guarda en cada producto, como notas pegadas a la ficha. Cada producto se publica con siete: el link del proveedor y todo el desglose de costos. Definí cada uno en Shopify para que se vean en el panel de administración.

MetacampoTipoPara qué sirve
custom.link_brasilURLLink a la ficha del proveedor. Lo usa el workflow 2 para revisar el stock.
repuestolandia.costo_brlTextoPrecio de compra en reales
repuestolandia.tipo_cambioTextoTipo de cambio BRL→CLP usado al calcular
repuestolandia.costo_producto_clpTextoCosto del producto convertido a pesos
repuestolandia.flete_internacional_clpTextoFlete Brasil→Chile según
repuestolandia.provision_aduanera_clpTextoProvisión de IVA + arancel
repuestolandia.costo_total_landed_clpTextoCosto total puesto en Chile. Con él, el workflow 3 calcula los márgenes de cada venta.

Con esto, cada pedido ya trae su desglose de costos sin volver a calcular nada: el workflow 2 usa el link para revisar el stock, y el workflow 3 pasa los costos directo a la contabilidad.

Lo que aprendí resolviendo bugs

Emparejamiento de items en n8n

Al principio, el mezclaba datos: un producto quedaba con el precio o la imagen de otro. La causa era que referenciaba los datos entre nodos por índice, y cuando un Filter o un If descartaba items, los índices dejaban de coincidir. Lo resolví usando el rastreo de items de (.item), que sigue a cada producto a través de toda la cadena.

La IA no basta sola

clasifica bien casi siempre, pero en e-commerce un solo error cuesta caro, como publicar un motor completo a precio de repuesto. Aprendí a no depender solo de la IA: toda decisión crítica tiene además una regla de respaldo.

Permisos, tokens y metacampos

Conectarme a la de Shopify me enseñó cosas que no salen en los tutoriales: la app necesita scopes específicos (como write_inventory) para modificar el inventario, conviene pedir un token nuevo en cada ejecución para que no expire, hay que agregar pausas entre llamadas para no superar el , y los solo aparecen en el panel si antes creas su definición.

Costo mínimo, control máximo

Elegí n8n en vez de un SaaS que cobra por ejecución. Con un servidor de 5 USD al mes puedo correr flujos ilimitados, y lo único que pago por uso es la API de Gemini.

Planeo seguir haciendo crecer este proyecto — vienen muchas cosas más.

Esto es solo el comienzo.

Conversemos

Si quieres conversar sobre una oportunidad, un proyecto o simplemente saludar, escríbeme.