Вебхук после звонка
Эта инструкция поможет настроить автоматическую отправку данных после каждого звонка в любую внешнюю систему: свою CRM, базу данных, аналитику или любой другой сервис с API.
Что умеет интеграция
После каждого звонка система может:
- Отправить данные на указанный URL в формате JSON.
- Заполнить любые поля из разговора — ИИ сам «вытащит» нужное из транскрипта по вашей схеме.
- Передать контекст о звонке: номер телефона, длительность, статус, исход и другие данные.
Интеграция универсальна: подходит для любой системы, у которой есть HTTP-endpoint для приёма данных.
Отправка только з аинтересованных диалогов
Опция «Отправлять только заинтересованные диалоги»:
- Включено (по умолчанию) — данные уйдут только по тем звонкам, которые система пометила как «Заинтересован». Остальные звонки не отправляются.
- Выключено — данные отправляются после каждого завершённого звонка, независимо от результата.
Для холодных обзвонов рекомендуется оставить включённым, чтобы не засорять систему незаинтересованными контактами.
URL для исходящего вебхука
В поле «URL для исходящего вебхука» укажите адрес, на который система будет отправлять данные — например:
https://your_crm.com/api/v1/create_new_client
Запрос будет отправлен методом POST с телом в формате JSON. Если URL недоступен или возвращает ошибку — отправка не повторяется.
Схема запроса
В поле «Схема запроса для вебхука» вы описываете, какие данные нужно извлечь из разговора и отправить. Это одновременно и «задание для ИИ», и шаблон финального JSON.
Есть несколько способов описать схему — используйте тот, который удобнее.
Способ 1: пример payload (самый простой)
Укажите JSON с примерам и значений. ИИ поймёт типы полей из примеров и заполнит их из разговора:
{
"phone": "79991234567",
"clientName": "Иван",
"callSummary": "Краткое описание звонка"
}
Способ 2: словарь поле → описание
Укажите JSON, где ключ — имя поля, значение — описание для ИИ:
{
"phone": "Номер телефона клиента",
"clientName": "Имя клиента",
"callSummary": "Краткое резюме разговора"
}
Способ 3: формат «поле — описание» (одно поле на строку)
Минималистичный текстовый формат — каждая строка содержит имя поля и описание через -:
phone - Номер телефона клиента
clientName - Имя клиента
callSummary - Краткое резюме разговора
Способ 4: полная JSON Schema
Для максимального контроля над типами данных:
{
"type": "object",
"properties": {
"phone": {
"type": "string",
"description": "Номер телефона клиента"
},
"clientName": {
"type": ["string", "null"],
"description": "Имя клиента"
},
"callSummary": {
"type": "string",
"description": "Краткое резюме звонка"
}
},
"required": ["phone", "clientName", "callSummary"],
"additionalProperties": false
}
Типы полей: "string" — текст, "integer" — целое число, "number" — дробное число, "boolean" — да/нет, ["string", "null"] — текст или пустое значение.
Важно: имена полей в схеме должны содержать только буквы, цифры и знак подчёркивания (_). Пробелы и дефисы не поддерживаются.
Инструкции для ИИ
В поле «Инструкции для ИИ» вы можете дать дополнительные правила — как заполнять поля, что делать при отсутствии данных, в каком формате записывать значения.
Примеры инструкций:
Если email не назван — установить null.
Бюджет указывай только числом, без знаков валюты.
Поле source всегда заполнять значением "ai_calls".
Эти инструкции передаются ИИ вместе со схемой. Если поле не заполнено — ИИ по умолчанию ставит null для отсутствующих данных.
Что ИИ знает при заполнении схемы
ИИ получает три источника контекста:
- Транскрипт звонка — полный текст разговора.
- Данные контакта — поля карточки контакта из вашей системы (если заполнены).
- Данные звонка — номера телефонов, длительность, время начала и конца, тип звонка, исход (
action_status), статус.
Это означает, что в схему можно включить любое из этих полей — ИИ заполнит их из данных звонка, не только из транскрипта.
| Поле | Описание | Возможные значения |
|---|---|---|
from_number | Номер, с которого звонили | строка |
to_number | Номер, на который звонили | строка |
call_duration | Длительность разговора в секундах | число |
start_time | Время начала звонка (ISO 8601) | строка |
end_time | Время окончания звонка (ISO 8601) | строка |
call_type | Т ип звонка | outbound (исходящий), inbound (входящий) |
action_status | Исход звонка, определённый ИИ | interested — заинтересован; transferred — переведён на оператора; scheduled — запланирован повторный звонок; null — исход не определён |
status | Технический статус звонка | new, in progress, finished, failed, busy_or_rejected, invalid number, insufficient funds, rejected, terminated, unavailable, voicemail |
call_data | Дополнительные данные звонка из вашей системы | объект (если заполнен) |
Пример: поставить метку по исходу звонка
Если в схеме есть поле lead_status и в инструкциях написано:
Если action_status в данных звонка равен "interested" — поле lead_status = "hot", иначе "cold".
ИИ корректно заполнит это поле на основе фактического исхода звонка.
Пример: полная настройка для CRM
Ниже — рабочий пример конфигурации для интеграции с CRM, где нужно передавать данные контакта, результат звонка, транскрипт и ряд дополнительных признаков.
В этом примере используется следующий подход:
- Схема запроса — JSON с примерами значений. Система определяет по ним структуру и типы полей.
- Инструкции для ИИ — содержат одновременно описания каждого поля и правила заполнения.
Схема запроса
{
"inn": "123456789012",
"name": "Евгений",
"phone": "79999999999",
"result": "успех",
"summary": "Клиент согласился связаться",
"messenger": "WhatsApp",
"easyToSay": "yes",
"callByName": "no",
"transcription": "ai: Добрый день, контакт: Ало",
"call_link": "https://example.com/record/123"
}
Инструкции для ИИ
Обязательные поля:
- inn: ИНН из детали контакта
- name: имя контакта из детали контакта
- phone: номер телефона контакта
- result: результат звонка. Одно из: "успех", "отказ", "не дозвонились"
- easyToSay: удобно ли говорить. Одно из: "yes", "no", или пустая строка если абонент не ответил
- callByName: ai произносил имя контакта (из поля name) в разговоре или нет. Смотри только реплики "ai:" в транскрипции — если там есть обращение по имени (например "Здравствуйте, Руслан!"), ставь "yes", иначе "no". Одно из: "yes", "no"
- summary: ключевая фраза клиента, максимум два предложения, без домыслов
- messenger: мессенджер только если точно слышишь от собеседника. Одно из: "WhatsApp", "Telegram", иначе пустая строка
- transcription: полный текст транскрипции разговора из контекста
- call_link: оставляй пустым
Правила:
- Если ai выявил заинтересованность и согласие на встречу и по статусу звонка (status в данных звонка) finished, ставь result = "успех"
- Если контакт явно отказался, неинтересно, уже работает с другими или сбросил звонок ставь result = "отказ"
- Если контакт не ответил, голосовая почта, недоступен, номер не ответил или по статусу звонка (status в данных звонка) не finished, ставь result = "не дозвонились"
- Если абонент ответил и подтвердил, что удобно говорить, ставь easyToSay = "yes"
- Если абонент ответил и сказал, что неудобно или сразу положил трубку, ставь easyToSay = "no"
- Если абонент не ответил (недоступен, голосовая почта, не взял трубку), easyToSay оставляй пустым
- callByName = "yes" только если в транскрипции в репликах ai есть имя контакта (из name). Например: "ai: Здравствуйте, Руслан!" или "ai: Руслан, удобно поговорить?"
- Если ai не обращался по имени (только "Здравствуйте!", "Удобно поговорить?" и т.п.), ставь callByName = "no"
- easyToSay и callByName передавай при любом result, если информация доступна
- При result = "отказ" всё равно передавай easyToSay, callByName, inn, name, phone, result, summary, messenger, transcription
- В summary — только фактический смысл сказанного клиентом. При голосовой почте — "Абонент не ответил на звонок."
- Услышал вотсап/ватсап — ставь messenger = "WhatsApp"
- Услышал телеграм/телеграмма — ставь messenger = "Telegram"
- Во всех остальных случаях messenger оставляй пустым
- При обрывах, частичной транскрипции, неразборчивой речи вебхук всё равно отправляй, заполняй все поля по мере возможности
- Не придумывай ответы за контакта, используй только указанные значения строк
- Если данных нет или одна–две фразы: easyToSay, callByName, inn, name, phone, result передавай; summary и messenger оставь пустыми; transcription заполняй из транскрипта
Что делать, если что-то не работает
| Что происходит | Что проверить |
|---|---|
| Данные не отправляются | Проверьте, что поле «URL для исходящего вебхука» заполнено. Убедитесь, что URL доступен снаружи и принимает POST-запросы с телом в JSON. |
Поля приходят пустыми или все null | Убедитесь, что описания полей в схеме понятны: ИИ ориентируется на текст описания, чтобы понять, что искать в разговоре. |
| Ошибка схемы | Схема должна описывать объект. Проверьте валидность JSON (если используете JSON-формат). Имена полей — только буквы, цифры, подчёркивание. |
| Данные отправляются не после каждого звонка | Включена опция «Отправлять только заинтересованные диалоги». Если нужны все звонки — выключите её. |
| Данные уходят, но принимающая сторона возвращает ошибку | Сверьте имена и типы полей в схеме с тем, что ожидает ваш API. Используйте полную JSON Schema для точного контроля типов. |
Если проблема не решается — сохраните текст ошибки и обратитесь в поддержку, указав URL вебхука и схему запроса.