Cuando WooCommerce dispara un webhook, te está enviando una notificación. No te está haciendo una promesa. No te está garantizando nada. Simplemente te dice: 'hola, ha pasado algo'. Y lo envía una sola vez. Si tu servidor no estaba escuchando en ese momento, la notificación se pierde. Para siempre.
La mayoría de conectores y plugins tratan este webhook como si fuera un contrato vinculante: 'si WooCommerce me lo ha dicho, es verdad'. Pero un webhook no es una transacción. Y esta confusión es la causa invisible de miles de incoherencias entre ecommerce y ERP.
Qué es un webhook (y qué no es)
Un webhook es una llamada HTTP que WooCommerce hace a tu endpoint cuando cambia el estado de un recurso (pedido, producto, cliente). Es un mecanismo de notificación: 'fire and forget'. WooCommerce dispara la petición y no espera respuesta. Si la petición falla, no la reenvía.
- No es atómico: El webhook llega después de que el cambio ya ha ocurrido. Si el ERP lo rechaza, WooCommerce no lo sabe ni lo deshace.
- No es fiable: Si hay un timeout, un error 500 o tu servidor estaba reiniciándose, el webhook se pierde sin rastro.
- No es ordenado: Dos webhooks pueden llegar desordenados. El webhook de actualización puede llegar antes que el de creación.
- No es idempotente: En ciertos escenarios, WooCommerce puede enviar el mismo webhook dos veces. Si tu sistema no gestiona duplicados, acabas con datos dobles.
Qué es una transacción y por qué importa
Una transacción es una operación que cumple las propiedades ACID: Atomicidad (se hace todo o nada), Consistencia (los datos quedan en un estado válido), Aislamiento (no interfiere con otras operaciones) y Durabilidad (una vez confirmada, no se pierde).
Cuando un cliente compra en tu tienda, deberías tratar esa operación como una transacción entre WooCommerce y el ERP: o ambos sistemas registran la venta correctamente, o ninguno la registra. Pero con webhooks, lo que pasa es que WooCommerce registra el pedido por su lado y luego 'avisa' al ERP. Si el aviso falla, tienes una venta en WooCommerce y nada en el ERP.
Escenarios reales donde los webhooks fallan
1. El servidor del ERP estaba offline
Una actualización del servidor, un reinicio programado, o simplemente un pico de carga. WooCommerce envía el webhook, recibe un timeout, y sigue adelante. El pedido existe en WooCommerce pero nunca llega al ERP. Nadie se da cuenta hasta que contabilidad cierra el mes.
2. Race condition entre stock y pedido
Dos clientes compran a la vez la última unidad de un producto. WooCommerce envía dos webhooks de pedido. El ERP procesa el primero, resta stock, y cuando llega el segundo... el stock ya es 0. Pero en WooCommerce ambos pedidos existen como 'completados'. Resultado: sobreventa.
3. Webhook duplicado
WooCommerce actualiza un pedido y envía el webhook. Tu sistema lo recibe pero la respuesta tarda demasiado. WooCommerce (o el plugin de webhooks) lo reenvía. Ahora el ERP procesa el mismo pedido dos veces: dos asientos contables, dos salidas de stock.
La alternativa: transacciones basadas en eventos
Un middleware profesional no depende de webhooks como fuente de verdad. En su lugar, utiliza un sistema de eventos con garantías transaccionales:
- Cola persistente: Los eventos se guardan en una cola durable. Si el receptor no está disponible, el evento espera. No se pierde nunca.
- Procesamiento idempotente: Cada evento lleva un identificador único. Si llega dos veces, el sistema lo reconoce y lo ignora.
- Orden garantizado: Los eventos se procesan en el orden correcto, independientemente de cuándo lleguen.
- Confirmación bidireccional: El evento no se marca como procesado hasta que ambos sistemas confirman. Si uno falla, el evento se reintenta automáticamente.
Probablemente no tienes varios problemas
Si has llegado aquí buscando por qué tu integración pierde pedidos, duplica entradas o descuadra el stock, la causa probablemente es la misma: estás confiando en webhooks para operaciones que requieren integridad transaccional.
WooCommerce y tu ERP creen ser la fuente de verdad al mismo tiempo. Cuando ambos conviven sin control, aparecen incoherencias. No es un bug puntual. Es un problema de integridad transaccional.