Динамический коллтрекинг на коленке с помощью Google Таблиц

Всем привет! Мы Артём Дурнев и Султан Назаралиев подготовили в этой статье мануал по внедрению и детальное описание работы собственного динамического коллтрекинга.

С чего все началось

В одном проекте с растущим трафиком и счётом за коллтрекинг клиент задал вопрос: Можно ли уменьшить расходы на коллтрекинг?

Мы объяснили, что отслеживание звонков — это важно. Попытка экономии в таком деле может привести к ухудшению показателей рекламной кампании.

Нам стало любопытно: как обойтись без известных сервисов и отслеживать звонки с приемлемым процентом определения источника?

Вот что из этого получилось!

Важное замечание

Решение, описанное в этом материале, не пытается заменить собой сервисы Comagic, CallTouch, RingoStat и подобные

Архитектура, код, взаимодействие сервисов не являются эталонным примером реализации подобных приложений

Цель материала

Показать один из вариантов реализации динамического коллтрекинга с помощью доступных инструментов

Будем использовать бесплатные и доступные каждому интернет маркетологу инструменты:

  • Google Analytics

  • Google Tag Manager

  • Google Apps Script
  • Google Таблицы

Google Analytics и Google Tag Manager должны присутствовать на вашем сайте

Приступим

Для начала нужно создать копию Google Таблицы

Что в этой Google Таблице нужно поменять и настроить:

1. На листе phones в столбце А записываем номера телефонов, которые будут участвовать в подмене. Это могут быть любые номера. Записываем в том формате, в котором они отобразятся на сайте.

2. На листе config указываем:

  • В ячейке B1 пишем номер телефона который отобразится на сайте в случае если все динамические номера заняты
  • В ячейке B3 пишем количество минут на которое номер телефона закрепится за пользователем. По умолчанию 10 минут

3. Нажимаем на пункт Инструменты -> Редактор скриптов

В первой строке открывшегося файла меняем ID который указан в кавычках на ID вашей таблицы

4. В верхнем меню Начать развертывание -> Новое развертывание.

  • Запуск от имени: От моего имени
  • У кого есть доступ: Все

Нажимаем Начать развертывание

Предоставляем доступ

Затем копируем URL приложения

5. Переходим в раздел Триггеры в меню слева и нажимаем Добавить триггер

  • Выберите функцию: checkReserve
  • Выберите источник мероприятия: Триггер по времени
  • Выберите тип триггера: По минутам
  • Выберите промежуток времени в минутах: Раз в минуту

Переходим в Google Tag Manager

1. Скачиваем контейнер с необходимыми тегами, триггерами и переменными

2. Импортируем контейнер в текущую рабочую область

Администрирование -> Импортировать контейнер, выбрать файл контейнера

  • Рабочая область: Существующая
  • Вариант импорта: Объединить

Подтвердить

3. Заходим в Переменные, вставляем в переменную CDC — GAS URL url веб-приложения из 4 пункта

4. Копирование CSS селектора

Перейдите на ваш сайт, откройте инспектор элементов. Скопируйте CSS селектор элемента номера телефона

5. Вставьте скопированный селектор в первый аргумент функции в теге CDC — Switch Phone Number

В случае если на странице несколько номеров телефонов с разными css селекторами — нужно повторить функцию switchNumber в теге CDC — Switch Phone Number

Пример:

<script> switchNumber('.selector1', '{{CDC - Phone Cookie}}') switchNumber('.selector2', '{{CDC - Phone Cookie}}') </script>

6. Добавляем порядок активации тегов

Переходим в Теги -> CDC — Get New Number -> Порядок активации тегов -> Активировать тег перед тегом CDC — Get New Number -> Основной тег Google Analytics

Аналогично редактируем тег CDC — Get Reserve Number

6. Публикация

Публикуем контейнер: Отправить -> Опубликовать

Настройка завершена. Что дальше?

На листе «calls» нужно будет записывать номер телефона и дату/время, когда поступил входящий звонок.

