IP-телефония и CRM: звонок из карточки и запись разговоров
АйТи Фреш
IT-аутсорсинг и бизнес

Звонок в один клик и запись разговоров: как связать CRM с IP-телефонией

Автор: , директор ООО «АйТи-Фреш» · · ~14 мин чтения
Телефонная трубка со шнуром-пунктиром к карточке клиента в турагентстве: связка CRM и IP-телефонии
Звонок начинается в карточке клиента и в ней же сохраняется.

Связка CRM и IP-телефонии работает на трёх событиях: CRM командой через API просит АТС совершить звонок, АТС присылает события вызова, а запись остаётся на стороне АТС со ссылкой в карточке. Ниже: как устроен звонок в один клик, как находится клиент при входящем и что проверить до запуска.

Что даёт связка CRM и АТС и что она не заменяет

Связка CRM и телефонии решает три задачи менеджера. Позвонить клиенту из карточки в один клик, не набирая номер руками. Увидеть, кто звонит, ещё до ответа: на экране открывается карточка с историей. Сохранить факт разговора и запись в ленте клиента, чтобы коллега, подхвативший сделку, знал, о чём говорили. Всё остальное, от речевой аналитики до роботов-обзвонщиков, строится поверх этих трёх возможностей. Если вы смотрите на нашу CRM с AI-отделом продаж, то сейчас там работают Telegram-бот, почта и веб-форма, а телефония и АТС стоят в очереди разработки. Поэтому в статье я разбираю механику связки в целом, а не обещаю готовую кнопку.

Чего связка не заменяет. Она не заменяет саму АТС: звонки, номерной план, очереди, переадресацию и транки по-прежнему обслуживает телефония. CRM только управляет вызовом и записывает его результаты. Она не заменяет и дисциплину: если менеджеры звонят с личных телефонов, в системе ничего не появится. Наконец, она не решает проблему плохих данных: если номера в базе хранятся в пяти форматах, карточка при входящем не откроется.

Какие бывают схемы подключения. Облачная АТС с открытым API и вебхуками событий: CRM шлёт запросы по HTTPS, АТС присылает события на публичный адрес. Своя АТС на Asterisk или FreePBX, где CRM или промежуточный сервис общается с интерфейсом управления (AMI). Готовый коннектор, который уже умеет работать с вашей АТС и вашей CRM. Выбор зависит от того, есть ли у вас администратор АТС и насколько вам нужна гибкость. О самой телефонии мы писали в материалах про IP-телефонию для малого офиса и про облачную АТС.

Из примеров открытых CRM: в Frappe CRM есть журнал звонков, из карточек сделки и лида можно звонить по значку телефона, а записи разговоров доступны в истории. Встроенных интеграций с операторами две: в описании репозитория Frappe CRM указаны Twilio и Exotel, обе умеют исходящие, входящие и запись. Обе требуют отдельного аккаунта у этих провайдеров, а для российской облачной АТС или своего Asterisk коннектор придётся писать отдельно. Поведение конкретной связки на вашей версии CRM проверьте на тестовом стенде до запуска.

Связка управляет звонками, но не заменяет телефонию и не исправляет грязные номера в базе. Начните с приведения номеров к одному формату.

Как работает звонок в один клик: сначала звонит ваш телефон, потом клиент

Звонок в один клик (click-to-call) идёт в два этапа, и это главное, что нужно понять. Менеджер нажимает кнопку в карточке. CRM отправляет в API АТС команду, где указаны внутренний номер сотрудника и номер клиента. АТС сначала звонит на аппарат менеджера. Когда он снимает трубку, АТС набирает клиента и соединяет их. Если менеджер не ответил, клиенту никто не звонит, и это защита от ситуации, когда клиент берёт трубку и слышит тишину.

