8. Integraciones — Webhooks salientes
Los webhooks salientes permiten a NoviaMind notificar a tus propios sistemas en el momento en que cambian tus datos de CRM — sin necesidad de consultar la API continuamente. Usos típicos: disparar un flujo de n8n / Make / Zapier cuando se captura un nuevo prospecto, o mantener sincronizada una herramienta interna.
Accede desde Integraciones → Webhooks salientes en la sección CRM.
8.9 Eventos disponibles
| Evento | Se envía cuando |
|---|---|
lead.created | Se crea un prospecto |
lead.updated | Se actualiza un prospecto |
property.created | Se crea una propiedad |
property.updated | Se actualiza una propiedad |
realtor.created | Se crea un agente |
realtor.updated | Se actualiza un agente |
Un webhook se suscribe a uno o más eventos — solo esos disparan una entrega a tu URL.
8.10 Crear un webhook
- Ve a Integraciones → Webhooks salientes
- Haz clic en «Añadir webhook»
- Introduce tu URL de retorno (debe ser
https://en producción;http://solo se acepta para pruebas locales, p. ej. un túnel de ngrok) - Añade opcionalmente una descripción (p. ej. «flujo de n8n en producción»)
- Selecciona los eventos a los que suscribirte
- Haz clic en «Guardar»
⚠️ Guarda el secreto de firma inmediatamente. Tras la creación, NoviaMind muestra el secreto (
whsec_...) una única vez. Cualquier consulta posterior lo muestra enmascarado. Si lo pierdes, elimina el webhook y crea uno nuevo.
💡 Las URL que apuntan a direcciones de red privadas o internas se rechazan por motivos de seguridad.
8.11 Qué recibe tu endpoint
Cada entrega es una petición HTTP POST con un cuerpo JSON:
Y estas cabeceras:
| Cabecera | Contenido |
|---|---|
X-Webhook-Id | Identificador único de la entrega (también el id del cuerpo) |
X-Webhook-Event | Nombre del evento (p. ej. lead.created) |
X-Webhook-Signature | sha256=<hex> — firma HMAC-SHA256 del cuerpo sin procesar |
Formato de data por entidad
data no es un DTO de respuesta depurado: es la fila completa del prospecto/inmueble/agente tal y como está almacenada, por lo que puede incluir más campos de los documentados a continuación (trata los campos desconocidos como compatibles hacia delante, no los rechaces) y cualquier campo nullable que no uses vale simplemente null.
lead.created / lead.updated — data es el prospecto. Captura real (de una llamada con el agente de IA, con los secretos/datos personales acortados y notes y los bloques de recopilación de datos de la IA en custom_fields / raw_data truncados por longitud — en la práctica notes contiene el resumen completo de la llamada y custom_fields.* una entrada por cada campo de recopilación configurado):
💡 Los identificadores internos de seguimiento de llamadas se eliminan antes de que la carga útil salga de NoviaMind: nunca verás un campo
conversation_ids, aunque sea una columna real del registro subyacente.💡
custom_fieldsyraw_data.data_collection_resultsprovienen ambos de la extracción de campos de la IA y se solapan en gran medida (raw_dataes la extracción tal y como se capturó originalmente;custom_fieldses lo que realmente se persiste en el prospecto). Cada entrada llevavalue,rationale(por qué la IA extrajo ese valor) ydata_collection_id; algunas entradas incluyen además un bloquejson_schemaque describe el tipo/enum esperado del campo.valueesnullcon frecuencia cuando la IA no encontró nada que extraer para ese campo durante la llamada.
property.created / property.updated — data es el inmueble:
realtor.created / realtor.updated — data es el agente:
💡 Las entregas
webhook.test(desde el botón «Enviar prueba») no coinciden con ninguna de las formas anteriores:dataes simplemente{ "message": "This is a test webhook delivery from NoviaMind." }.
Verificar la firma
Calcula un HMAC-SHA256 de los bytes sin procesar del cuerpo de la petición (no del objeto re-serializado/parseado: cualquier diferencia en el orden de las claves o en los espacios hará que la firma no coincida) con tu secreto de firma y compáralo con la cabecera X-Webhook-Signature usando una comparación de tiempo constante. Ejemplo con Node/Express, asumiendo que la ruta tiene acceso al cuerpo sin procesar (p. ej. express.raw({ type: 'application/json' }) montado solo en esta ruta, antes de cualquier parser de cuerpo JSON):
💡 En n8n, el nodo Webhook te da el cuerpo sin procesar mediante su opción de datos binarios/raw: verifícalo en un nodo Code con la misma lógica antes de confiar en
event.data, o simplemente mantén la URL en secreto si la verificación de firma no es necesaria para tu caso de uso.
Tu endpoint debe responder con un estado 2xx en menos de 10 segundos. Cualquier otra respuesta cuenta como fallo.
8.12 Probar un webhook
Haz clic en «Enviar prueba» en la fila de un webhook. NoviaMind envía un evento sintético webhook.test, firmado exactamente igual que una entrega real, y te muestra el estado HTTP que devolvió tu endpoint — ideal para validar tu flujo de n8n o tu verificación de firma antes de pasar a producción.
8.13 Reintentos, fallos y desactivación automática
- Cada evento se entrega con hasta 5 intentos y backoff exponencial.
- La fila del webhook muestra el estado de la última entrega y el número de fallos consecutivos.
- Tras 20 fallos consecutivos, el webhook se desactiva automáticamente para que una URL muerta deje de consumir intentos de entrega. Arregla tu endpoint y haz clic en «Reactivar».
- Cualquier entrega exitosa pone el contador de fallos a cero.
Historial de entregas
Haz clic en «Historial» para ver las últimas entregas (hasta 50, conservadas 30 días): fecha y hora, evento, estado HTTP y número de intento. Solo se almacenan metadatos del resultado — nunca el contenido del payload.
8.14 Gestionar webhooks
| Acción | Quién puede hacerlo |
|---|---|
| Ver webhooks e historial | Todos los miembros del equipo |
| Crear, editar, probar, activar/desactivar | Administradores y miembros regulares |
| Eliminar | Solo administradores |
- Activar / Desactivar: pausa las entregas sin perder la configuración (interruptor en cada fila).
- Editar: cambia la URL, la descripción o los eventos suscritos en cualquier momento. El secreto de firma nunca cambia.
- Rotar el secreto: elimina el webhook y crea uno nuevo.
💡 Los desarrolladores encontrarán la referencia completa de la API (endpoints, esquemas, detalles de firma) en la documentación de la API enlazada desde el diálogo de webhooks.