Saltar al contenido
WooRescueHQ

WooCommerce / Integraciones

Webhooks de WooCommerce que fallan: cómo diagnosticarlos

Respuesta corta

Revisa primero el estado del webhook y sus registros de entrega. WooCommerce entrega los webhooks en segundo plano mediante Action Scheduler y desactiva un webhook tras varias entregas fallidas consecutivas: cualquier respuesta fuera del rango 2xx, o un timeout, cuenta como fallo. Las entregas tardías apuntan a Action Scheduler o WP-Cron; los fallos, al endpoint receptor (errores, lentitud, comprobación de firma, firewalls); los duplicados, a receptores que no son idempotentes.

Síntomas

  • El sistema receptor no recibe algunos eventos, o ninguno.
  • Los eventos llegan con minutos u horas de retraso.
  • El estado del webhook ha pasado a Desactivado sin que nadie lo tocara.
  • El receptor procesa el mismo pedido dos veces.
  • El receptor rechaza las entregas por no estar autenticadas.

Causas más comunes

  1. El receptor falla: devuelve 4xx/5xx por sus propios fallos, sus reglas de autenticación o su validación de payloads inesperados.
  2. El receptor es demasiado lento: hace todo su trabajo antes de responder y la petición supera el tiempo.
  3. Algo bloquea la entrega: el firewall, el WAF o la lista de IPs permitidas del receptor; o el hosting de la tienda bloquea las peticiones salientes.
  4. La verificación de la firma está mal hecha: calculada sobre el JSON ya interpretado en lugar del cuerpo bruto, o con un secreto antiguo.
  5. El procesamiento en segundo plano está atascado: Action Scheduler o WP-Cron no se ejecutan, y las entregas se acumulan.
  6. Los receptores no son idempotentes: order.updated se dispara en muchos guardados y los reintentos reenvían eventos, así que el mismo pedido llega varias veces.

Diagnóstico

1. Revisa el estado y los registros de entrega

En WooCommerce → Ajustes → Avanzado → Webhooks, revisa el estado (Activo, En pausa, Desactivado), el tema y la URL de entrega. Después busca en WooCommerce → Estado → Registros el registro de entregas de webhooks, que anota cada entrega con su código de respuesta y su duración.

Qué muestra el registro Qué significa
Ninguna entrega para eventos recientes El evento no se disparó, o las entregas siguen en cola
2xx Entregado; el problema está en el lado receptor
3xx La URL de entrega redirige; usa la URL final
401 / 403 El receptor o su firewall rechazan la petición
5xx El receptor falló al procesarla
Timeout / error de conexión El receptor es demasiado lento o no es accesible

2. Revisa la cola

Las entregas se ejecutan como acciones woocommerce_deliver_webhook_async. En Herramientas → Acciones programadas, busca ese hook: muchas acciones Pendientes o con fecha pasada significan que la cola no se procesa; las acciones Fallidas contienen el error.

3. Revisa el receptor

En el lado receptor, registra la petición bruta, las cabeceras y la respuesta que devuelve para una entrega de prueba. WooCommerce envía cabeceras útiles: X-WC-Webhook-Topic, X-WC-Webhook-Resource, X-WC-Webhook-ID, X-WC-Webhook-Delivery-ID y X-WC-Webhook-Signature.

Registros y comprobaciones técnicas

  • Ajustes del webhook: estado, tema, URL de entrega, secreto, versión de la API.
  • Registros de WooCommerce para las entregas de webhooks.
  • Herramientas → Acciones programadas: acciones de entrega pendientes, vencidas y fallidas.
  • Registros del receptor: cuerpo bruto, cabeceras, código de respuesta, tiempo de procesamiento.
  • Firewalls en ambos lados: peticiones salientes desde la tienda, entrantes en el receptor.

Soluciones

  • Responde rápido, procesa después: el receptor debe verificar la firma, guardar el evento y devolver 200 inmediatamente, y procesarlo luego en su propia cola.
  • Verifica las firmas sobre el cuerpo bruto:
PHPreceiver/webhook.php
$payload   = file_get_contents( 'php://input' );
$signature = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE'] ?? '';
$expected  = base64_encode( hash_hmac( 'sha256', $payload, WEBHOOK_SECRET, true ) );

if ( ! hash_equals( $expected, $signature ) ) {
    http_response_code( 401 );
    exit;
}

// Guarda el evento, devuelve 200 ya y procésalo de forma asíncrona.
  • Acepta el ping que WooCommerce envía al guardar un webhook (datos de formulario con webhook_id) y devuelve 200.
  • Haz el procesamiento idempotente: usa el ID de entrega y el ID del recurso junto con su fecha de modificación para omitir los eventos ya aplicados.
  • Mantén la cola en marcha: asegúrate de que WP-Cron se ejecuta, preferiblemente desde un cron real del servidor, y vacía cualquier acumulación de Action Scheduler.
  • Reactiva el webhook tras arreglar el receptor: vuelve a ponerlo en Activo.

Qué no hacer

  • No te saltes la verificación de la firma en el receptor; cualquiera podría enviarle pedidos falsos.
  • No ejecutes trabajo lento (llamadas al ERP, emails, generación de PDF) antes de responder al webhook.
  • No reactives una y otra vez un webhook desactivado sin arreglar el receptor; volverá a desactivarse.
  • No borres acciones de entrega pendientes para «limpiar»: son eventos que el receptor aún no ha visto.

Cuándo recurrir a un experto

Recurre a un ingeniero cuando la integración pierde o duplica pedidos, cuando solo controlas un lado de la integración y necesitas evidencias para el otro, o cuando hay que reconstruir el receptor para que sea rápido, verificado e idempotente.

Preguntas frecuentes

¿Por qué se ha desactivado mi webhook de WooCommerce?

WooCommerce desactiva un webhook tras un número de entregas fallidas consecutivas. Una entrega falla cuando el receptor responde fuera del rango 2xx o no responde a tiempo. Arregla el receptor y vuelve a poner el webhook en Activo.

¿Por qué los webhooks llegan tarde?

Las entregas se encolan como acciones en segundo plano. Si WP-Cron o el runner de Action Scheduler no procesan la cola (poco tráfico, WP-Cron desactivado sin un cron real que lo sustituya, o acumulación de acciones), las entregas esperan.

¿Cómo verifico la firma de un webhook?

Calcula un HMAC-SHA256 en base64 del cuerpo bruto de la petición con el secreto del webhook y compáralo con la cabecera X-WC-Webhook-Signature mediante una comparación de tiempo constante.

¿Por qué mi receptor recibe una petición que no es JSON?

Al guardar un webhook, WooCommerce envía un ping que solo contiene webhook_id como datos de formulario. Los receptores deben aceptarlo y responder 200; si no, la primera entrega ya cuenta como fallo.

$ describe el problema

¿Tienes un problema con WooCommerce?Solicita un diagnóstico.

Cuéntanos qué falla, qué ha cambiado últimamente y cómo afecta al negocio. Revisamos cada solicitud y te recomendamos el siguiente paso.

Solicitar un diagnóstico Ver servicios y precios

Nunca envíes contraseñas, claves API ni datos de tarjetas a través del formulario.

Diagnóstico desde299 €

Solicitar un diagnóstico