Conecta Testivora con n8n
Atrapa los eventos de Testivora con el nodo Webhook de n8n y dispara cualquier flujo: Slack, Sheets, tu CRM, lo que sea. Funciona hoy, sin esperar a un nodo nativo.
Crea un Webhook node en n8n
Nuevo workflow → agrega un nodo 'Webhook'. Pon HTTP Method en POST y copia la 'Production URL' (o la de Test mientras pruebas). Activa el workflow para que la Production URL quede viva.
Registra la URL en Testivora
En Testivora ve a Ajustes → Webhooks → Nuevo endpoint. Pega la URL de n8n, elige los eventos que te interesan (o déjalo en todos) y guarda. Verás un secret whsec_… para verificar la firma (paso 5, opcional).
Envía una prueba y mira el payload
Desde Testivora dale 'Enviar prueba' en tu endpoint. En n8n vas a recibir el evento. Esta es la forma del payload — el testimonio vive en data:
{
"id": "evt_3hF2bQ...",
"object": "event",
"event": "testimonial.approved",
"version": "1.0",
"created": "2026-06-03T01:00:00.000Z",
"attempt": 1,
"data": {
"id": "j97...",
"type": "text",
"status": "approved",
"rating": 5,
"text": "Cerré 3 clientes en una semana.",
"author": { "name": "Ana López", "company": "Acme" }
}
}Usa los campos en tus nodos
En n8n el cuerpo del POST llega bajo $json.body. Referencia los campos con expresiones:
{{ $json.body.event }} // testimonial.approved
{{ $json.body.data.author.name }} // Ana López
{{ $json.body.data.text }} // el testimonio
{{ $json.body.data.rating }} // 5Verifica la firma (opcional pero recomendado)
Para asegurarte de que el POST vino de Testivora, agrega un nodo Code que recalcule el HMAC-SHA256 del header Testivora-Signature con tu secret:
// n8n Code node (opcional) — verifica la firma
const crypto = require('crypto');
const secret = 'whsec_...'; // tu secret de Testivora
const header = $json.headers['testivora-signature']; // "t=...,v1=..."
const p = Object.fromEntries(header.split(',').map(s => s.split('=')));
const raw = JSON.stringify($json.body);
const expected = crypto.createHmac('sha256', secret)
.update(`${p.t}.${raw}`).digest('hex');
if (p.v1 !== expected) throw new Error('Firma inválida');
return $input.all();