Use this file to discover all available pages before exploring further.
Los webhooks te permiten recibir notificaciones HTTP en tu propio
servidor cada vez que ocurre un evento relevante en woku: una nueva
reseña woku, un NPS o la respuesta de un formulario. woku
hace un POST con un cuerpo JSON a la URL que configures.
Los webhooks se administran desde la aplicación administrativa, no por
API pública.
1
Abre la configuración de integraciones
En el panel, entra a Empresa → Integraciones → Webhooks.
2
Crea un webhook
Pulsa Nuevo webhook e ingresa la URL de tu endpoint, los
eventos a los que te suscribes y, opcionalmente, headers
personalizados y la política de reintentos.
3
Guarda el secret
Al crear el webhook, woku muestra el secret una sola vez. Cópialo y
guárdalo de forma segura: lo necesitarás para verificar la firma de
cada evento.
El secret se muestra una única vez al crear o rotar el webhook. woku
lo guarda cifrado y no puede volver a mostrártelo. Si lo pierdes, rótalo
desde el panel para generar uno nuevo.
Cada entrega incluye el header X-Woku-Signature con una firma
HMAC-SHA256 del cuerpo JSON crudo, usando tu secret como llave:
X-Woku-Signature: sha256=<hex>
Calcula la firma sobre el cuerpo crudo de la solicitud (los bytes
exactos recibidos), antes de parsearlo como JSON. Re-serializar el
objeto puede cambiar el orden de las llaves o el espaciado y producir una
firma distinta.
Compara siempre con una función de tiempo constante para evitar
ataques de temporización. Si la firma no coincide, descarta la solicitud.
import crypto from 'node:crypto';function verifyWokuSignature(rawBody, signatureHeader, secret) { // signatureHeader: "sha256=<hex>" const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex'); const a = Buffer.from(signatureHeader); const b = Buffer.from(expected); return a.length === b.length && crypto.timingSafeEqual(a, b);}// Ejemplo con Express. Usa el cuerpo crudo, no el JSON parseado.import express from 'express';const app = express();app.post( '/webhooks/woku', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.header('X-Woku-Signature') ?? ''; if (!verifyWokuSignature(req.body, signature, process.env.WOKU_WEBHOOK_SECRET)) { return res.status(401).send('Invalid signature'); } const event = JSON.parse(req.body.toString('utf8')); // ... procesa el evento res.status(200).json({ received: true }); },);
Tu endpoint debe responder con un código HTTP 2xx (idealmente 200)
lo antes posible. woku considera exitosa la entrega ante cualquier 2xx.
Procesa el evento de forma asíncrona: responde 200 de inmediato y
encola el trabajo pesado. woku usa un timeout de 30 segundos por
intento; si tu endpoint tarda más, la entrega se cuenta como fallida.
Si tu endpoint no responde con 2xx (o no responde dentro del timeout),
woku reintenta con backoff exponencial:
Intento
Espera antes del intento
1
inmediato
2
~1 s
3
~2 s
Tras agotar los 3 intentos, la entrega pasa a estado dead-letter:
no se vuelve a intentar automáticamente. Puedes revisar el historial de
entregas y reintentar manualmente las que quedaron en dead-letter
desde Empresa → Integraciones → Webhooks, en el detalle del webhook.
Como un evento puede entregarse más de una vez (por un reintento sobre una
entrega que sí llegó pero respondió tarde), diseña tu endpoint para que
sea idempotente: usa el identificador del recurso en data para
descartar duplicados.