Делаем call tracking

в 20:14, , рубрики: call tracking, diy или сделай сам, sip, trunk, voip, voximplant, Блог компании Zingaya, Веб-разработка, колл-трекинг, номера телефонов, Разработка систем связи, метки: ,

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

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

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

Делаем call tracking - 4

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

  1. Регистрируем и активируем аккаунт VoxImplant
  2. Заходим в панель управления и создаем приложение в разделе Applications, можно назвать его tracking
  3. В разделе 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 в коде

  4. Теперь есть 2 варианта с номерами — можно взять их прямо в VoxImplant, или же в настройках SIP прописать адрес своего транка, откуда будут звонки идти на платформу.
  5. Заходим в редактирование приложения tracking, которое мы создали ранее, и там в табе Rules создаем новое правило, которое нужно назвать как-нибудь, например, InboundCalls, Pattern можно оставить .* если мы хотим все входящие звонки отправить на обработку нашим сценарием, а сам сценарий перетаскиваем в Assigned и сохраняем.
  6. Можно звонить

Это самый простой сценарий, который показывает концепцию использования 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();
});

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

Автор: aylarov

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js