Посетители, задержавшиеся на веб-странице более минуты, явно проявляют интерес к предложенным продуктам или услугам.
Гораздо продуктивнее оптимизировать кампании именно по таким пользователям, нежели тратить ресурсы на оптимизацию на максимум кликов.
Данная стратегия позволяет более точно корректировать ретаргетинг, выявлять узкие места на сайте, понимать поведение потенциальных клиентов и налаживать коммуникацию с наиболее перспективной аудиторией.
Варианты реализации
В интернет описаны различные варианты реализации отслеживания времени на сайте. Кто-то создал персонализированные скрипты. Я же подобрал себе максимально простые и универсальные варианты.
Первый вариант – простенький, для одностраничных сайтов, второй уже сложнее, он использует cookie и предназначен для многостраничных сайтов.
Для одностраничных сайтов
На всех страницах сайта размещаем код:
«setTimeout('yaCounterXXXXXX.reachGoal("time_on_site");', 150000);»
Где
- ХХХХХХХХ – надо заменить на код Яндекс метрики, установленной на сайте;
- time_on_site – идентификатор цели;
- 150000 - это время в миллисекундах, указывающее через какой промежуток цель будет считаться достигнутой;
Эту строку удобней всего в код самого счетчика Яндекс Метрики или в любое место страницы, но в теге <script></script>
Далее в Яндекс Метрике создаем цель, например, «Был на сайте дольше чем 2 минуты и 30 секунд». Цель на JavaScript-событие, где идентификатор цели = time_on_site.
Этот вариант прост и хорош, но только для одностраничников, потому как считает время проведенной на данной конкретной странице.
То есть, на многостраничнике, при переходе со страницы на страницу он будет обнуляться и считать все заново.
"ЯDветы": Полезные советы и рекомендации по работе с Яндекс.Директ
Для многостраничных сайтов
Здесь будем работать через куки.
И код будет уже сложнее:
<script>
// callback - функция, проигрываемая при истичении timer
// timer - время срабатывания callback в СЕКУНДАХ
// sessionTimer - время сессии в СЕКУНДАХ (после чего стираются предыдущие куки)
// cid - callback id; строка, представляющая собой id коллбека
function CookieSessionTimer(callback, timer, sessionTimer, cid) {
cid = cid || "";
// Класс для более удобного обращение с куки
function CookieWorker() {
// Метод получения всех куки в виде Объекта {[ключ]: значение}
this.getCookieDict = function() {
return document.cookie.split("; ").reduce(function(resultObj, keyProp) {
var val = keyProp.split('=');
resultObj[val[0]] = val[1];
return resultObj;
}, {});
};
// Получение значения куки по ключу
this.get = function(key) {
return this.getCookieDict()[key] || null;
};
// Установка куки
this.set = function(key, value, expired, path) {
value = value || "";
expired = expired || "";
path = path || "/";
document.cookie = key + "=" + value + ";expires=" + expired + ";path=" + path;
};
// Удаление куки
this.delete = function(key) {
document.cookie = key + "=; max-age=-1; path=/;";
};
}
// Инициализация класса для обработки куки
var cookie = new CookieWorker();
// Хеш-функция для исключения неприемлемых символов для куки
function getHashCode(string) {
var hash = 0, i, chr;
if (string.length === 0) return hash;
for (i = 0; i < string.length; i++) {
chr = string.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0;
}
return hash;
}
// Создание ключей куки в соответствии с callback id через хеш-функцию
/*(Фактически таким образом мы присваиваем ключам уникальный id, позволяющий отличить
ключи разных коллбеков друг от друга)*/
var hash = getHashCode(cid);
var st = 'session_timer_' + hash;
var wcics = 'was_called_in_current_session_' + hash;
var sop = 'seconds_on_page_' + hash;
// Проверка наличия ключа таймера сессии в куки
if (!(st in cookie.getCookieDict())) {
// Если ключ отсутствует, значит сессия была закончена или запускается впервые
// Если сессия закончилась, то мы отчищаем все вторичные ключи
cookie.delete(wcics);
cookie.delete(sop);
// Создаем новый таймер сессии в соответствии с sessionTimer
var now = new Date();
var time = now.getTime();
var expireTime = time + sessionTimer * 1000;
now.setTime(expireTime);
// Время окончания сессии записывается непосредственно в куки
cookie.set(st, "1", now.toUTCString());
}
// Инициализируем переменную текущего времени проведённого в сессии (изначально оно равно нулю)
var secondsOnSession = 0;
// Проверка наличия проведенных на сайте (в сессии) секунд
if (sop in cookie.getCookieDict()) {
// Если секунды записаны, то получаем их и записываем в текущий счетчик секунд
secondsOnSession = Number(cookie.get(sop));
}
// Запись времени начала текущего времени нахождения на странице
var currentPageStart = Date.now();
// Установки слушателя событий, при покидании пользователя текущей страницы
window.addEventListener('unload', function() {
// Подсчет текущего времени проведенного на странице
var secondsOnCurrentPage = Date.now() - currentPageStart;
// Подсчет суммарного времени нахождения в сессии
var wholeSessionTime = Math.floor(secondsOnCurrentPage / 1000) + secondsOnSession;
// Запись суммарного времени нахождения в сессии в куки
cookie.set(sop, wholeSessionTime, "expires=Sat, 13 Sep 275760 00:00:00 GMT");
});
/* Установка запуска с задержкой, который будет вызван по истечении суммарного времени сессии
Вычисленного по формуле ВРЕМЯ_СРАБАТЫВАНИЯ - ВРЕМЯ_ПРОВЕДЕННОЕ_В_СЕССИИ */
return setTimeout(function(){
// Проверка была ли функция уже вызвана в текущей сессии
if (wcics in cookie.getCookieDict()) return console.log('was called in current session');
// Если в текущей сессии функция не вызывалась, то устанавливаем ключ на вызванный
cookie.set(wcics, "1", "expires=Sat, 13 Sep 275760 00:00:00 GMT");
// Вызываем callback-функцию
callback();
}, (timer - secondsOnSession) * 1000);
}
// Активация событий
CookieSessionTimer(function() {ym(ХХХХХХХХ,'reachGoal','time_on_site')}, 150, 1800, "id1");
</script>
Это универсальный скрипт.
Где корректировать надо только последнюю строку:
- ХХХХХХХХ – код Яндекс Метрики установленной на сайте;
- time_on_site – идентификатор цели;
- 150 - это время в секундах, указывающее через какой промежуток цель будет считаться достигнутой;
- 1800 - время сессии в секундах, после чего стираются файлы cookie из браузера пользователя. Это необходимо, поскольку в рамках дня пользователь может зайти на сайт несколько раз. По умолчанию установлено 30 минут;
- "id1" - callback id; строка, представляющая собой id коллбека. Отличает выполнение одного запроса от другого. Это для варианта, когда с помощью скрипта создаются несколько целей для разных временных интервалов.
Скопируйте этот код и добавьте его на все отслеживаемые страницы сайта между тегами <head></head>, после кода Яндекс Метрики!
После этого уже можно создавать цель в метрике, как было описано в варианте для одностраничных сайтов:
В Яндекс Метрике создаем цель, например, «Был на сайте дольше чем 2 минуты и 30 секунд». Цель на JavaScript-событие, где идентификатор цели = time_on_site.
Результаты использования
Применение данной стратегии способно улучшить эффективность рекламных кампаний с небольшим числом целевых конверсий.
Использование конверсий с достижением цели по времени пребывания на сайте, позволяет рекламе оптимизироваться эффективнее за счет выявления посетителей, которые проявили явный интерес к сайту.
В итоге, это приводит к увеличению трафика, причем качественного, с высокой заинтересованностью посетителей.
Что только радует алгоритмы Директа.
Я советую использовать такое решение и применять автоматические стратегии, нацеленные на оптимизацию конверсий в случаях, когда указать целью реальные действия клиента, приводящие к покупке, затруднительно.
С ручными стратегиями использование таких целей заметных результатов не принесло.
Данная стратегия наиболее эффективно работает на старых, многостраничных сайтах.
Особенно, когда в них нет возможности интегрировать новейшие маркетинговые инструменты и системы отслеживания звонков.