На листе «report» протягивайте формулу в столбце «C» для мэтчинга сессий и звонков

Как всё это работает? !

Динамический коллтрекинг на коленке с помощью Google Таблиц

Google Таблица

На первом листе phones в столбце А записываются номера телефонов, которые будут участвовать в подмене. Номера могут быть любыми, в том числе мобильные. Номера записываются в том формате, в котором они должны отображаться на сайте.

На втором листе states закрепляются номера за пользователями. В столбце А выводятся номера телефонов с листа phones. В столбце B записывается Client ID пользователя, за которым закреплён номер телефона. В столбец C записывается дата и время, когда номер телефона последний раз закреплялся за пользователем. В дальнейшем это время будет использоваться для проверки номеров, которые нужно открепить от пользователя.

На третьем листе distrib в ячейке A1 всегда хранится номер телефона готовый к выдаче новому пользователю. Этот номер фильтруется с помощью формулы, которая ищет в предыдущем листе states ближайший сверху свободный номер телефона.

На четвертом листе sessions хранится информация о сессиях. Когда и какому пользователю какой номер телефона был присвоен. Вместе с информацией о пользователе и номером телефона фиксируется вся информация о сессии. Сюда можно передавать любой параметр (например, ip или устройство пользователя).

Пятый лист calls. На этом листе нужно записывать информацию о звонках. Дата/время входящего звонка и номер телефона, на который поступил звонок.

На шестом листе report будут отображаться звонки с привязанными ближайшими сессиями.

На седьмом листе config заполняются данные конфигурации. В ячейке B1 указываем номер телефона, который будет отображен в случае если все динамические номера заняты. В ячейке B3 записывается количество минут, на которое номер телефона закрепляется за пользователем.

Google Apps Script

К приложению Google Apps Script можно отправлять как get, так и post запросы. Результат будет одинаковый.

На запрос отвечает функция main. Эта функция проверяет параметр type. По параметру type определяется функция, которая будет запущена. Есть две основные функции:

  • получение нового номера телефона
  • поиск уже зарезервированного номера телефона за пользователем

Функция получения нового номера телефона

Функция берет значение из ячейки A1 листа distrib. В ответ функция вернет json в котором будет указан номер телефона и время закрепления этого номера за пользователем. После запустится функция reserve.

Функция reserve

В функцию reserve передаётся: номер телефона, который необходимо зарезервировать, Client ID пользователя за которым резервируется номер телефона и параметры которые необходимо создать в записи сессии. Функция будет искать первое совпадение по номеру телефона на листе states. При совпадении запишется Client ID. В столбце время закрепления номера проставится актуальная дата и время. После этого запустится функция createSession.

Функция createSession

Принимает два аргумента: параметры, которые создаются в записи сессии и номер телефона. Функция ищет в заголовках листа sessions параметры, которые переданы в параметре event. Если найдено совпадение параметров, переданных в функцию и заголовков на листе sessions — параметр будет записан.

Функция поиска зарезервированного номера телефона

Функция будет искать первое совпадение по Client ID на странице states. При совпадении номера телефона — обновиться время закрепления на листе states. Функция вернёт номер телефона найденный по Client ID пользователя в формате json и время закрепления этого номера телефона за пользователем.

Функция checkReserve

Каждую минуту в проекте Google Apps Script будет отрабатывать функция checkReserve. Функция checkReserve проходится по листу states. Функция берет запись о каждом номере телефона и проверяет время, когда в последний раз номер телефона был закреплён за пользователем. Если время закрепления, больше времени указанного на листе config — удаляется запись о пользователе и времени его закрепления с листа states. То есть номер телефона открепляется и может быть выдан другому пользователю, зашедшему на сайт.

Google Tag Manager

В Google Tag Manager есть два основных тега:

  • получить новый номер телефона
  • получить уже зарезервированный номер телефона

Получить новый номер телефона

