Webhooks en tiempo real para llamadas de WhatsApp
Cada llamada de WhatsApp que recibe tu número puede disparar un webhook HTTP a tu plataforma de automatización. Úsalo para seguimientos de llamadas perdidas, creación de contactos en el CRM o para avisar al equipo de guardia. No es un agente de voz IA, es un stream limpio de eventos.
Resumen
Los webhooks de llamadas de WhatsApp dejan que Wazzap mande una petición HTTP en tiempo real a la URL que elijas cada vez que ocurre uno de cuatro eventos de llamada en un número conectado. El caso de uso más valioso son las llamadas perdidas: convierte cada una en un contacto y un workflow de seguimiento para que ningún prospecto se pierda.
Esta función es estrictamente un handler de eventos por webhook. No contesta llamadas, no transcribe audio, no corre un agente de voz. Para contestación por voz, revisa las herramientas de mensajería por voz.
Eventos
- Llamada entrante: dispara cuando se ofrece la llamada a tu número.
- Llamada aceptada: dispara cuando contestan.
- Llamada rechazada: dispara cuando declinan.
- Llamada perdida: dispara cuando nadie contesta.
Cada evento manda su propia petición HTTP, así puedes mandar cada uno a una URL distinta.
Configuración
Los webhooks se configuran a nivel número dentro del panel de sub-cuenta:
- Abre Números de WhatsApp.
- Selecciona el número específico.
- Abre Configuración.
- Ve a Calls Settings.
- Pega la URL del webhook para cada evento que quieras trackear.
- Guarda.
- Prueba con una llamada real. El endpoint solo se activa una vez que llega un evento real.
Cada número conectado se configura por separado.
Payload
Cada evento manda el mismo payload JSON compacto:
{
"event": "call.missed",
"phone": "+5215512345678",
"country": "MX",
"ts": "2026-05-14T14:32:11Z"
} El string event es uno de call.incoming, call.accept,
call.reject, call.missed. phone es el número del llamante
en formato E.164, country es el código de país ISO 3166-1 alpha-2.
HighLevel paso a paso
En HighLevel, conecta el webhook a un Inbound Webhook Trigger. El trigger dispara cuando Wazzap manda el evento de llamada. Desde ahí puedes:
- Buscar contacto por teléfono en el CRM.
- Si existe: actualizar el contacto con el timestamp de la última llamada.
- Si no: crear un nuevo contacto con teléfono y país.
- Acción opcional: mandar un SMS o disparar un WhatsApp con un disparador de etiqueta.
El Inbound Webhook Trigger es una acción premium en HighLevel y puede tener costo adicional. Revisa la documentación oficial de HighLevel para precios vigentes.
Ejemplo: llamada perdida
- Un prospecto llama a tu número de WhatsApp, nadie contesta.
- Wazzap manda al webhook de llamadas perdidas:
{
"event": "call.missed",
"phone": "+5215587654321",
"country": "MX",
"ts": "2026-05-14T14:32:11Z"
} - HighLevel no encuentra contacto con ese número, lo crea y aplica la etiqueta
callback-pendiente. - Un workflow escuchando esa etiqueta dispara un WhatsApp por Wazzap: "Hey, perdón que no contestamos, aquí tienes un link para agendar".
Notas importantes
- Los webhooks son por número. Un número nuevo necesita configuración nueva.
- El endpoint solo se activa después de una prueba con llamada real. No esperes tráfico en la URL hasta que dispares cada evento que configuraste.
- El payload solo trae
phone,country,eventyts. No diseñes workflows alrededor de campos que no existen. - Siempre manda los webhooks a endpoints HTTPS con un token secreto en la URL o en un header.
- Plataformas comunes que consumen estos webhooks: Zapier, Pabbly, HighLevel y n8n vía la integración nativa.
Solución de problemas
La URL del webhook nunca recibe una petición
Verifica que la URL sea públicamente accesible y regrese un estado 2xx. Wazzap no sigue redirecciones y no reintenta en errores 5xx. Prueba primero con una herramienta como webhook.site.
Las llamadas disparan pero solo algunos eventos llegan
Cada evento necesita su propia URL en Calls Settings. Si solo llenaste missed, ese es el único evento que va a disparar.
Para ruteo complejo (buscar contacto, ramificar, reintentar, loggear), usa n8n como destino del webhook. Mantienes el payload del evento pequeño y dejas que n8n haga el trabajo pesado.