Skip to content

Webhook after the call ​

The webhook after the call sends all data of a finished conversation to your server: who called, for how long, the outcome, the summary, the transcript and the custom variables you defined. It is the basis for connections to a CRM, Slack or a spreadsheet.

You create it per assistant as an HTTP request under Assistants → Tasks, on the Actions card: click Add new, choose HTTP request and leave When on After the conversation. This takes the Editor or Admin role.

When is it called? ​

After hang-up the platform waits until the summary has been written and the custom variables have been extracted, then sends the request. That is usually within a minute of the end of the call. For text channels this happens as soon as the conversation is closed: when the assistant wraps it up, when someone clicks End conversation in the Inbox, or after a time without activity: on webchat the Inactivity timeout (60 minutes by default), on SMS and WhatsApp 6 hours (with your team: not while the customer waits for an answer, after that 18 quiet hours).

The webhook fires for every conversation of an assistant the action is attached to, inbound and outbound, including outcomes such as no_interaction or spam. If you only want certain conversations, fill in Under what condition should this run after the conversation? on the action in plain language, or filter on outcome on your side.

If the customer said nothing or the analysis failed, there is no summary and there are no custom variables. summary then stays empty and an action with a condition does not run.

In Try it out the webhook fires under Real call, because that is a real call. Under Chat it only fires with Perform actions for real on, and only once the assistant closes the conversation. The same applies under Call if you type a message while no call is running. A call you hold there with Start call does not send the webhook.

The default body ​

If you leave the action's Body template empty, we send a POST (the default method) with all built-in variables plus your custom variables as JSON, with the X-Yarla-Signature header (see Webhooks). With GET, neither a body nor a signature is sent.

json
{
  "personNumber": "+31612345678",
  "agentNumber": "+31201234567",
  "conversationId": "v3:8fK2mQ7xT1pLw9Zr",
  "conversationLink": "https://<dashboard-domain>/en/inbox/v3%3A8fK2mQ7xT1pLw9Zr",
  "startTimestamp": "2026-09-10T14:02:11.000Z",
  "direction": "inbound",
  "channel": "voice",
  "durationSeconds": 187,
  "disconnectReason": "normal_clearing",
  "summary": "Jan de Vries reports a leaking kitchen tap that has been dripping for two days. He wants a quote and is reachable after 17:00.",
  "plainTranscript": "Assistant: Good afternoon, this is Anna from Jansen Plumbing. How can I help you?\nCustomer: My kitchen tap has been leaking for two days.\nAssistant: That is annoying. May I take your name and address?\n...",
  "audioLink": "https://<dashboard-domain>/en/inbox/v3%3A8fK2mQ7xT1pLw9Zr",
  "outcome": "resolved",
  "assistant": { "name": "Anna" },
  "company": {
    "name": "Jansen Plumbing",
    "website": "https://jansenplumbing.example",
    "phone": "+31201234567",
    "email": "info@jansenplumbing.example",
    "address": ""
  },
  "contact": { "name": "Jan de Vries", "company": "" },
  "inboundContext": { "customerName": "Jan de Vries", "customerId": "C-1042" },
  "issueType": "leak",
  "urgency": "normal",
  "callbackAfter": "17:00"
}
FieldMeaning
personNumberNumber of the caller or recipient (E.164). Empty for webchat.
agentNumberYour number the conversation ran on. Empty for webchat.
conversationIdUnique id of the conversation, the same as id in the API. Its form differs per channel (for SMS, for example, sms:01J8ZK3Q7X4M9V2RT6B5N8WPHA), so treat it as text.
conversationLinkDirect link to the conversation in the Inbox, in your business's language.
startTimestampStart of the conversation, ISO 8601 in UTC.
directioninbound or outbound.
channelvoice (phone call), sms, whatsapp or webchat.
durationSecondsDuration in seconds. 0 for SMS, WhatsApp and webchat.
disconnectReasonTechnical code for why the phone call ended, for example completed, transferred, normal_clearing or user_busy. Empty for SMS, WhatsApp and webchat.
summarySummary written by the AI model.
plainTranscriptThe transcript as text. Every message starts with Customer: or Assistant:, in every language. A message with line breaks spans several lines, and replies from your team also appear under Assistant:. Internal markers in square brackets can also appear.
audioLinkLink to the conversation in the Inbox, where you can listen to the recording. This is not a link to an audio file. Empty if there is no recording, for example when Record calls is off or for text channels. Recordings are deleted after 30 days.
outcomeresolved, transferred, appointment_booked, callback_requested, voicemail, abandoned, no_interaction or spam.
assistant.nameName of the assistant.
company.nameName of your business.
company.website, company.phone, company.emailYour website and the phone number and e-mail address for customers. Empty if you have not filled them in.
company.addressYour address, only when you share it with customers. Otherwise empty.
contact.name, contact.companyDetails of the linked contact. Empty if no contact belongs to the conversation. Also empty for an outbound call to a number that already has a contact, and when the contact was added after the conversation began.
inboundContextAll fields your inbound webhook returned. Empty object if it did not run, such as for outbound calls and text channels.
Your custom variables, here issueType, urgency and callbackAfterEach under its own name at the top level, not in a separate object. These are the Custom variables to extract of all enabled after-the-conversation actions of this assistant. A variable that did not come out of the conversation is left out. A custom variable named after a built-in variable overwrites it. For outbound calls these also include the variables of the campaign or API call.

A custom body ​

If your system expects a specific format, build your own body with variables in the action. Use built-in variables by name, nested fields with a dot, and custom variables directly by their own name.

json
{
  "text": "New conversation ({{outcome}}) from {{personNumber}}: {{summary}} — {{conversationLink}}",
  "ticket": {
    "externalId": "{{conversationId}}",
    "customer": "{{contact.name}}",
    "customerId": "{{inboundContext.customerId}}",
    "issue": "{{issueType}}",
    "urgency": "{{urgency}}"
  }
}

Put variables in JSON between quotes; only a whole object, such as {{inboundContext}}, goes without them. If your body starts with { or [, we make sure quotes and line breaks in the values do not break the JSON, so long text such as plainTranscript can go in too. A variable without a value becomes empty. All available variables are listed in Actions.

The response ​

We only look at the status code of your response. A status in the 2xx range means success; anything else, or no response within 8 seconds, is marked as failed. The content of your response is otherwise ignored; on a failure we only keep the first 300 characters as an explanation. Use the final address: a redirect with 301, 302 or 303 turns a POST into a GET without a body.

Failed requests are not retried automatically, and you cannot re-run them manually either. You see the result on the conversation in the Inbox: expand Technical details and look under What the actions did. So respond with 200 immediately and process the data afterwards, so that a slow CRM connection never causes a failure.

Idempotency ​

We send one request per action per conversation. Even so, the same conversation can reach you more than once, for example because a step in between such as Make or your own queue retries, or because several actions post to the same endpoint. Use conversationId to avoid double processing:

  • store the processed ids and skip a request with a known id, or
  • use the id as the external key in your CRM and update the existing record instead of creating a new one.

Common uses ​

  • CRM: create a ticket or note on the contact, with summary and conversationLink.
  • Slack or Teams: one message per conversation in a channel, so the team can follow up straight away.
  • Spreadsheet or database: one row per conversation for reporting. For Google Sheets there is a separate action that needs no endpoint.
  • Callback list: forward only conversations with outcome equal to callback_requested to your planning.

Ready-made steps for Make, n8n and Zapier are in Make & n8n recipes.

Yarla Help — the guide to your AI phone assistant.