Запускается по триггеру просмотр страницы если в основном файле cookie значение getnew.

В теге CDC — Get New Number отрабатывает основная функция getNewNumber. Эта функция отправляет запрос к приложению Google Apps Script с параметром type=getnew и остальными параметрами, которые мы хотим отслеживать по звонку. В нашем случае это utm метки. Можно также передавать: тип устройства, страница, разрешение экрана и так далее. Когда приходит ответ от Google Apps Script проставляется cookie сессии с номером телефона который пришел от приложения Google Apps Script.

Номер телефона, полученный от Google Apps Script сохраняется в cookie. Это позволяет мгновенно подменять телефон на странице при повторных запросах.

После проставления cookie вызывается кастомный триггер для Google Tag Manager. По этому триггеру срабатывает тег CDC — Switch Phone Number, который подставляет номер телефона из cookie в элемент на странице. В теге нужно указать css селектор элементов, в которых содержатся номера телефонов.

Функция получения уже зарезервированного номера

Функция отрабатывает по триггеру загрузки страницы, когда основной файл cookie не равен значению getnew.

Функция получения уже зарезервированного номера телефона отправляет запрос к Google Apps Script с параметром type=getreserve и параметром Client ID. Как только ответ получен, функция сверяет текущий номер телефона из файла cookie и полученный от Google Apps Script.

Параллельно тегу получения зарезервированного номера телефона срабатывает тег подмены номера телефона на странице. Если номер телефона полученный от Google Apps Script не совпадает с номером телефона, который содержится в файле cookie — проставляется cookie с новым номером телефона. После запускается кастомное событие для запуска триггера замены номеров на странице. Если номера телефонов совпадают — продлевается срок истечения cookie.

Заключение

Таким образом, в теории мы смогли бы снизить расходы клиента на коллтрекинг до 70%. Но важно понимать, что данное решение подойдет для небольших проектов — до 500 сессий в сутки. Еще надо помнить про ограничения Google Apps Script.

Благодарим за прочтение! Возможно данное решение кому-то будет полезно.

Также читайте:

3030
12 комментариев

Тут стоить добавить цифр.

Сам сервис коллтрекинга на 500 визитов стоит ну 3000 в месяц без учёта номеров, за которые вы в любом случае платите.

Вы сэкономили 3000 руб/мес.

Что эта экономия дала?

- потеряли возможность создавать Лиды в crm с привязкой к рекламному источнику и отслеживать эффективность рекламы по romi

- потеряли возможность отслеживать повторные звонки и не учитывать их в статистике

- потеряли возможность заливать конверсии в метрику, фб и возможно аналитикс

- есть риск что вы ошиблись и источники совсем не те что выдаёт ваш скрипт, но тестов у вас нет.

- клиент за разработку этой экономию также платит. Сколько?


Ваш талант работы с google не вызывает сомнений, но иногда логичней объяснить за что клиент платит деньги, а не бросаться переделывать на бесплатных решениях теряя некоторые важные возможности.

7

Хотим ещё раз обратить ваше внимание:

Это не является прямой заменой известным сервисам коллтрекинга

Сравнивать это решение с Comagic или CallTouch - глупо

Цель этого материала: показать как можно было бы решить такую задачу с помощью подручных инструментов

Это не работает на проекте у клиента

Это не создавалось за счёт клиентского бюджета

Идея материала навеяна вопросом клиента

Это фантазия, свободный рассказ на тему динамического коллтрекинга на «коленке». Материал так и называется

5

Как говорится эту бы энергию да в правильное русло
Я тоже охренел от технической крутизны

3

Жду вторую часть, когда клиент поставить задачу сэкономить на контексте и вы в таблице разработаете свой поисковик) 

8

Следите за нашими обновлениями)

1

Бонусом нужно разработать на гугл таблицах свою яндекс метрику и гугл аналитикс, чтобы экономия точно была видна)))

Подождите ка...это же идея...для стартапа!!

Считаю это крутым кейсом!

2