Webhooks
Los webhooks permiten que tu aplicación reciba notificaciones HTTP en tiempo real cuando ocurren eventos en ZenFlow. En lugar de consultar la API constantemente, los webhooks envían datos a tu servidor tan pronto como algo sucede.Cómo Funcionan
- Te suscribes a uno o más topics (eventos)
- Cuando ocurre un evento, ZenFlow envía un POST a tu URL
- Tu servidor responde con
2xxpara confirmar recepción - Si falla, ZenFlow reintenta con backoff exponencial
Suscribirse a Webhooks
Para recibir notificaciones, crea un webhook especificando tu URL y los eventos que te interesan:Topics Disponibles
Pedidos (Orders)
order/created
order/created
Se dispara cuando se crea un nuevo pedido en ZenFlow.Payload:
| Campo | Tipo | Descripción |
|---|---|---|
order_id | integer | ID interno del pedido |
order_tenant_id | string | ID del pedido en tu sistema |
state_id | integer | ID del estado actual |
state_name | string | Nombre del estado |
warehouse_id | integer | ID del almacén asignado |
items_count | integer | Cantidad de líneas/productos |
total_quantity | integer | Cantidad total de unidades |
source | string | Origen: api, integration, manual |
source_integration | string | Integración origen (si aplica) |
order/updated
order/updated
Se dispara cuando se modifican los detalles de un pedido (estado, items, etc).Payload:
| Campo | Tipo | Descripción |
|---|---|---|
previous_state_id | integer | Estado anterior |
previous_state_name | string | Nombre del estado anterior |
updated_fields | array | Campos que fueron modificados |
order/cancelled
order/cancelled
Se dispara cuando un pedido es cancelado.Payload:
| Campo | Tipo | Descripción |
|---|---|---|
cancellation_reason | string | Motivo de la cancelación |
cancelled_by | string | Usuario que canceló |
order/completed
order/completed
Se dispara cuando un pedido completa su fulfillment (preparado y listo para envío).Payload:
| Campo | Tipo | Descripción |
|---|---|---|
items_picked | integer | Líneas preparadas |
total_quantity_picked | integer | Unidades totales preparadas |
picked_by | string | Operador que preparó |
duration_minutes | integer | Tiempo de preparación |
Productos (Products)
product/created
product/created
Se dispara cuando se crea un nuevo producto.Payload:
product/updated
product/updated
Se dispara cuando se modifican los detalles de un producto.Payload:
product/deleted
product/deleted
Se dispara cuando se elimina un producto.Payload:
Stock
stock/updated
stock/updated
Se dispara cuando cambia el nivel de stock de un producto en una ubicación.Payload:
Valores de
| Campo | Tipo | Descripción |
|---|---|---|
quantity | integer | Nueva cantidad |
previous_quantity | integer | Cantidad anterior |
change | integer | Diferencia (+ o -) |
reason | string | Motivo del cambio |
reference_id | string | ID de referencia (pedido, ajuste, etc) |
reason:order_fulfillment- Preparación de pedidomanual_adjustment- Ajuste manualstock_receipt- Recepción de mercaderíatransfer- Transferencia entre ubicacionesreturn- Devolucióninventory_count- Conteo de inventario
stock/low_alert
stock/low_alert
Se dispara cuando el stock de un producto cae por debajo del umbral mínimo configurado.Payload:
| Campo | Tipo | Descripción |
|---|---|---|
current_quantity | integer | Stock actual |
minimum_threshold | integer | Umbral mínimo configurado |
suggested_reorder | integer | Cantidad sugerida a reponer |
stock/movement_created
stock/movement_created
Se dispara cuando se registra un movimiento de stock (entrada, salida, transferencia).Payload:
| Campo | Tipo | Descripción |
|---|---|---|
type | string | Tipo: receipt, dispatch, transfer, adjustment |
from_location | string | Ubicación origen (null si es entrada) |
to_location | string | Ubicación destino (null si es salida) |
Flujos de Picking (Flows)
flow/started
flow/started
Se dispara cuando un operador inicia un flujo de picking.Payload:
flow/completed
flow/completed
Se dispara cuando un flujo de picking se completa exitosamente.Payload:
flow/cancelled
flow/cancelled
Se dispara cuando un flujo de picking es cancelado.Payload:
Estructura del Payload
Todos los payloads siguen esta estructura base:| Campo | Tipo | Descripción |
|---|---|---|
id | string | ID único del evento (usar para idempotencia) |
event | string | Topic del evento |
created_at | string | Timestamp ISO 8601 |
data | object | Payload específico del evento |
Verificando Webhooks
Siempre verifica las firmas de los webhooks para asegurar que las solicitudes provienen de ZenFlow.Formato de la Firma
ZenFlow incluye una firma en el headerX-Webhook-Signature:
t: Timestamp Unix cuando se envió el webhookv1: Firma HMAC-SHA256
Proceso de Verificación
Política de Reintentos
Si la entrega del webhook falla, ZenFlow reintenta con backoff exponencial:| Intento | Delay |
|---|---|
| 1 | Inmediato |
| 2 | 1 segundo |
| 3 | 2 segundos |
| 4 (final) | 4 segundos |
- Tu servidor retorna un código de estado no-2xx
- La conexión expira (30 segundos por defecto)
- Ocurren errores SSL/TLS
Mejores Prácticas
Responde Rápido
Retorna 200 inmediatamente, procesa async
Maneja Duplicados
Usa el ID del evento para idempotencia
Verifica Firmas
Siempre valida las firmas de los webhooks
Usa HTTPS
Solo usa URLs de webhook con HTTPS