В терминах Asterisk эта команда называется Originate. Документация описывает её как действие, генерирующее исходящий вызов на канал с последующим соединением с добавочным номером или запуском приложения. Обязательны канал, а также либо связка «добавочный, контекст, приоритет», либо «приложение и данные». Из необязательных нужны идентификатор вызывающего (CallerID) и Async, ускоряющий создание вызова без ожидания. Пример действия AMI для иллюстрации, значения канала и контекста зависят от вашей АТС.

Action: Originate
Channel: PJSIP/101
Exten: 79000000000
Context: from-internal
Priority: 1
CallerID: CRM <79000000000>
Async: true

В примере 101 — внутренний номер менеджера, а номер клиента условный. Имя канала, контекст и правила набора определяются вашим номерным планом, поэтому копировать эти строки без проверки нельзя.

Облачные телефонии устроены похоже, только вместо AMI у них REST. Например, в документации Twilio для исходящего вызова обязательны номер, куда звонить, номер-источник и инструкции по обработке, а для событий используется StatusCallback, который присылает уведомления о ходе вызова: инициирован, звонит, отвечен, завершён. У российских провайдеров набор параметров свой, но принцип тот же: запрос на создание вызова, затем события.

Что должна уметь CRM, чтобы это работало. Знать внутренний номер каждого менеджера и сопоставлять его с пользователем. Выбирать, с какого внешнего номера идёт исходящий. Записывать в ленту клиента попытку звонка, а не только состоявшийся разговор: «звонили, не дозвонились» тоже важный факт. Блокировать повторное нажатие кнопки на время вызова, иначе менеджер получит три звонка подряд. Если вы строите связку на готовой CRM, вы всё это проверяете, а не создаёте.

Схема шагов для обсуждения с телефонистом. | Шаг | Кто | Что происходит | |---|---|---| | 1 | Менеджер | нажимает кнопку в карточке | | 2 | CRM | отправляет в API АТС запрос на вызов | | 3 | АТС | звонит на телефон менеджера | | 4 | Менеджер | отвечает | | 5 | АТС | набирает клиента и соединяет | | 6 | АТС | присылает событие завершения и ссылку на запись | | 7 | CRM | сохраняет звонок в истории карточки |

Входящий звонок: как CRM находит клиента и открывает карточку

Для входящего вызова обмен идёт в обратную сторону. АТС получает звонок и сообщает CRM номер звонящего, обычно вебхуком на адрес CRM. CRM ищет этот номер среди контактов, находит карточку и показывает её ответственному менеджеру, а если контакт не найден, предлагает создать лид. В итоге менеджер снимает трубку, уже зная, кто звонит, и видит последние обращения.

Узкое место этого сценария — формат номеров. Один и тот же клиент записан как «8 900 000-00-00», «+7 900 000 00 00» и «9000000000», и поиск по точному совпадению его не найдёт. Решение одно: хранить номер в единой нормализованной форме и приводить входящий номер к ней перед поиском. Приводить к одному виду нужно и базу до подключения телефонии, иначе половина звонков откроет пустую карточку. Я обычно начинаю не с настройки телефонии, а с выгрузки всех телефонов и анализа форматов.

Второе узкое место: один номер, несколько человек. Бывает, что с одного телефона звонят и клиент, и его бухгалтер, и у каждого своя карточка. Поиск возвращает несколько совпадений, и CRM должна договориться с менеджером, что показывать: обычно открывают карточку компании и список контактов. Бывают и обратные случаи: у клиента несколько номеров, и звонок с домашнего не найдёт карточку, привязанную к рабочему.

Кому показывать входящий. Если звонят по внешнему номеру агентства, АТС маршрутизирует звонок по очереди, а CRM показывает карточку тому, на кого звонок реально пришёл, а не всем. Это обеспечивается событием вызова с внутренним номером принявшего. Поэтому при согласовании интеграции важно спросить провайдера, какие события он присылает и в какой момент: при поступлении, при ответе, при завершении. Тема интеграции телефонии с другой CRM разобрана в материале про SuiteCRM, телефонию и 1С.

Запись разговоров: где лежит файл и что показывать в карточке

