Webhooks (Salientes)
Los webhooks permiten que SalesOS llame a tu sistema cuando algo ocurre (un lead es ofertado, un ranking se publica, un mensaje se despacha). Nos das una URL HTTPS y un secreto; hacemosPOST de un
payload JSON firmado cada vez que dispara un evento suscrito.
Esta página cubre webhooks salientes (SalesOS → tu endpoint). Para enviar datos hacia SalesOS,
consulta Actividades y API Keys.
Configurar un webhook en el Dashboard
Ve a Integraciones → Webhooks → Nuevo Webhook y completa el formulario.Básico
- Nombre (obligatorio) — ej.:
Notificar CRM. - Clave — un identificador estable (ej.:
notify_crm). - Descripción — opcional.
Eventos (disparadores)
Elige una Categoría y selecciona los eventos que disparan este webhook — esta es tu
suscripción (ver el catálogo). Déjalo vacío para un webhook que solo
disparas manualmente (botón Probar) o desde un workflow.
Destino
- Método —
POST(por defecto),PUToPATCH. - Timeout (segundos) — cuánto esperamos tu
2xx(por defecto 30). - URL (obligatorio) — tu endpoint. Debe ser
https://y público (hosts internos/loopback están bloqueados). - Autenticación — elige HMAC para firmar cada entrega y, en Configuración de Autenticación (JSON), indica tu secreto:
(Otros esquemas disponibles: Bearer, API Key, Basic, OAuth2.)
Avanzado
- Headers Personalizados (JSON) — headers extra enviados en cada entrega.
- Plantilla del Payload (JSON con variables
{{ }}) — modela eldatadel envelope a partir del contexto del evento, ej.:{ "id": "{{event.id}}", "type": "{{event.type}}", "to": "{{event.to}}" }.
El envelope
En la ruta de evento, cada entrega es un único objeto JSON:| Campo | Descripción |
|---|---|
id | Id único del evento, estable entre reintentos → tu clave de idempotencia. |
type | Tipo de evento (ver catálogo). |
version | Versión del schema de data. Evoluciona de forma aditiva. |
ts | Cuándo ocurrió el evento (ISO 8601, UTC). |
tenant | Tenant de origen (uuid). |
data | Payload específico del evento. |
Headers
| Header | Descripción |
|---|---|
X-SalesOS-Event | Tipo de evento — enruta sin leer el cuerpo. |
X-SalesOS-Event-Id | Igual a id; estable entre reintentos (idempotencia). |
X-SalesOS-Delivery-Id | Id del intento (cambia en cada reintento; para depurar). |
X-SalesOS-Timestamp | Unix en segundos — parte de la firma (anti-replay). |
X-SalesOS-Tenant | Id del tenant de origen. |
X-SalesOS-Signature | sha256=<hmac> — ver Verificar. |
Verificar la firma
En la ruta de evento, la firma cubre{id}.{timestamp}.{rawBody} (estilo Standard Webhooks), por lo
que autentica el payload y el timestamp (anti-replay). Recalcula el HMAC con tu secreto, compara en
tiempo constante y rechaza si el timestamp está a más de 300s.
Entregas de prueba (el botón “Probar Webhook”) y los disparadores legados de workflow usan hoy un
esquema más simple: el cuerpo es la plantilla renderizada cruda (no el envelope) y el header de firma es
X-Signature: <prefijo><hmac(cuerpo)> — sin el prefijo id.timestamp., por lo que no tiene
anti-replay. Prefiere la ruta de evento de arriba en producción.Catálogo de eventos
type | Cuándo dispara | data |
|---|---|---|
lead.offer_created | Un lead es ofertado a un corredor | payload del lead/oportunidad |
lead.accepted | Un corredor acepta un lead | payload del lead/oportunidad |
lead.offer_expired | Una oferta expira sin aceptación | payload del lead/oportunidad |
mission.completed | Una misión se completa | payload de la misión |
ranking.weekly.published | Ranking semanal publicado (programado) | leaderboard (filas por email) |
ranking.consolidated.published | Ranking consolidado publicado | leaderboard (filas por email) |
message.dispatch | Mensaje despachado a un usuario/grupo | { to, m } |
notification.push.dispatch | Push despachado a un usuario/grupo | { to, n } |
data para ranking.weekly.published:
Confiabilidad
Responde rápido. Devuelve un estado2xx rápidamente (antes de procesamiento pesado) para confirmar la recepción.
| Tu respuesta | Qué hace SalesOS |
|---|---|
2xx | Marca la entrega como completada. Sin reintento. |
4xx (400, 401, 422…) | Tratado como rechazo permanente. Sin reintento (excepto 429, que respeta el backoff). |
5xx / timeout / error de conexión | Reentrega con backoff exponencial (2^n minutos, hasta 5 intentos), luego dead-letter. |
X-SalesOS-Event-Id — se mantiene igual entre reintentos.

