SW Shopware 6 Intermedio

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.

Actualizado Versión del módulo 1.0.0

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

  1. Descarga DfOdooConnector-v1.0.0.zip desde tu cuenta de cliente.
  2. En la administración Shopware: Extensiones → Mis extensiones → Subir extensión.
  3. Selecciona el ZIP y haz clic en Instalar.
  4. 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
Nota — La instalación crea dos tablas: 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.

  1. En Odoo: Ajustes → Usuarios y empresas → Usuarios.
  2. Crea un usuario llamado por ejemplo Shopware Bridge.
  3. Dale los derechos necesarios: Inventario (usuario), Ventas (administrador), Facturación (usuario si activas la creación de facturas), Contactos (usuario).

Generar una clave API

  1. Inicia sesión en Odoo con este nuevo usuario.
  2. Haz clic en el avatar arriba a la derecha → Preferencias.
  3. Pestaña CuentaClaves APINueva clave API.
  4. Dale un nombre descriptivo (por ejemplo Shopware Connector) y copia el valor generado.
Importante — La clave API solo se muestra una vez. Si la pierdes, tendrás que generar una nueva. Guárdala en un gestor de contraseñas antes de cerrar el cuadro de diálogo.

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.

Consejo — El test de conexión también puede llamarse desde la consola para scriptear una comprobación:
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 ↔ Odoo default_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 ↔ Odoo barcode. 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.

Detección de cambios — Antes de cada escritura, se compara un hash SHA-1 del contenido con el almacenado en el mapping. Si nada cambió, la escritura se omite y la operación se registra como 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 vs free_qtyqty_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 con type='delivery'.
  • IVA intracomunitario: reportado al campo vat del 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_id resuelto mediante el mapping de clientes.
  • order_line con sintaxis tuple de Odoo: [0, 0, {name, product_uom_qty, price_unit, product_id}].
  • Una línea adicional para los portes si el totalPrice del envío es mayor que cero.
  • company_id, warehouse_id, pricelist_id según los valores por defecto configurados.
El checkout nunca se bloquea — Si Odoo no responde, el error se registra en 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_confirm en el sale.order, que pasa directamente al estado pedido confirmado en vez de quedar como presupuesto.
  • Crear factura: llama a _create_invoices para generar inmediatamente una factura validada. El ID de la factura creada se memoriza como mapping de tipo invoice.

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
Worker Shopware — Para que las tareas programadas se disparen automáticamente, el worker messenger de Shopware debe estar en marcha (cron 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.

Modo debug — Las operaciones skipped solo se escriben en el registro cuando el modo debug está activado en los ajustes. Úsalo puntualmente para diagnosticar un comportamiento; desactívalo en producción para evitar saturar la tabla.

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_mapping y df_odoo_log se 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_unit ajustado, no como el discount de Odoo.
  • Los métodos de pago y envío de Shopware no se mapean a los journal_id de 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.

¿Te ha resultado útil esta página?

¿Sigues atascado? Contacta con soporte