График работы: 10:00 - 19:00 Пн - Пт
Динамический колл-трекинг

В прошлой статье разбирали методы статистического трекинга и промокода для определения источника звонка. Сегодня расскажу про динамический колл-трекинг с примером. Естественно, пример будет максимально упрощен. Наша задача понять сам принцип работы. А как его будете совершенствовать и сколько труда и денег готовы вложить на свой проект уже зависит от вас.

Динамический колл-трекинг: принцип работы

Динамический колл-трекинг в идеале работает по следующему принципу «пришел — получил свой номер телефона навсегда». Это было бы прекрасно! Вы с высокой точностью смогли бы определить источник клиента. Но проблема кроется в том, что никто финансово не готов выделить столько номеров (бесконечно), да и нерешаемая эта задача. Количество номеров ограничено…

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

Что нам потребуется?

Сначала создадим базу данных через phpMyAdmin и таблицу в ней. В моем примере база будет называться commondb, а таблица actouch2.

Таблица колл-трекинга

Phone — с этого поля номера будут браться для вывода на странице посетителя. Поэтому формат можете выбрать любой исходя из вашей верстки.

Alias — альтернативное значение телефонного номера. Когда он нужен? У нас все звонки принимает колл-центр. Как поступил звонок, у них открывается форма-анкета, где автоматом подставляется телефонный номер на который звонили. Так вот номер куда звонили принимается в формате 749900000X. У вас могут быть другие варианты.

FRelease — дата освобождения номера. Наш скрипт будет выдавать номер на определенное время, например, на 10 минут. После чего номер освобождается и может быть выдан следующему посетителю. У текущего посетителя номер тоже обновится при следующей загрузке страницы (можно сделать обновление аяксом).

FirstVisit — источник посетителя, откуда он пришел к вам в самый первый раз.

Referral — текущий источник посетителя. Если он впервые у вас, то совпадет с FirstVisit.

CallPage — форма захвата. Допустим у вас сотни автоматически генерируемых лендингов. Здесь будет информация о сайте на котором номер выдался.

Первые две строки заполнил тестовыми данными, чтобы вам было понятнее.

Теперь создадим файл actouch2.php:

<?php	
	date_default_timezone_set('Europe/Moscow');
	//Соединяемся, выбираем базу данных
	$link = mysql_connect('localhost', 'login', 'password');
	mysql_query('SET NAMES utf8');
	mysql_select_db('commondb');
	
	$req_new_phone = true;	
	$reserve_phone = '+7 (499) 000-00-01';
	
	//Если админ, то всегда выводим резервный номер
	if (trim($_COOKIE['noact2'])) { $phone = $reserve_phone; }
	else {
		//Если есть запись с номером в Cookies
		if (trim($_COOKIE['actid2'])) {
			$actid2 = $_COOKIE['actid2']; 
			//Получим номер из пула
			$query = 'SELECT ID, Phone FROM actouch2 WHERE ID = "'.$actid2.'"';
			$result = mysql_query($query);		
			
			$num_rows = mysql_num_rows($result);
			if ($num_rows == 0) { 						//Если не нашли такой ID, тогда выводим дефолтный номер и зануляем Cookies
				$phone = $reserve_phone;		
				setcookie('actid2', '', time() - 3600);
			}
			else {
				$row = mysql_fetch_assoc($result);
				$phone = $row['Phone'];
				$req_new_phone = false;
				
				//Добавим информацию в таблицу звонков
				//refer и first_visit берутся из файла metriks.php.
				$current_url = urldecode(getenv('SERVER_NAME').getenv('REQUEST_URI'));
				$db_first_visit = urldecode($first_visit);
				$db_current_visit = urldecode($refer);
				$query = 'UPDATE actouch2 SET FirstVisit="'.$db_first_visit.'", Referral="'.$db_current_visit.'", CallPage="'.$current_url.'" WHERE ID="'.$actid2.'"';
				$result = mysql_query($query, $link);
			}
			mysql_free_result($result);		
		}
		
		//Если требуется новый номер
		if ($req_new_phone) {	
			$query = 'SELECT ID, Phone FROM actouch2 WHERE FRelease<"'.date("Y-m-d H:i:s").'" LIMIT 1';
			$result = mysql_query($query);		
			
			$num_rows = mysql_num_rows($result);
			if ($num_rows == 0) {
				$phone = $reserve_phone;		
				setcookie('actid2', '', time() - 3600);				
			}
			else {
				$row = mysql_fetch_assoc($result);
				$phone = $row['Phone'];
				$actid2 = $row['ID'];			
				
				//Добавим информацию в таблицу звонков
				//refer и first_visit берутся из файла metriks.php.
				$current_url = urldecode(getenv('SERVER_NAME').getenv('REQUEST_URI'));
				$db_first_visit = urldecode($first_visit);			
				$db_current_visit = urldecode($refer);
				$release_date = new DateTime(date('Y-m-d H:i:s'));
				$release_date->modify('+20 minutes'); //Время жизни номера 20 минут.
				$query = 'UPDATE actouch2 SET FirstVisit="'.$db_first_visit.'", Referral="'.$db_current_visit.'", CallPage="'.$current_url.'", FRelease="'.$release_date->format('Y-m-d H:i:s').'" WHERE ID="'.$row['ID'].'"';
				$result = mysql_query($query, $link);
			}

			// Освобождаем память от результата
			mysql_free_result($result);
		}
		
		mysql_close($link);	
		
		//Запишем информацию в куки	
		echo "
		<script>
			var now = new Date();
			var time = now.getTime();
			var expireTime = time + 1000*60*20; //Время жизни номера на стороне клиента 20 минут.
			now.setTime(expireTime);
			document.cookie='actid2=".$actid2."; path=/; domain=.site.ru; expires='+now.toGMTString();
		</script>";		
	}
	
	//Подменим номер
	echo "
	<script>		
		$(function(){ 
			$('.phone').text('".$phone."');		
			$('.phone').unbind('click').click(function() { location.href='tel:".eregi_replace("([^0-9])", "", $phone)."'; });
		})		
	</script>";	
