LeadPass Docs

Webhooks

En el momento en que LeadPass decide el veredicto de un lead, puede enviar por POST el resultado completo — veredicto, resumen y la evidencia por criterio — a la URL que tú elijas. Eso significa que los leads cualificados llegan a tu CRM, a Slack o a tu plataforma de automatización segundos después de que terminen de hablar, con todo lo que tu equipo necesita para actuar. Cada petición va firmada, para que puedas confiar en lo que llega.

El contrato del webhook es v1 y solo aditivo: con el tiempo pueden añadirse campos, pero nada de lo documentado aquí se renombrará, cambiará de tipo ni se eliminará sin una versión nueva anunciada de forma explícita.

Primeros pasos

  1. Abre Ajustes → Workspace → Webhook (/app/settings/workspace). Activa el webhook del workspace y elige qué veredictos quieres recibir.
  2. Pega la URL de tu endpoint. Una URL de disparador «Catch Raw Hook» de Zapier, «Webhook» de Make o «Webhook» de n8n funciona tal cual — no hace falta ninguna integración nativa.
  3. Haz clic en Enviar evento de prueba. LeadPass envía un payload de ejemplo lead.pass con "test": true para que veas la forma exacta.
  4. Mapea los campos que necesites (verdict, lead.email, summary, criteria, …) en tu herramienta receptora. Filtra por event, verdict o test según te haga falta.
  5. Copia el secreto de firma desde la misma pestaña de Ajustes y verifica las firmas en tu receptor (mira «Verificar la firma» más abajo). Recomendado para cualquier cosa que vaya más allá de un catch hook no-code.

Eventos

Evento Cuándo se dispara
lead.pass El primer veredicto decidido del lead es Pass (revision: 1).
lead.review El primer veredicto decidido del lead es Review (revision: 1).
lead.no_pass El primer veredicto decidido del lead es No pass (revision: 1).
lead.verdict_revised Cualquier revisión decidida posterior sobre el mismo lead (revision > 1): una decisión de un miembro del equipo o un re-análisis, incluso cuando el valor del veredicto no cambia.

El vocabulario de veredictos en los payloads es pass | review | no_pass. Un cuarto valor, incomplete, solo aparece como previous_verdict o como reemplazo tras un re-análisis — nunca es suscribible y nunca es un primer evento.

Filtro de suscripción

Las casillas de veredicto en los ajustes del workspace deciden qué se entrega:

Payload

Cada entrega es un POST con un cuerpo JSON con esta forma:

{
  "id": "evt_01J8ZKQ2V5X6C7...",
  "event": "lead.review",
  "version": 1,
  "created_at": "2026-07-10T12:34:56+00:00",
  "test": false,
  "flow": { "public_id": "fl_8k2m9x", "name": "Before a demo", "language": "es" },
  "lead": {
    "uuid": "9b2f6c9e-...",
    "name": "María García",
    "email": "[email protected]",
    "phone": "+34 600 000 000",
    "company": "Example SL",
    "utm": { "utm_source": "meta" },
    "started_at": "2026-07-10T12:30:00+00:00",
    "completed_at": "2026-07-10T12:34:55+00:00"
  },
  "verdict": "review",
  "previous_verdict": null,
  "decided_by": "system",
  "revision": 1,
  "summary": "Budget named, timing unclear...",
  "criteria": [
    { "key": "budget", "label": "Budget", "polarity": "positive", "band": "high", "evidence": "\"around €2,000 a month\"" }
  ],
  "failed_gates": [],
  "missing_criteria": [],
  "links": { "lead": "https://useleadpass.com/app/leads/9b2f6c9e-..." }
}

Notas sobre los campos:

Cómo leer las bandas de los criterios según su polaridad

La band de cada criterio es una de no_data | very_low | low | medium | high | very_high. Lee siempre la banda a través de la polarity del criterio:

Polaridad Una banda alta significa Una banda baja significa
positive Favorable Desfavorable
risk Adverso Favorable

no_data significa que el lead no dio ninguna evidencia para ese criterio.

Orden: la última revisión gana

revision sube en 1 con cada veredicto decidido de un lead. Los reintentos pueden llegar desordenados, así que guarda la revision más alta que hayas visto por cada lead.uuid e ignora cualquier cosa por debajo. LeadPass también cancela por su lado las entregas en cola que han quedado superadas, pero la regla de la revisión es la garantía. Una revisión posterior puede llevar legítimamente el mismo verdict tras un re-análisis.

Deduplica por id: es estable entre reintentos del mismo evento.

Verificar la firma

Cada petición lleva estas cabeceras:

X-LeadPass-Signature: t=1760096096,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e163747325f37d9fa8c2fe...
X-LeadPass-Event: lead.review
X-LeadPass-Delivery: evt_01J8ZKQ2V5X6C7...

v1 es HMAC-SHA256(t + "." + rawBody, secret), calculado con el secreto de firma de tu workspace (Ajustes → Workspace → Webhook). Para verificarla:

  1. Extrae t (un timestamp Unix) y v1 de la cabecera X-LeadPass-Signature.
  2. Calcula HMAC-SHA256 sobre la cadena t + "." + rawBody usando el cuerpo crudo de la petición, sin parsear.
  3. Compara el resultado con v1 usando una comparación en tiempo constante.
  4. Rechaza los timestamps antiguos — ±5 minutos es una ventana razonable.

PHP

[$t, $v1] = [null, null];
foreach (explode(',', $request->header('X-LeadPass-Signature')) as $part) {
    [$k, $v] = explode('=', $part, 2);
    if ($k === 't') { $t = $v; }
    if ($k === 'v1') { $v1 = $v; }
}
$expected = hash_hmac('sha256', $t.'.'.$request->getContent(), $secret);
abort_unless(hash_equals($expected, (string) $v1) && abs(time() - (int) $t) < 300, 403);

Node.js

const crypto = require('crypto');

function verify(signatureHeader, rawBody, secret) {
  const parts = Object.fromEntries(
    signatureHeader.split(',').map((p) => p.split('=', 2))
  );
  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${parts.t}.${rawBody}`)
    .digest('hex');
  const valid =
    expected.length === (parts.v1 || '').length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return valid && fresh;
}

Asegúrate de que tu framework te da el cuerpo crudo de la petición para el HMAC — un objeto JSON re-serializado no coincidirá.

Regenerar el secreto (en la misma pestaña de Ajustes) se aplica desde el siguiente intento de entrega — actualiza primero tu receptor.

Entrega y reintentos

Desactivación automática tras fallos repetidos

Tras 10 entregas reales fallidas consecutivas sin ningún éxito entre medias, LeadPass apaga el webhook, cancela lo que siga en cola y envía un email al creador del workspace si sigue siendo miembro de la cuenta; si no, al propietario de la cuenta. Los veredictos decididos mientras el webhook está apagado no se reenvían después. Para recuperarlo: arregla tu receptor, vuelve a activar el webhook en los ajustes del workspace y confírmalo con Enviar evento de prueba. Los pings de prueba nunca cuentan para el contador de fallos.

Eventos de prueba

El botón Enviar evento de prueba de Ajustes → Workspace → Webhook envía un payload de ejemplo con:

Los eventos de prueba nunca describen a una persona real y nunca cuentan para el contador de fallos de la desactivación automática. Úsalos para montar el mapeo de campos y para confirmar que un receptor está sano después de reactivarlo. Mantienen la forma exacta de un evento real, incluida una cadena links.lead sintética, para que las herramientas no-code puedan descubrir todos los campos sin exponer ningún registro guardado.