Skip to main content

Documentation Index

Fetch the complete documentation index at: https://woku.app/docs/llms.txt

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.

Configuración

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.

Eventos disponibles

woku emite estos eventos:
EventoCuándo se emite
client.woku-review.createdSe registró una nueva reseña woku (calificación 1-5).
nps.createdSe registró una nueva respuesta NPS (puntaje 0-10).
form-response.createdSe completó una respuesta de formulario.

Estructura común

Todos los payloads comparten esta envoltura:
CampoDescripción
eventNombre del evento (ver tabla anterior).
timestampFecha y hora de emisión (ISO 8601, UTC).
companyIdEmpresa a la que pertenece el evento.
dataDatos específicos del evento.

Ejemplos de payload

{
  "event": "client.woku-review.created",
  "timestamp": "2026-05-26T15:30:00Z",
  "companyId": "64a1b2c3d4e5f6a7b8c9d0e1",
  "data": {
    "reviewId": "64b2c3d4e5f6a7b8c9d0e1f2",
    "wokuId": "64d4e5f6a7b8c9d0e1f2a3b4",
    "qualification": 5,
    "comment": "Excelente atención",
    "respondentId": "user_abc123",
    "channel": "web-widget",
    "createdAt": "2026-05-26T15:29:58Z"
  }
}

Verificación de firma (HMAC)

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 });
  },
);

Respuesta esperada de tu endpoint

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.

Reintentos y dead-letter

Si tu endpoint no responde con 2xx (o no responde dentro del timeout), woku reintenta con backoff exponencial:
IntentoEspera antes del intento
1inmediato
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.