?>

Мне кажется, что скрипт не нуждается в дополнительных комментариях. Если я не прав, то спрашивайте, постараюсь ответить.

Т.к. у нас в БД используется время жизни выданного телефонного номера, то нам необходимо синхронизировать время разных часовых поясов на стороне клиента и на сервере. Для этого мне было достаточно в этом скрипте задать часовой пояс Москвы.

date_default_timezone_set('Europe/Moscow');

Резервный телефонный номер будет выдаваться в случае, если есть запись в Cookies «noact2» и если нет свободных телефонных номеров из пула. Параметр «noact2» можете применять для администраторов и менеджеров, чтобы им не выдавался номер из пула. Код «noact2» будет приведен ниже в файле metriks.php. Инициировать запись можно введя в адресной строке браузера адрес вида http://site.ru/?noact2=no.

//Если админ, то всегда выводим резервный номер
if (trim($_COOKIE['noact2'])) { $phone = $reserve_phone; }

Дополнительный файл metriks.php:

<?php 
	$noact2 = $_GET['noact2'];
	if (trim($noact2)) { //Если есть noact2, то для админа будем всегда показывать резервный номер
		$noact2_script = "document.cookie='noact2=".$noact2."; path=/; domain=.site.ru; expires=".date('r', strtotime('now +365 days'))."';";
	}
	else if (trim($_COOKIE['noact2'])) { $noact2_script = "document.cookie='noact2=".$_COOKIE['noact2']."; path=/; domain=.site.ru; expires=".date('r', strtotime('now +365 days'))."';"; }
	
	/*Сохраним реферера на текущий сеанс*/
	$refer = getenv("HTTP_REFERER");
	if (trim($_COOKIE['current_visit'])) { //Если рефер уже определен
		$refer = $_COOKIE['current_visit']; 
	}
	
	if (trim($refer)) {		
		echo "<script>
			document.cookie='current_visit=".$refer."; path=/;';
		</script>";	
	}
	
	/*Сохраним первоисточник*/
	$first_visit = $_COOKIE['first_visit'];
	if (!trim($first_visit)) { $first_visit = getenv("HTTP_REFERER"); }
	if (!trim($first_visit)) { $first_visit = 'Неизвестно'; }
	
	if (trim($first_visit)) {
		echo "<script>
				document.cookie='first_visit=".$first_visit."; path=/; expires=".date('r', strtotime('now +365 days'))."';
				var inp = document.getElementsByName('first_visit');
				var i;
				for (i = 0; i < inp.length; i++) { inp[i].value = '".$first_visit."'; }
			</script>";		
	}
		
	/*Подключим скрипт телефонных номеров*/
	include '../actouch2.php';
?>

Этот файл прикрепляете в подвале сайтов и начинаете получать данные в базу. А как обработать информацию спросите вы? Это зависит от того каким-образом устроен ваш бэк-офис: колл-центр или простые трубки, есть ли API у вашего оператора, используете CRM или таблицу в Excel… Пример интеграции с Zoho CRM напишу скоро. =)

Как калибровать трекинг?

Во-первых, если есть много ложных заявок (по телефону уточнили, что он звонил с Лендинга №1, а не с Лендинга №2), тогда увеличиваете время жизни выданного номера, т.к. ваши клиенты скорее всего долго думаю прежде чем позвонить.

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

Где закупить номера?

Мы закупали номера в компании Zadarma. По отзывам качество телефонии не на высшем уровне, но сбои мы не часто наблюдаем, поэтому цена/качество нас вполне устраивает. Да и «косяки» техподдержка пока оперативно решала. Плюс к этому бесплатная АТС.

Закупить номера для трекинга можно по ссылке: https://zadarma.com

Желаю всем успешных рекламных кампаний и высоких показателей!