Делаем call tracking

6ecfae1d76a0454cbd20634b2668f821.jpgВ современном мире компании используют большое количество каналов привлечения клиентов: контекстная реклама, баннерная реклама, реклама на радио или ТВ, наружная реклама и так далее. В каждом из этих каналов еще могут присутствовать параметры размещения, например, ключевые слова или площадки. Реклама — дело затратное и у бизнеса возникает понятное желание изучить эффективность тех или иных каналов и площадок. В случае онлайн-продаж все более-менее просто и отработано, есть специальные метки и cookie, которые цепляются к браузеру клиента и, когда он совершает покупку, Google/Yandex/любая другая система выдает вам информацию о том что клиент пришел из определенного канала по каким-то определенным ключевым словам. Но не все компании продают товары или услуги онлайн, многие до сих пор делают это по телефону, у каждого бизнеса своя специфика и телефон как канал продаж до сих пор не утратил своей актуальности. Для анализа эффективности маркетинговых каналов в случае телефонных продаж используется call tracking, дальше мы рассмотрим типы колл-трекинга и расскажем о том как его можно реализовывать.8cc0bddd9b854535aa61daf6c23c0539.jpgСуществует несколько типов колл-трекинга — статический и динамический. В случае статического колл-трекинга каждому рекламному каналу выделяется свой номер и за ним закрепляется, потом все звонки через номера фиксируются и анализ статистической информации показывает какой из каналов наиболее эффективен. Данный способ хорошо работает, если нужно отслеживать какое-то ограниченное количество каналов. В современном мире рекламодатели хотят отслеживать не только каналы, но и эффективность тех или иных ключевых слов и отлавливать отдельных клиентов, что в конечном итоге ведет к необходимости большого количества номеров.

c113728563384c31be6a36d8f4ca717e.pngВ этом случае начинают применять динамический колл-трекинг: при динамическом колл-трекинге существует некоторый пул номеров телефонов, который используется для всех каналов, но связка номера с посетителем сайта происходит на лету и действует какое-то ограниченное количество времени, если в течение этого времени клиент позвонит по номеру, то система это отследит. Существует соотношение между количеством посещений сайта и количеством номеров, которое необходимо для трекинга приходящих на сайт посетителей из разных каналов, поэтому сервисы колл-трекинга обычно привязывают цену своих услуг к посещаемости ресурса.

f0361b8027644e14a6b5f772be3f03f8.jpg

Ну все, с теорией покончили, можно переходить к практике. Мы рассмотрим вариант пула номеров для трекинга, подключенных к платформе VoxImplant, которая будет отвечать за обработку входящих звонков и перенаправление их на номер клиента. В сценарии обработки звонков мы предусмотрим получение данных для переадресации с бэкенда по HTTP (S) и запись информации о звонках. Если звонок успешный, то мы сохраним его дату, длительность, URL записи разговора, номер на который пришел звонок и номер на который мы переадресовали вызов, в случае если звонок не состоялся еще добавим информацию об ошибке — почему именно не дозвонились. Перейдем к реализации:

Регистрируем и активируем аккаунт VoxImplant Заходим в панель управления и создаем приложение в разделе Applications, можно назвать его tracking В разделе Scenarios создаем новый сценарий со следующим содержанием: var outbound_call, dialed_number, agent_number, record_url, call_date, call_length = 0, failure_code, failure_reason, wsURL = «http://yourwebservice.com/api», // предположим, что данный веб-сервис будет возвращать номера для переадресации connected = false;

// Обработка входящего вызова VoxEngine.addEventListener (AppEvents.CallAlerting, function (e) { // Дата звонка в UTC-формате call_date = new Date ().toUTCString (); // Номер, который набрал клиент dialed_number = e.destination; // URL для получения номера для переадресации по набранному номеру wsURL += »? dialed_number=» + encodeURIComponent (dialed_number); // Делаем HTTP-запрос к веб-сервису, чтобы получить номер куда будем переадресовывать звонок Net.httpRequest (wsURL, function (res) { if (res.code == 200) { // Получили номер для переадресации agent_number = res.text; // Делаем исходящий звонок outbound_call = VoxEngine.callPSTN (agent_number, dialed_number); // Вешаем обработчики событий и соединяем входящий и исходящий звонки VoxEngine.easyProcess (e.call, outbound_call, handleCallsConnected); outbound_call.removeEventListener (CallEvents.Disconnected); outbound_call.addEventListener (CallEvents.Disconnected, handleCallDisconnected); outbound_call.removeEventListener (CallEvents.Failed); outbound_call.addEventListener (CallEvents.Failed, handleCallFailed); } else { // Если веб-сервис недоступен — отбиваем звонок, опционально можно что-нибудь сказать в предответном состоянии e.call.reject (); } }); });

