DataFirefly Odoo Connector — guía de instalación y configuración
Conecta Shopware 6.6 / 6.7 a Odoo 12 → 18 mediante XML-RPC nativo. Instalación, configuración de la clave API, direcciones de sincronización, tareas programadas y solución de problemas.
Esta guía cubre la instalación, configuración y operación diaria del plugin DataFirefly Odoo Connector para Shopware 6.6 y 6.7. Al final, tu tienda estará sincronizando productos, stock, clientes y pedidos con tu instancia Odoo mediante XML-RPC nativo, sin dependencias externas ni sobrecoste de API de terceros.
Presentación
El plugin establece un puente bidireccional entre Shopware y Odoo hablando directamente el protocolo XML-RPC de Odoo (estable desde la versión 8). Sin módulo que instalar del lado de Odoo, sin middleware de pago, sin SaaS intermediario.
| Entidad | Odoo → Shopware (pull) | Shopware → Odoo (push) |
|---|---|---|
| Productos (product.template) | ✅ | ✅ |
| Stock (qty_available / free_qty) | ✅ | — |
| Categorías (product.category) | ✅ | ✅ |
| Clientes (res.partner) | — | ✅ con direcciones subordinadas |
| Pedidos (sale.order) | — | ✅ con confirmación y factura opcionales |
Requisitos
- Shopware 6.6.x o 6.7.x (todas las versiones menores).
- PHP 8.2, 8.3 o 8.4.
- Extensiones PHP: curl, xml, simplexml (presentes por defecto en casi todos los alojamientos).
- Odoo 12, 13, 14, 15, 16, 17 o 18, Community o Enterprise. Odoo.sh, Odoo Online (SaaS) e instancias auto-alojadas funcionan igual.
- Un usuario Odoo dedicado a la API (recomendado) con derechos de lectura/escritura sobre los modelos utilizados (product.template, product.product, res.partner, sale.order, stock.warehouse, product.category, res.country, account.tax).
Instalación
Mediante subida en la administración
- Descarga
DfOdooConnector-v1.0.0.zipdesde tu cuenta de cliente. - En la administración Shopware: Extensiones → Mis extensiones → Subir extensión.
- Selecciona el ZIP y haz clic en Instalar.
- Activa la extensión con el interruptor.
Mediante consola SSH
cd /ruta/a/shopware
cp DfOdooConnector-v1.0.0.zip custom/plugins/
cd custom/plugins && unzip DfOdooConnector-v1.0.0.zip
sudo -u www-data setsid php bin/console plugin:refresh
sudo -u www-data setsid php bin/console plugin:install --activate DfOdooConnector
sudo -u www-data setsid php bin/console cache:clear
Recompila la administración para cargar el módulo Vue 3:
sudo -u www-data setsid php bin/build-administration.sh
df_odoo_mapping (correspondencias persistentes Shopware ↔ Odoo) y df_odoo_log (registro de operaciones). No se modifica ninguna tabla existente.
Configuración del lado de Odoo
Crear un usuario dedicado
Se recomienda encarecidamente crear un usuario Odoo dedicado a la integración en lugar de usar una cuenta de administrador personal. Esto permite auditar con precisión las acciones del conector y revocar su acceso independientemente.
- En Odoo: Ajustes → Usuarios y empresas → Usuarios.
- Crea un usuario llamado por ejemplo
Shopware Bridge. - Dale los derechos necesarios: Inventario (usuario), Ventas (administrador), Facturación (usuario si activas la creación de facturas), Contactos (usuario).
Generar una clave API
- Inicia sesión en Odoo con este nuevo usuario.
- Haz clic en el avatar arriba a la derecha → Preferencias.
- Pestaña Cuenta → Claves API → Nueva clave API.
- Dale un nombre descriptivo (por ejemplo
Shopware Connector) y copia el valor generado.
Configuración del lado de Shopware
Rellenar la conexión
En la administración Shopware: Ajustes → Sistema → Plugins → Df Odoo → Ajustes, o mediante el menú lateral Ajustes → Df Odoo → Ajustes.
- URL Odoo: URL completa de tu instancia sin barra final, por ejemplo
https://micuenta.odoo.com. - Nombre de la base: visible en la URL de Odoo después de
?db=, o en Ajustes → Técnico → Base de datos. - Usuario: login del usuario dedicado, generalmente su dirección de email.
- Clave API Odoo: valor copiado en el paso anterior.
- Tiempo de espera: 30 segundos por defecto, suficiente en la mayoría de los casos.
Probar la conexión
Haz clic en Probar conexión arriba a la derecha. Si todo es correcto, una notificación verde mostrará la versión de Odoo y el identificador de usuario (uid). Si falla, el mensaje de error devuelto por Odoo se muestra tal cual.
curl -X POST -H "Authorization: Bearer ADMIN_TOKEN" https://tushopware.com/api/_action/df-odoo/test-connection
Direcciones de sincronización
Cada entidad tiene su propio selector: desactivado, Odoo → Shopware (pull), Shopware → Odoo (push), o bidireccional. Los valores por defecto son:
- Productos: bidireccional
- Stock: Odoo → Shopware (Odoo es la fuente de verdad)
- Clientes: Shopware → Odoo
- Pedidos: Shopware → Odoo
- Categorías: desactivado (activar manualmente según tu organización)
Sincronización de productos
Estrategias de correspondencia
Tres estrategias configurables:
- SKU (recomendado): Shopware
productNumber↔ Odoodefault_code. - ID Odoo: se apoya solo en la tabla de mapping persistente. Útil si tus SKU son volátiles.
- Código de barras (EAN): Shopware
ean↔ Odoobarcode. Requiere EAN en ambos lados.
Una vez vinculados, dos productos permanecen emparejados mediante la tabla df_odoo_mapping, aunque el SKU cambie después.
Pull desde Odoo
La tarea programada lee los product.template modificados desde la última ejecución (campo write_date) y crea o actualiza los productos Shopware correspondientes. Los campos sincronizados son: nombre, SKU, precio de venta, precio de coste, descripción corta, descripción larga, peso, volumen, estado activo, categoría, impuestos.
Push hacia Odoo
Los productos maestros activos de Shopware (con parentId = null) se envían a Odoo como product.template de tipo product (artículo almacenable). Las variantes Shopware se agrupan bajo su producto padre.
skipped. Esto evita saturar Odoo en cron sucesivos.
Sincronización del stock
El stock siempre se tira desde Odoo (nunca al revés). Cada 15 minutos, la tarea programada lee las variantes product.product en lotes de 100 por id de template padre, agrega qty_available o free_qty (configurable globalmente) y actualiza el campo stock de cada producto Shopware en una sola petición DAL.
qty_available refleja el stock físico presente en almacén. free_qty resta las cantidades ya reservadas en pedidos no entregados. free_qty suele ser preferible para una tienda en línea pues evita la sobreventa.
Sincronización de categorías
Desactivada por defecto. Actívala si tu árbol de categorías debe mantenerse sincronizado con el de Odoo. La jerarquía parent_id se preserva en ambos lados. Como en los productos, un hash de contenido evita escrituras innecesarias.
Sincronización de clientes
Los clientes Shopware se envían como res.partner Odoo con:
- Deduplicación por email: antes de cualquier creación, se busca un partner existente con el mismo email y
parent_id = false. Si existe, se actualiza en vez de duplicarse. - company_type: company si el campo empresa de la dirección de facturación está relleno, person si no.
- Direcciones subordinadas: la dirección de facturación predeterminada se crea como partner hijo con
type='invoice', la de envío como partner hijo contype='delivery'. - IVA intracomunitario: reportado al campo
vatdel partner principal. - País y región: resueltos por código ISO con caché en memoria por petición.
Sincronización de pedidos
En tiempo real al checkout
Si la opción Enviar cada pedido al confirmar está activada, un event subscriber escucha CheckoutOrderPlacedEvent y envía el pedido a Odoo inmediatamente al terminar el checkout. El cliente se crea en Odoo si es necesario (mediante la sincronización de clientes), después el pedido se crea como sale.order con:
partner_idresuelto mediante el mapping de clientes.order_linecon sintaxis tuple de Odoo:[0, 0, {name, product_uom_qty, price_unit, product_id}].- Una línea adicional para los portes si el
totalPricedel envío es mayor que cero. company_id,warehouse_id,pricelist_idsegún los valores por defecto configurados.
df_odoo_log y el pedido se reintenta en los 10 minutos siguientes por la tarea programada df_odoo.order_sync, que rastrea los pedidos no mapeados de los últimos 7 días.
Filtro de estado
El ajuste Filtro de estado de pedidos restringe qué pedidos se envían:
- Todos: cualquier pedido confirmado se envía (recomendado en B2C con pago inmediato).
- Solo pagados: solo pedidos cuyo estado de pago es paid se envían. Evita que carritos abandonados con pago manual ensucien Odoo.
- Pagados o enviados: añade los pedidos enviados antes del pago (B2B con plazos).
Confirmación y factura automáticas
Dos opciones controlan lo que pasa del lado de Odoo una vez creado el pedido:
- Confirmar pedido: llama a
action_confirmen elsale.order, que pasa directamente al estado pedido confirmado en vez de quedar como presupuesto. - Crear factura: llama a
_create_invoicespara generar inmediatamente una factura validada. El ID de la factura creada se memoriza como mapping de tipoinvoice.
Multi canal de venta
Todos los ajustes del plugin pueden sobrescribirse por canal de venta. Arriba en la página Ajustes, el selector nativo de Shopware permite alternar entre Todos los canales y un canal concreto.
Casos de uso típicos:
- Un canal B2C que envía a un Odoo principal y un canal B2B que envía a un Odoo distinto.
- Un canal de producción con dirección push y un canal staging con dirección desactivada.
- Diferentes IDs Odoo (warehouse, sales team, pricelist) según el canal.
Tareas programadas
| Nombre interno | Frecuencia | Acción |
|---|---|---|
df_odoo.product_sync |
1 hora | Pull y luego push de productos según la dirección configurada. El pull solo examina registros modificados desde -2h. |
df_odoo.stock_sync |
15 minutos | Pull de stock desde Odoo para todos los productos ya mapeados. |
df_odoo.customer_sync |
1 hora | Push de clientes activos no mapeados (máx. 100 por ejecución). |
df_odoo.order_sync |
10 minutos | Push de pedidos de los últimos 7 días no mapeados (máx. 50 por ejecución). |
Forzar la ejecución de una tarea desde la consola:
sudo -u www-data setsid php bin/console scheduled-task:run-single df_odoo.product_sync
messenger:consume o unidad systemd). Comprueba en Ajustes → Sistema → Cola que scheduled_task se consume regularmente.
Módulo de administración
Una sección Df Odoo aparece en Ajustes → Plugins con cuatro páginas.
Panel
Contadores en vivo (correspondencias activas por entidad, actividad de las últimas 24 h por estado), botones de sincronización manual por entidad (pull y push), banner de estado de conexión, lista de errores recientes y accesos directos a las demás páginas.
Ajustes
Formulario completo con selector de canal de venta. Botones Probar conexión y Guardar en la barra de acciones.
Registros
Cada operación se registra en df_odoo_log con su estado (success, error, warning, skipped), dirección, entidad, duración en milisegundos y mensaje completo. Filtros combinables por estado, tipo de entidad y dirección. Paginación en servidor.
Correspondencias
Vista de solo lectura sobre la tabla df_odoo_mapping con búsqueda, filtro por tipo de entidad y orden por fecha de última sincronización. Útil para verificar que un producto dado está mapeado al ID Odoo esperado.
API REST de administración
Todos los endpoints requieren autenticación admin estándar (Bearer token).
| Método | Endpoint | Parámetros |
|---|---|---|
| POST | /api/_action/df-odoo/test-connection |
salesChannelId (opcional) |
| POST | /api/_action/df-odoo/sync/products |
direction=pull|push, salesChannelId |
| POST | /api/_action/df-odoo/sync/stock |
salesChannelId |
| POST | /api/_action/df-odoo/sync/customers |
salesChannelId |
| POST | /api/_action/df-odoo/sync/orders |
salesChannelId, limit (1-500) |
| POST | /api/_action/df-odoo/sync/categories |
direction=pull|push |
| GET | /api/_action/df-odoo/stats |
— |
| GET | /api/_action/df-odoo/logs |
status, entityType, direction, page, perPage |
Ejemplo de llamada para forzar un push de productos:
curl -X POST
-H "Authorization: Bearer ADMIN_TOKEN"
-d "direction=push"
https://tushopware.com/api/_action/df-odoo/sync/products
Tablas y datos almacenados
El plugin crea dos tablas MySQL:
df_odoo_mapping— correspondencias persistentes (id Shopware ↔ id Odoo) con hash de sincronización y payload opcional. Una fila es única por (tipo de entidad, id Shopware) y por (tipo de entidad, id Odoo).df_odoo_log— registro de operaciones con estado, duración, mensaje, payload, id del canal de venta.
No se modifica ninguna tabla estándar de Shopware.
Desinstalación
Desde la administración: Extensiones → Mis extensiones → Df Odoo → Desinstalar.
Un cuadro de diálogo ofrece dos opciones:
- Conservar los datos del usuario marcado: las tablas
df_odoo_mappingydf_odoo_logse preservan, así como los ajustes del sistema. Práctico para una reinstalación posterior. - Conservar los datos del usuario desmarcado: ambas tablas se eliminan (DROP TABLE) al desinstalar. La instancia Odoo nunca se toca.
Solución de problemas
«Configuración Odoo incompleta» al probar la conexión
Uno de los cuatro campos obligatorios (URL, base, usuario, clave API) está vacío. Verifica que has seleccionado el canal de venta correcto antes de guardar.
«401 Unauthorized» o «access denied»
La clave API fue revocada del lado de Odoo, o el usuario no tiene los derechos necesarios sobre el modelo objetivo. Regenera una clave API y verifica los derechos Odoo del usuario (sobre todo Inventario → Usuario y Ventas → Administrador).
«Conexión rechazada» o timeout
La URL Odoo no es accesible desde el servidor Shopware. Verifica que el firewall autoriza las conexiones salientes HTTPS hacia el dominio Odoo. Aumenta el tiempo de espera si tu instancia Odoo es lenta en responder.
Los productos no se sincronizan
Verifica el registro (página Registros) por entradas en error. Activa el modo debug para rastrear también las operaciones skipped e identificar si el hash de contenido hace que nada cambie realmente.
Los pedidos no se envían al checkout
Verifica que la opción Enviar cada pedido al confirmar está marcada y que la dirección Pedidos está en Shopware → Odoo. Si el filtro de estado está en Solo pagados y el pago es asíncrono, es la tarea programada la que envía el pedido unos minutos tras el cobro.
Limitaciones conocidas
- Los atributos de variantes Odoo (
product.attribute) todavía no se mapean automáticamente. Las variantes Shopware se agrupan como productos padre Odoo (product.template). Las variantes Odoo creadas manualmente siguen correctamente vinculadas mediante su template padre. La gestión nativa está prevista en la versión 1.1. - Los descuentos de línea de pedido se reportan como
price_unitajustado, no como eldiscountde Odoo. - Los métodos de pago y envío de Shopware no se mapean a los
journal_idde Odoo — se usan los valores por defecto de Odoo.
Soporte
Para cualquier pregunta, contacta al equipo DataFirefly mediante el formulario de contacto en datafirefly.com. Adjunta la exportación del registro (página Registros → botón de exportación próximamente) o al menos una captura de la línea en error junto con la versión exacta de Shopware, PHP y Odoo.