POST con el JSON completo del pedido, el pago, el cliente, la tienda y la pasarela cada vez que ocurre algo.
Se gestionan desde el CRM, en Cuenta → Webhooks. Solo la cuenta principal puede verlos y configurarlos: los colaboradores no tienen acceso a esta sección.
Cómo funciona
Crea un endpoint
https de tu receptor y marca los eventos que quieres recibir. Si lo necesitas, acota el endpoint a unas tiendas concretas y añade cabeceras propias.Guarda el secreto
whsec_.... Guárdalo en tu receptor: es lo que usarás para verificar la firma de cada envío. Puedes volver a verlo o rotarlo desde la tarjeta del endpoint.Verifica la firma y responde 2xx
X-Hurry-Signature sobre el cuerpo crudo y responde un código 2xx en menos de 10 segundos. Si no respondes 2xx, Hurry reintenta solo.Pruébalo
ping firmado y te enseña el código HTTP y la respuesta de tu servidor.Eventos
Cada endpoint se suscribe a los eventos que quieras. El código del evento viaja en el campotype del JSON y en la cabecera X-Hurry-Event.
Alcance por tienda
Un endpoint puede recibir los eventos de todas las tiendas (incluidos los cobros recurrentes, que no tienen tienda) o solo de algunas. Si eliges tiendas concretas, los cobros sin tienda no se envían a ese endpoint.Cabeceras personalizadas
Puedes añadir hasta 5 cabeceras propias por endpoint, por ejemploAuthorization: Bearer ... si tu receptor exige un token. Los nombres admiten letras, números y guiones. No se pueden definir las cabeceras que fija Hurry: Host, Content-Type, Content-Length, Transfer-Encoding, User-Agent ni ninguna que empiece por X-Hurry-.
Formato del evento
Todos los eventos comparten el mismo sobre. Lo que cambia es el contenido dedata.
evt_ + 24 caracteres). Es el mismo en todos los endpoints, en todos los reintentos y en los reenvíos manuales del mismo hecho. Úsalo para ignorar duplicados.order.paid, payment.failed, refund.created…2026-11-01. Cada endpoint queda fijado a la versión con la que se creó.id y name del endpoint que recibe el evento.null.4980 son 49,80 EUR), con la moneda al lado y una versión legible en los campos *Formatted. Las fechas van en ISO 8601 con desplazamiento horario.Qué lleva data en cada evento
data.order: el pedido
data.order: el pedido
#1001.PENDING, IN_PROGRESS, REQUIRES_ACTION, PAID, PARTIALLY_REFUNDED, REFUNDED o CANCELED. Lee la nota de abajo antes de usarlo para saber si está cobrado.true si el pedido está cobrado. Derivado del pago, vale para todas las pasarelas.CREATED, REQUIRES_ACTION, PROCESSING, SUCCEEDED, CANCELED o FAILED.currency, subtotal, tax, shipping, discount, upsells, total y totalFormatted.fxRate cuando hubo conversión.id, productId, sku, name, imageUrl, quantity, unitAmount, taxAmount y totalAmount.shipped, shippedAt, trackingNumber y trackingUrl.data.payment: el pago
data.payment: el pago
CREATED, REQUIRES_ACTION, PROCESSING, SUCCEEDED, CANCELED o FAILED.STRIPE, STRIPE_EVERVAULT, WHOP, ONE, SUMUP, SQUARE, MAMO, AIRWALLEX, SHOPIFY, MOR, SLASH, NEXI, NEXI_ALIAS, REDSYS o REVOLUT.pi_... de Stripe).true si es un cobro recurrente sin pedido (rebill).type, brand, last4, expMonth, expYear, country y funding. Nunca viaja el número completo de la tarjeta.code y message del rechazo cuando el cobro falla.data.refund.data.customer: el cliente
data.customer: el cliente
id, email, name, phone, address (line1, line2, city, state, postalCode, country) y createdAt. No incluye ningún dato de tarjeta.data.shop y data.gateway: tienda y pasarela
data.shop y data.gateway: tienda y pasarela
id, name, url, slug, customDomain, type (EXTERNAL o NATIVE) y platform (SHOPIFY, WORDPRESS o API).gateway: id, name y psp de la credencial de pago con la que se cobró.data.refund: el reembolso (refund.created)
data.refund: el reembolso (refund.created)
id, providerRefundId, amount, currency, amountFormatted, status (PENDING, SUCCEEDED, FAILED o CANCELED), reason, failureReason, createdAt y updatedAt.data.dispute: la disputa (dispute.opened y dispute.closed)
data.dispute: la disputa (dispute.opened y dispute.closed)
CHARGEBACK, INQUIRY o EARLY_FRAUD_WARNING.NEEDS_RESPONSE, UNDER_REVIEW, WON, LOST, CHARGE_REFUNDED o CLOSED.dispute.closed para saber de dónde viene.ping: la prueba
ping: la prueba
message con un texto fijo y endpoint con id, name, url y la lista events a la que está suscrito. Sirve para comprobar que tu receptor está accesible y que verificas bien la firma.Ejemplo completo: order.paid
Cabeceras HTTP
Cada entrega es unPOST con Content-Type: application/json y User-Agent: Hurry-Webhooks/1.0. Además lleva estas cabeceras:
Verificar la firma
Cada envío va firmado con HMAC-SHA256 usando el secreto del endpoint. Verifica la firma antes de confiar en el contenido:- Lee el cuerpo crudo de la petición, tal como llega, antes de parsear el JSON.
- Saca
tyv1de la cabeceraX-Hurry-Signature. - Rechaza la petición si
tdifiere más de 300 segundos de tu hora actual. Así una entrega capturada no se puede reproducir más tarde. - Calcula
HMAC-SHA256(secreto, t + "." + cuerpo)y pásalo a hexadecimal en minúsculas. - Compara el resultado con
v1en tiempo constante.
Responder, reintentos y duplicados
Responde2xx en menos de 10 segundos y procesa el evento después, en segundo plano. Cualquier otra respuesta, un timeout o un fallo de red cuentan como entrega fallida. Hurry no sigue redirecciones: una respuesta 3xx también cuenta como fallo.
Si una entrega falla, Hurry la reintenta con esperas crecientes: el primer intento más 6 reintentos, repartidos a lo largo de unas 9 horas.
ping) y los reenvíos manuales se intentan una sola vez.
id (o la cabecera X-Hurry-Event-Id) de cada evento procesado e ignora los repetidos.Apagado automático
Para no castigar a un receptor caído, Hurry apaga el endpoint en dos casos:- 10 fallos definitivos seguidos: el endpoint pasa a Apagado por fallos y te avisamos con una notificación en la campana del CRM. Un éxito en cualquier momento reinicia la racha.
- Respuesta
410 Gone: tu servidor dice que la URL ya no existe y el endpoint se apaga al momento.
Entregas
En Entregas ves el historial de todo lo que Hurry ha enviado o intentado enviar, lo último primero, con filtros por endpoint y por estado.id de evento como una entrega nueva. El historial se conserva 30 días.
Secreto y seguridad
- Secreto por endpoint. Cada endpoint tiene su propio secreto
whsec_..., cifrado en la base de datos. En la lista solo se enseña una pista con los últimos 4 caracteres. Puedes verlo o rotarlo cuando quieras. - Rotación inmediata. Al rotar, el secreto anterior deja de valer al momento: actualiza tu receptor con el nuevo antes de rotarlo si no quieres perder entregas.
- Solo HTTPS y hosts públicos. La URL tiene que ser
https://, apuntar a un dominio público de Internet y no llevar usuario ni contraseña. Hurry rechazalocalhost, nombres internos, direcciones privadas o de loopback y la propia plataforma de Hurry, y vuelve a comprobarlo antes de cada envío. - Sin datos de tarjeta. El JSON nunca incluye el número completo de la tarjeta ni el CVC: solo marca, últimos 4 dígitos, caducidad, país y tipo.
- Solo la cuenta principal. Los colaboradores no ven la sección, y no se puede modificar mientras se está suplantando a otro usuario.
Límites
Integración con Make, Zapier y n8n
Crea un módulo o nodo de tipo Webhook en la herramienta, copia la URL que te da y pégala como URL del endpoint en Hurry. Elige los eventos y pulsa Probar para que la herramienta reciba unping con el que mapear los campos.
Si la herramienta no te deja verificar la firma, añade al menos una cabecera personalizada con un token que solo conozcáis tú y la herramienta, y compruébala en el primer paso del flujo.
Gestión desde el MCP de Hurry
Si usas el conector MCP de Hurry con un asistente de IA, los webhooks también se pueden gestionar por conversación con estas herramientas. El secreto nunca se devuelve por el MCP; para verlo o rotarlo hay que usar la pantalla.Preguntas frecuentes
Mi receptor no recibe nada
Mi receptor no recibe nada
https, pública y que respondes 2xx. Si Hurry lo apagó por fallos, vuelve a activarlo con el interruptor.¿Qué pasa si mi servidor se cae?
¿Qué pasa si mi servidor se cae?
¿Puedo recibir los eventos en Make, Zapier o n8n?
¿Puedo recibir los eventos en Make, Zapier o n8n?
¿Qué datos viajan?
¿Qué datos viajan?
¿Por qué order.status no es PAID si el pedido está cobrado?
¿Por qué order.status no es PAID si el pedido está cobrado?
order.status es el estado del pedido en el CRM y solo las tiendas Shopify lo pasan a PAID. En el resto de pasarelas la verdad del cobro está en el pago. Usa order.paid, order.paidAt y order.paymentStatus, que valen para todas.¿Por qué recibo dos eventos por una venta?
¿Por qué recibo dos eventos por una venta?
order.paid y payment.succeeded a la vez, con el mismo contenido en data. Suscríbete solo a uno de los dos salvo que también quieras los cobros recurrentes, que solo llegan como payment.succeeded.Se me ha filtrado el secreto
Se me ha filtrado el secreto
¿Puedo pausar un endpoint sin borrarlo?
¿Puedo pausar un endpoint sin borrarlo?