Запись разговора создаёт АТС, и файл остаётся на её стороне: на сервере телефонии или в облаке провайдера. В CRM попадает не звук, а ссылка и метаданные: номер, направление (входящий или исходящий), длительность, ответственный сотрудник, время. Менеджер нажимает на звонок в ленте карточки, и запись открывается по ссылке или проигрывается встроенным плеером. Такая схема дешёвая и не раздувает хранилище CRM.

О чём нужно договориться заранее. Срок хранения записей на стороне АТС: через полгода файлы могут удаляться, а ссылки в CRM останутся мёртвыми. Права на прослушивание: обычно записи разрешают слушать руководителю и самому менеджеру, а не всем сотрудникам. Доступ по ссылке: она не должна открываться без авторизации и не должна «жить» вечно. Формат звукового файла, который поддерживает плеер в вашей CRM.

Событие завершения вызова в Asterisk называется Hangup: оно приходит, когда канал положили, и содержит идентификатор канала и код причины с текстом. По нему CRM понимает, что разговор закончился и можно записывать итоги. В облачных АТС это отдельное событие «звонок завершён», которое приходит на ваш адрес вебхука. Если событие не дошло, в карточке остаётся «звонок в процессе» вместо итога, и это самая частая причина «пустых» записей. Проверяйте доставку на тестовых звонках.

Про предупреждение клиента. Обычная практика: голосовое оповещение в начале разговора о том, что звонок может записываться. Юридические подробности стоит согласовать с юристом, я в этой статье рассказываю только о технической стороне. Но в проекте я всегда закладываю возможность включить такое оповещение на уровне АТС, а не в CRM, потому что именно АТС владеет вызовом.

Разбор случая: турагентство «Тёплый Берег» на 14 рабочих мест

Условный пример: турагентство «Тёплый Берег», четырнадцать менеджеров. Все цифры придуманы для иллюстрации. Менеджеры звонят клиентам со стационарных аппаратов и мобильных, заметки о разговорах пишут в карточках по памяти, а руководитель хочет слушать записи спорных разговоров, например, когда клиент говорит «мне обещали другую цену».

Что сделали. Выбрали облачную АТС с открытым API и вебхуками: своего администратора АТС в агентстве нет, и гибкость Asterisk не нужна. Свели в таблицу внутренние номера менеджеров и их учётные записи в CRM. Привели телефоны в базе к единому формату: до подключения нашлось несколько вариантов написания одного и того же номера. Настроили кнопку вызова в карточке, событие входящего и приём события завершения с записью. Права на прослушивание дали руководителю и самому менеджеру.

Как это работает. Менеджер открывает карточку клиента и нажимает кнопку вызова: сначала звонит его телефон, потом клиент. При входящем звонке на экране открывается карточка с историей поездок и последним обращением. После разговора в ленте появляется запись о звонке с длительностью и ссылкой на файл. Руководитель по ссылке слушает спорные разговоры и разбирает их с менеджером.

Какие сбои стоит заложить в план заранее, и именно их я бы проверял в этом примере. Часть входящих может открыть пустые карточки: у корпоративных клиентов номера нередко записаны через дефисы и с городскими кодами, и поиск по точному совпадению их не найдёт. Причина сидит в данных, а не в интеграции, хотя первым подозревают коннектор. Второй вероятный сбой: событие завершения не приходит, пока адрес вебхука не открыт снаружи по HTTPS. Оба сбоя выявляются тестовыми звонками на нескольких номерах до запуска всех менеджеров, и поэтому пилот я всегда начинаю с пяти номеров, а не с четырнадцати.

Что нужно от провайдера и что проверить до запуска

