Quan WooCommerce dispara un webhook, t'està enviant una notificació. No t'està fent una promesa. No t'està garantint res. Simplement et diu: 'hola, ha passat alguna cosa'. I l'envia una sola vegada. Si el teu servidor no escoltava en aquell moment, la notificació es perd. Per sempre.

La majoria de connectors i plugins tracten aquest webhook com si fos un contracte vinculant: 'si WooCommerce m'ho ha dit, és veritat'. Però un webhook no és una transacció. I aquesta confusió és la causa invisible de milers d'incoherències entre ecommerce i ERP.

Què és un webhook (i què no és)

Un webhook és una crida HTTP que WooCommerce fa al teu endpoint quan canvia l'estat d'un recurs (comanda, producte, client). És un mecanisme de notificació: 'fire and forget'. WooCommerce dispara la petició i no espera resposta. Si la petició falla, no la reenvia.

  • No és atòmic: El webhook arriba després que el canvi ja ha passat. Si l'ERP el rebutja, WooCommerce no ho sap ni ho desfà.
  • No és fiable: Si hi ha un timeout, un error 500 o el teu servidor estava reiniciant-se, el webhook es perd sense rastre.
  • No és ordenat: Dos webhooks poden arribar desordenats. El webhook d'actualització pot arribar abans que el de creació.
  • No és idempotent: En certs escenaris, WooCommerce pot enviar el mateix webhook dues vegades. Si el teu sistema no gestiona duplicats, acabes amb dades dobles.

Què és una transacció i per què importa

Una transacció és una operació que compleix les propietats ACID: Atomicitat (es fa tot o res), Consistència (les dades queden en un estat vàlid), Aïllament (no interfereix amb altres operacions) i Durabilitat (un cop confirmada, no es perd).

Quan un client compra a la teva botiga, hauries de tractar aquesta operació com una transacció entre WooCommerce i l'ERP: o ambdós sistemes registren la venda correctament, o cap la registra. Però amb webhooks, el que passes és que WooCommerce registra la comanda per la seva banda i després 'avisa' a l'ERP. Si l'avís falla, tens una venda a WooCommerce i res a l'ERP.

Escenaris reals on els webhooks fallen

1. El servidor de l'ERP estava offline

Una actualització del servidor, un reinici programat, o simplement un pic de càrrega. WooCommerce envia el webhook, rep un timeout, i segueix endavant. La comanda existeix a WooCommerce però mai arriba a l'ERP. Ningú se n'adona fins que comptabilitat tanca el mes.

2. Race condition entre estoc i comanda

Dos clients compren alhora l'última unitat d'un producte. WooCommerce envia dos webhooks de comanda. L'ERP processa el primer, resta estoc, i quan arriba el segon... l'estoc ja és 0. Però a WooCommerce les dues comandes existeixen com a 'completades'. Resultat: sobrevenda.

3. Webhook duplicat

WooCommerce actualitza una comanda i envia el webhook. El teu sistema el rep però la resposta tarda massa. WooCommerce (o el plugin de webhooks) el reenvia. Ara l'ERP processa la mateixa comanda dues vegades: dos assentaments comptables, dues sortides d'estoc.

La alternativa: transaccions basades en events

Un middleware professional no depèn de webhooks com a font de veritat. En canvi, utilitza un sistema d'events amb garanties transaccionals:

  • Cua persistent: Els events es guarden en una cua durable. Si el receptor no està disponible, l'event espera. No es perd mai.
  • Processament idempotent: Cada event porta un identificador únic. Si arriba dues vegades, el sistema el reconeix i l'ignora.
  • Ordre garantit: Els events es processen en l'ordre correcte, independentment de quan arribin.
  • Confirmació bidireccional: L'event no es marca com a processat fins que ambdós sistemes confirmen. Si un falla, l'event es reintenta automàticament.

Probablement no tens diversos problemes

Si has arribat aquí buscant per què la teva integració perd comandes, duplica entrades o desquadra l'estoc, la causa probablement és la mateixa: estàs confiant en webhooks per a operacions que requereixen integritat transaccional.

WooCommerce i el teu ERP creuen ser la font de veritat al mateix temps. Quan ambdues conviuen sense control, apareixen incoherències. No és un bug puntual. És un problema d'integritat transaccional.

👉 Entén l'origen real aquí