// Обработка завершения сессии VoxEngine.addEventListener (AppEvents.Terminating, function (e) { // В случае если звонок успешный if (connected) { Logger.write («Dialed number:» + dialed_number + » Agent number:» + agent_number + » Date:» + call_date + » Length:» + call_length + » Record URL:» + record_url); // Можно отправить эти данные по HTTP на бэкенд с помощью Net.httpRequest } else { // Соединение не удалось Logger.write («Call failed. Code:» + failure_code + » Reason:» + failure_reason); // Можно отправить информацию по HTTP на бэкенд с помощью Net.httpRequest } });

// Исходящий звонок не удался function handleCallFailed (e) { failure_code = e.code; failure_reason = e.reason; VoxEngine.terminate (); }

// Обработка завершения удачного звонка function handleCallDisconnected (e) { call_length = e.duration; VoxEngine.terminate (); }

// Обработчик удачного соединения function handleCallsConnected (call1, call2) { connected = true; outbound_call.addEventListener (CallEvents.RecordStarted, function (e) { record_url = e.url; }); outbound_call.record (); // start call recording } Сохраняем его под каким-нибудь названием.Не забудьте сделать свой веб-сервис возвращающий номер для переадресации и поменять wsURL в коде Теперь есть 2 варианта с номерами — можно взять их прямо в VoxImplant, или же в настройках SIP прописать адрес своего транка, откуда будут звонки идти на платформу. Заходим в редактирование приложения tracking, которое мы создали ранее, и там в табе Rules создаем новое правило, которое нужно назвать как-нибудь, например, InboundCalls, Pattern можно оставить .* если мы хотим все входящие звонки отправить на обработку нашим сценарием, а сам сценарий перетаскиваем в Assigned и сохраняем. Можно звонить Это самый простой сценарий, который показывает концепцию использования VoxImplant для колл-трекинга, его можно усложнить и пытаться прокинуть звонок сразу на несколько номеров одновременно, или пытаться дозваниваться на несколько номеров по очереди. Если номеров нужно больше чем есть в наличии, всегда можно воспользоваться добавочными, которые клиент будет вводить при звонке на номер. В данном случае в код нужно будет добавить обработку нажатий клавиш, примерно так:

var inbound_call, ext = '';

// Обработка входящего вызова VoxEngine.addEventListener (AppEvents.CallAlerting, function (e) { inbound_call = e.call; inbound_call.addEventListener (CallEvents.ToneReceived, function (callevent) { callevent.call.stopPlayback (); ext += callevent.tone; if (ext.length == 4) { wsURL += »? dialed_number=» + encodeURIComponent (dialed_number) + »&ext=» + ext; // Получаем номер для переадресации Net.httpRequest (wsURL, function (res) { if (res.code == 200) { // Получили номер для переадресации agent_number = res.text; // Делаем исходящий звонок outbound_call = VoxEngine.callPSTN (agent_number, dialed_number); // Вешаем обработчики событий и соединяем входящий и исходящий звонки VoxEngine.easyProcess (e.call, outbound_call, handleCallsConnected); outbound_call.removeEventListener (CallEvents.Disconnected); outbound_call.addEventListener (CallEvents.Disconnected, handleCallDisconnected); outbound_call.removeEventListener (CallEvents.Failed); outbound_call.addEventListener (CallEvents.Failed, handleCallFailed); } else { // Если веб-сервис недоступен — отбиваем звонок, опционально можно что-нибудь сказать в предответном состоянии inbound_call.reject (); } }); } }); inbound_call.addEventListener (CallEvents.Connected, function (callevent) { inbound_call.say («Пожалуйста, введите добавочный.», Language.RU_RUSSIAN_FEMALE); }); inbound_call.answer (); }); Наверное, можно придумать еще много всего интересного, но в рамки данной статьи это не входит. Важно помнить, что полноценный сервис колл-трекинга требует много работы и готовые сервисы, которые этим занимаются, не просто так берут за это деньги. Буду рад ответить на любые вопросы в комментариях.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

© Habrahabr.ru