Требования к провайдеру телефонии можно уложить в короткий список. Открытый API на создание вызова. События вызова (поступление, ответ, завершение) через вебхук или потоковый интерфейс. Доступ к записям по ссылке с авторизацией. Возможность привязать внутренние номера к сотрудникам. Тестовый стенд или тестовые номера. Если чего-то из этого нет, интеграция либо невозможна, либо превращается в доработку, и лучше узнать об этом до оплаты тарифа. Для АТС на Asterisk и FreePBX примеры развёртывания у нас описаны в материале про корпоративную телефонию.

Что проверить со своей стороны. Публичный адрес CRM по HTTPS, на который АТС сможет присылать события: без него входящие и записи не придут. Ключи доступа к API хранятся не в открытом виде. Номера в базе приведены к единому формату. Количество и роли сотрудников известны. Срок хранения записей согласован. Тестовый звонок проведён на нескольких номерах разных операторов. Для каждого пункта назначьте владельца: ИТ, администратор АТС, руководитель. | Пункт проверки | Владелец | Критерий готовности | |---|---|---| | Соответствие внутренних номеров сотрудникам | ИТ | список без пропусков | | Единый формат телефонов в базе | ИТ | поиск находит клиента в любом написании | | Доступ к API провайдера | администратор АТС | тестовый вызов создан | | Публичный HTTPS для вебхуков | ИТ | событие приходит в CRM | | Срок хранения записей | руководитель | зафиксирован в регламенте | | Права на прослушивание | руководитель | список ролей утверждён | | Тестовый звонок на пяти номерах | ИТ и менеджеры | карточка, запись и итог сохранены |

Если что-то не работает, дерево диагностики такое. Звонит сначала не менеджеру: неверно сопоставлен внутренний номер, сверьте пользователя и добавочный. Карточка не открывается при входящем: формат номера в базе другой, приведите к единому виду. Нет записи в карточке: не доходит вебхук завершения, проверьте публичный адрес, сертификат и ключ API. Обрывается соединение: проверьте транк и список разрешённых адресов на стороне АТС. Эти четыре сценария покрывают подавляющее большинство обращений после запуска.

И ограничения подхода. Связка зависит от провайдера: смена АТС означает новую интеграцию. Нет универсального коннектора для всех российских АТС, поэтому каждое подключение оценивается отдельно по API провайдера. Качество разговора определяет телефония, а не CRM, и если связь плохая, виновата не интеграция. И наконец, в коробке ERPNext готового телефонного модуля для российских АТС нет: нужен коннектор или доработка, а работу Click-to-call с конкретным провайдером и запись в карточке лида нужно проверять на стенде, прежде чем считать подтверждённой.

Частые вопросы

Как работает click-to-call в CRM?

CRM передаёт в API телефонии внутренний номер сотрудника и номер клиента командой вида Originate. АТС сначала звонит на аппарат менеджера, а после его ответа набирает клиента и соединяет их. Событие завершения и запись попадают в историю карточки, если вебхук настроен.

Нужна ли для интеграции своя АТС или хватит облачной?

Хватит облачной, если у провайдера есть API на создание вызова и вебхуки событий. Своя АТС на Asterisk даёт больше контроля над записью и номерным планом, но требует администрирования. Для агентства без телефониста облачный вариант проще и надёжнее.

Где хранятся записи разговоров и как их привязать к клиенту?

Файл остаётся на стороне АТС, а в CRM сохраняются ссылка и данные звонка: номер, направление, длительность, ответственный. Привязка идёт по номеру телефона в карточке, поэтому номера в базе приводят к единому формату. Срок хранения записей согласуйте заранее.

Есть ли телефония в вашей CRM из коробки?

Нет: в продукте CRM с AI-отделом продаж сейчас работают Telegram-бот, почта и веб-форма, а телефония и АТС в очереди разработки. Подключение конкретной АТС мы оцениваем отдельно, по её API и событиям вызова.

Нужно ли предупреждать клиента о записи разговора?

В практике принято голосовое оповещение в начале звонка, его включают на уровне АТС. Юридические подробности согласуйте с юристом: в этой статье рассматривается только техническая сторона. Для проекта мы закладываем возможность оповещения заранее.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи