Webhook después de la llamada
El webhook después de la llamada envía a tu servidor todos los datos de una conversación terminada: quién llamó, cuánto duró, el resultado, el resumen, la transcripción y las variables personalizadas que hayas definido. Es la base para conectar con un CRM, Slack o una hoja de cálculo.
Se crea por asistente como una petición HTTP en Asistentes → Tareas, en la tarjeta Acciones: haz clic en Añadir nuevo, elige Petición HTTP y deja Cuándo en Después de la conversación. Para ello necesitas el rol Editor o Administrador.
¿Cuándo se envía?
Después de colgar, la plataforma espera a que se haya escrito el resumen y se hayan extraído las variables personalizadas, y entonces envía la petición. Normalmente ocurre en menos de un minuto desde el final de la llamada. En los canales de texto ocurre en cuanto se cierra la conversación: cuando el asistente la da por terminada, cuando alguien hace clic en Terminar conversación en la Bandeja, o tras un tiempo sin actividad: en el chat web, el Tiempo de inactividad (60 minutos por defecto); en SMS y WhatsApp, 6 horas (con tu equipo: no mientras el cliente espera una respuesta; después, tras 18 horas sin actividad).
El webhook se envía en cada conversación de un asistente que tenga la acción, entrante o saliente, también con resultados como no_interaction o spam. Si solo quieres recibir ciertas conversaciones, rellena en lenguaje llano ¿Con qué condición debe ejecutarse después de la conversación? en la acción, o filtra por outcome en tu sistema.
Si el cliente no dijo nada o el análisis falló, no hay resumen ni variables personalizadas. summary queda vacío y una acción con condición no se ejecuta.
En Probar, el webhook se envía en Llamada real, porque es una llamada de verdad. En Chatear solo se envía con Ejecutar las acciones de verdad activado, y únicamente cuando el asistente cierra la conversación. Lo mismo ocurre en Llamar si escribes un mensaje mientras no hay ninguna llamada en curso. Una llamada que mantengas ahí con Iniciar llamada no envía el webhook.
El cuerpo predeterminado
Si dejas vacía la Plantilla del cuerpo de la acción, enviamos un POST (el método predeterminado) con todas las variables integradas más tus variables personalizadas en JSON, con la cabecera X-Yarla-Signature (consulta Webhooks). Con GET no se envía ni cuerpo ni firma.
{
"personNumber": "+31612345678",
"agentNumber": "+31201234567",
"conversationId": "v3:8fK2mQ7xT1pLw9Zr",
"conversationLink": "https://<dashboard-domain>/es/inbox/v3%3A8fK2mQ7xT1pLw9Zr",
"startTimestamp": "2026-09-10T14:02:11.000Z",
"direction": "inbound",
"channel": "voice",
"durationSeconds": 187,
"disconnectReason": "normal_clearing",
"summary": "Jan de Vries informa de un grifo de cocina que lleva dos días goteando. Quiere un presupuesto y está disponible a partir de las 17:00.",
"plainTranscript": "Assistant: Buenas tardes, soy Anna, de Fontanería Jansen. ¿En qué puedo ayudarte?\nCustomer: El grifo de la cocina lleva dos días perdiendo agua.\nAssistant: Vaya, lo siento. ¿Me dices tu nombre y tu dirección?\n...",
"audioLink": "https://<dashboard-domain>/es/inbox/v3%3A8fK2mQ7xT1pLw9Zr",
"outcome": "resolved",
"assistant": { "name": "Anna" },
"company": {
"name": "Fontanería Jansen",
"website": "https://fontaneriajansen.example",
"phone": "+31201234567",
"email": "info@fontaneriajansen.example",
"address": ""
},
"contact": { "name": "Jan de Vries", "company": "" },
"inboundContext": { "customerName": "Jan de Vries", "customerId": "C-1042" },
"issueType": "fuga",
"urgency": "normal",
"callbackAfter": "17:00"
}| Campo | Significado |
|---|---|
personNumber | Número de quien llama o recibe la llamada (E.164). Vacío en el chat web. |
agentNumber | Tu número en el que tuvo lugar la conversación. Vacío en el chat web. |
conversationId | Id único de la conversación, el mismo que id en la API. Su forma varía según el canal (en SMS, por ejemplo, sms:01J8ZK3Q7X4M9V2RT6B5N8WPHA), así que trátalo como texto. |
conversationLink | Enlace directo a la conversación en la Bandeja, en el idioma de tu empresa. |
startTimestamp | Inicio de la conversación, ISO 8601 en UTC. |
direction | inbound (entrante) o outbound (saliente). |
channel | voice (llamada), sms, whatsapp o webchat. |
durationSeconds | Duración en segundos. 0 en SMS, WhatsApp y chat web. |
disconnectReason | Código técnico del motivo por el que terminó la llamada, por ejemplo completed, transferred, normal_clearing o user_busy. Vacío en SMS, WhatsApp y chat web. |
summary | Resumen escrito por el modelo de IA. |
plainTranscript | La transcripción en texto. Cada mensaje empieza por Customer: o Assistant:, en cualquier idioma. Un mensaje con saltos de línea ocupa varias líneas, y las respuestas de tu equipo también aparecen como Assistant:. También pueden aparecer marcas internas entre corchetes. |
audioLink | Enlace a la conversación en la Bandeja, donde puedes escuchar la grabación. No es un enlace a un archivo de audio. Vacío si no hay grabación, por ejemplo si Grabar llamadas está desactivado o en los canales de texto. Las grabaciones se eliminan a los 30 días. |
outcome | resolved, transferred, appointment_booked, callback_requested, voicemail, abandoned, no_interaction o spam. |
assistant.name | Nombre del asistente. |
company.name | El nombre de tu empresa. |
company.website, company.phone, company.email | Tu sitio web y el teléfono y el correo para clientes. Vacíos si no los has rellenado. |
company.address | Tu dirección, solo si la compartes con los clientes. Si no, vacía. |
contact.name, contact.company | Datos del contacto vinculado. Vacíos si la conversación no tiene un contacto. También vacíos en una llamada saliente a un número que ya tiene un contacto, y si el contacto se añadió después de que empezara la conversación. |
inboundContext | Todos los campos que devolvió tu webhook entrante. Objeto vacío si no se ejecutó, como en las llamadas salientes y los canales de texto. |
Tus variables personalizadas, aquí issueType, urgency y callbackAfter | Cada una con su propio nombre en el nivel superior, no dentro de un objeto aparte. Son las Variables personalizadas que extraer de todas las acciones activas de después de la conversación de este asistente. Una variable que no salió de la conversación no aparece. Una variable personalizada con el nombre de una integrada la sobrescribe. En las llamadas salientes también incluyen las variables de la campaña o de la llamada a la API. |
Un cuerpo propio
Si tu sistema espera un formato concreto, crea en la acción tu propio cuerpo con variables. Las variables integradas se usan por su nombre, los campos anidados con un punto y las variables personalizadas directamente por su nombre.
{
"text": "Nueva conversación ({{outcome}}) de {{personNumber}}: {{summary}} — {{conversationLink}}",
"ticket": {
"externalId": "{{conversationId}}",
"customer": "{{contact.name}}",
"customerId": "{{inboundContext.customerId}}",
"issue": "{{issueType}}",
"urgency": "{{urgency}}"
}
}Pon las variables en JSON entre comillas; solo un objeto completo, como {{inboundContext}}, va sin ellas. Si tu cuerpo empieza por { o [, nos encargamos de que las comillas y los saltos de línea de los valores no rompan el JSON, así que también puedes incluir textos largos como plainTranscript. Una variable sin valor queda vacía. Todas las variables disponibles están en Acciones.
La respuesta
De tu respuesta solo miramos el código de estado. Un estado en el rango 2xx significa que ha ido bien; cualquier otro, o no recibir respuesta en 8 segundos, se marca como fallido. El contenido de tu respuesta se ignora; si falla, solo guardamos los primeros 300 caracteres como explicación. Usa la dirección definitiva: una redirección con 301, 302 o 303 convierte un POST en un GET sin cuerpo.
Las peticiones fallidas no se reintentan automáticamente, y tampoco puedes volver a ejecutarlas a mano. El resultado se ve en la conversación en la Bandeja: despliega Detalles técnicos y mira en Qué hicieron las acciones. Por eso, responde de inmediato con 200 y procesa los datos después, para que una conexión lenta con el CRM nunca provoque un fallo.
Idempotencia
Enviamos una petición por acción y conversación. Aun así, la misma conversación puede llegarte más de una vez, por ejemplo porque un paso intermedio como Make o tu propia cola reintenta, o porque varias acciones envían al mismo endpoint. Usa conversationId para evitar procesarla dos veces:
- guarda los ids procesados y omite una petición con un id conocido, o
- usa el id como clave externa en tu CRM y actualiza el registro existente en lugar de crear uno nuevo.
Usos habituales
- CRM: crear un ticket o una nota en el contacto, con
summaryyconversationLink. - Slack o Teams: un mensaje por conversación en un canal, para que el equipo pueda hacer el seguimiento enseguida.
- Hoja de cálculo o base de datos: una fila por conversación para tus informes. Para Google Sheets hay una acción aparte que no necesita endpoint.
- Lista de devoluciones de llamada: reenvía a tu planificación solo las conversaciones con
outcomeigual acallback_requested.
Encontrarás pasos listos para usar con Make, n8n y Zapier en Make y n8n.