Перед прочтением данной статьи рекомендуется ознакомиться с материалом по отслеживанию времени на сайте через GTM. Без него вы сможете понять смысл, но будет сложно повторить пошагово все действия по настройке.
В Мастере отчетов Директа можно увидеть набор показателей по вовлеченным сессиям. К сожалению в Метрике ничего связанного с ВС нет, а хотелось бы видеть и желательно не в качестве эфемерной величины с неизвестной механикой подсчета, а в качестве понятного и управляемого показателя. Как говорится, если гора не идет к директологу, значит директолог создаст свою гору через GTM.
Зачем это вообще нужно?
Хотя бы для того, чтобы строить отчетность не только по Директу, но и по всем источникам, а в идеале еще и создавать сложные сегменты аудиторий из заинтересованных пользователей с учетом этого показателя.
Так же, ввиду того, что это будет цель, мы сможем оптимизировать на нее рекламу, а так как эта цель будет гибкой в плане настроек входящих в нее показателей, мы сможем идеально подогнать ее под такие характеристики, которые будут коррелировать с макроцелью, что поможет нам запускаться с оплатой за конверсии по микроцели и снизить риски внезапной остановки кампании. К примеру, у меня на месячной выгрузке по дням получились такие результаты:
Корреляция | |
Активные визиты и Macro | 0,88023286 |
Сумма ВС и Macro | 0,68853551 |
Доля ВС и Macro | -0,211575 |
Для тех, кто не знаком с корреляцией, поясню, что в контекстной рекламе принято считать нормальным уровень корреляции от 0,7 до 1, все что ниже уже плохо. Свой показатель я обозвал «Активные визиты», чтобы они не копировали название у показателя в Директе и не возникало путаницы. Как видите, мой показатель коррелирует с макроцелью (у меня это сумма звонков и форм) с коэффициентом корреляции 0,88, что является хорошим показателем. При этом по вовлеченным сессиям из Директа показатели имеют недостаточную корреляцию, чтобы их можно было использовать в оптимизации кампаний, а доля ВС вообще влияет на макроцель отрицательно. И это все при том, что я использовал самый простой подход в подсчете корреляции в excel. Более сложные расчеты дают коэффициент в 0,934.
Если вы не знакомы с корреляционным анализом в контекстной рекламе или знакомы, но делаете его как все, тогда подписывайтесь на мой телеграм-канал. В ближайшее время я вместе с Ромой Чванниковым (экспертом Яндекс Рекламы) опубликую большую статью, где мы разберем все, что нужно знать о корреляции в ppc. Такого материала еще ни у кого не было и мы убили на его подготовку не один месяц. Анонс будет в моем ТГ канале.
Если кому то хочется пересчитать, то исходные данные ниже:
Дата | Клики | Макроцель | Активные визиты | Сумма ВC | Доля ВC (%) |
12.06.2023 | 188 | 6 | 28 | 10,46 | 5,57 |
13.06.2023 | 222 | 9 | 49 | 15,47 | 6,97 |
14.06.2023 | 156 | 16 | 38 | 12,59 | 8,07 |
15.06.2023 | 164 | 21 | 32 | 9,43 | 5,75 |
16.06.2023 | 85 | 14 | 26 | 7,29 | 8,58 |
17.06.2023 | 54 | 6 | 9 | 1,63 | 3,02 |
18.06.2023 | 74 | 17 | 21 | 3,65 | 4,93 |
19.06.2023 | 174 | 24 | 44 | 7,27 | 4,18 |
20.06.2023 | 199 | 24 | 56 | 12,04 | 6,05 |
21.06.2023 | 108 | 17 | 33 | 5,96 | 5,52 |
22.06.2023 | 41 | 7 | 9 | 2,29 | 5,58 |
23.06.2023 | 33 | 4 | 6 | 2,82 | 8,56 |
24.06.2023 | 13 | 5 | 6 | 0 | 0 |
25.06.2023 | 37 | 7 | 14 | 3,04 | 8,23 |
26.06.2023 | 89 | 12 | 24 | 4,21 | 4,73 |
27.06.2023 | 76 | 16 | 29 | 7,4 | 9,74 |
28.06.2023 | 64 | 6 | 10 | 4,73 | 7,38 |
29.06.2023 | 59 | 9 | 19 | 4,08 | 6,92 |
30.06.2023 | 41 | 6 | 10 | 2,41 | 5,89 |
01.07.2023 | 42 | 10 | 11 | 1,69 | 4,01 |
02.07.2023 | 38 | 3 | 9 | 2,72 | 7,16 |
03.07.2023 | 150 | 15 | 38 | 6,91 | 4,61 |
04.07.2023 | 106 | 11 | 25 | 8,05 | 7,6 |
05.07.2023 | 86 | 10 | 18 | 6,35 | 7,38 |
06.07.2023 | 85 | 9 | 23 | 3,38 | 3,97 |
07.07.2023 | 110 | 10 | 22 | 6,53 | 5,93 |
08.07.2023 | 105 | 12 | 24 | 3,76 | 3,58 |
09.07.2023 | 210 | 19 | 39 | 5,56 | 2,65 |
10.07.2023 | 210 | 11 | 43 | 6,95 | 3,31 |
11.07.2023 | 201 | 19 | 52 | 7,54 | 3,75 |
Теперь, когда мы разобрались зачем нам это вообще нужно, давайте создадим свою микроцель «Активные визиты»/»Вовлеченные сессии» через GTM.
Что под капотом у вовлеченных сессий Директа?
В справке Яндекса о вовлеченных сессиях написано следующее:
«С помощью алгоритмов машинного обучения система анализирует сессию пользователя, который перешел по рекламе, и предсказывает вероятность целевых действий на сайте. Прогноз строится на данных о посещаемых страницах сайта, глубине и времени просмотра.»
Отсюда можем сделать вывод, что ВС рассчитывается на поведенческих метриках, таких как:
- время на сайте;
- глубина просмотра;
- возможно, достижение любой цели.
Я не писал в перечне показатель отказов, т.к. он составной из вышеуказанных.
Итак, мы можем взять те показатели, которые предложил Яндекс и добавить туда свои, чтобы получить свою метрику вовлеченных сессий — активные визиты. Я добавил к глубине просмотра и времени на сайта еще скроллы и клики.
Создаем переменную по отслеживанию времени на сайте
Это то, о чем я писал в самом начале статьи. Если вы уже настроили отслеживание времени визита, тогда можете пропустить этот пункт. Если нет, ниже я опишу очень кратко, куда какой код вставить без объяснений, т.к. все это уже расписано в моей статье здесь.
- Создаем переменную типа «Собственная функция JS» и вставляем в нее следующий код (это и будет счетчик времени на сайте):
function getSessionTime() { // Проверка, поддерживает ли браузер sessionStorage if (typeof sessionStorage !== 'undefined') { // Проверка, есть ли сохраненное значение времени начала сеанса в sessionStorage var sessionStartTime = sessionStorage.getItem('sessionStartTime'); if (!sessionStartTime) { // Если сохраненного значения нет, установка нового значения sessionStartTime = new Date().getTime(); sessionStorage.setItem('sessionStartTime', sessionStartTime); } // Вычисление времени прошедшего с начала сеанса var elapsedTime = (new Date().getTime() - sessionStartTime)/1000; return elapsedTime; } return null; }
Я у себя назвал переменную sessionDuretion, но вы можете использовать любое другое имя. Запомните его.
- Создаем тег типа «Пользовательский HTML» и вставляем в него следующий код с триггером «Все страницы»:
<script> // Проверка, поддерживает ли браузер sessionStorage if (typeof sessionStorage !== 'undefined') { // Отслеживание факта скролла или клика на странице. Изначально записываем в переменную hasScrollOrClick логическое нет (false) var hasScrollOrClick = false; // Прослушиваем клики, если есть, записываем в hasScrollOrClick логическое да (true) document.addEventListener('click', function() { hasScrollOrClick = true; }); // Запускаем цикл проверки процента скролла каждые 10 секунд, если прокрутка больше 50%, записываем в hasScrollOrClick логическое да (true) setInterval(function() { // Определение высоты документа и текущей прокрутки var documentHeight = Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ); var scrollTop = window.pageYOffset || document.documentElement.scrollTop; // Расчет прокрученной части страницы в процентах var scrollPercent = (scrollTop / (documentHeight - window.innerHeight)) * 100; // Проверка, что прокрутка больше 50% и запись true в hasScrollOrClick if (scrollPercent >= 50) { hasScrollOrClick = true; } }, 10000); // Проверка каждые 10 секунд (можно менять) // Проверка условия для очистки sessionStorage. Если 5 минут нет активности, сбрасываем счетчик времени сеанса var clearStorageTime = 300000; // 5 минут в миллисекундах (можно менять) // Запускаем интервал проверки каждые 60 секунд setInterval(function() { // Если не было кликов и скролла 50%, считаем как долго не было активности if (!hasScrollOrClick) { var sessionStartTime = sessionStorage.getItem('sessionStartTime'); var remeveTime = new Date().getTime() - sessionStartTime; // Если активности не было более чем записано в clearStorageTime (5 минут), очищаем счетчик времени сессии if (remeveTime >= clearStorageTime) { sessionStorage.removeItem('sessionStartTime'); } } }, 60000); // Проверка каждую минуту } </script>
Этот код сбрасывает счетчик на ноль, если посетитель открыл сайт и не проявляет на нем активность в течении 5 мину. В противном случае, у вас в переменной будет полное время визита с учетом простоя. Имя дайте произвольное.
Добавим необходимые переменные
Для начала проверьте, что среди встроенных переменных у вас включена переменная referrer. Если нет, включите её.

Она поможет нам отфильтровывать тех пользователей, которые просмотрели только одну страницу сайта (актуально для многостраничных сайтов, для лэндингов пропустите этот шаг). Реферер — это url, с которого перешли на текущую страницу. К примеру, если на страницу перешли из поисковика, то реферер будет https://ya.ru или https://google.com. Если же в реферере присутствует ваш домен — значит был внутренний переход между страницами сайта. Это нам и нужно, чтобы отследить просмотры более чем 1 страницы.
Далее создадим переменную с именем «activeSessionSet» и типом «Пользовательская функция JavaScript». В нее мы поместим вот такой код:
function getSessionActiveSeted() { if (typeof sessionStorage !== 'undefined') { var sessionActiveSeted = sessionStorage.getItem('sessionActiveSeted'); return sessionActiveSeted; } }
Функция обращается к сессионному хранилищу (аналог cookie) и запрашивает из него значение сессионной переменной sessionActiveSeted. В нее мы будем записывать значение «true» в тот момент, когда будем отправлять активный визит в Метрику. Это нужно для того, чтобы активный визит отправлялся только один раз на сеанс (тогда, когда в этой переменной нет значения «true»).
Мы не можем использовать для этих целей внутренний функционал GTM т.к. в нем есть ограничение срабатывания тега один раз на страницу, а на сеанс нет. На уровень данных мы так же не можем отправить эту переменную, т.к. она затрется при переходе на другую страницу сайта. В куку мы её тоже не можем записать, потому что кука переживает окончание сеанса, а нам нужно действие переменной только в рамках одного сеанса. Поэтому мы и используем sessionStorage.
В GTM будет так:

Создадим триггер, который будет срабатывать тогда, когда сессия будет считаться вовлеченной
Если точнее, то нам потребуется создать не один, а два триггера — один будет отслеживать скроллы, второй клики. Создадим первый триггер с типом «Клик — Все элементы». Для него пропишем следующие параметры:
- условия активации триггера: некоторые клики;
- «sessionDuretion (название переменной, в которую записываем длительность сеанса) больше 60» — прописываем время в секундах, которое по вашим данным свидетельствует о качественном визите. У меня это 60 секунд;
- «referrer содержит zurov.ru» — замените домен на свой;
- «activeSessionSet не равно true» — эту переменную просто запишите как есть, выше я объяснял зачем она нужна и затрону эту тему еще раз в следующем пункте.
В GTM это будет выглядеть так:

Аналогичным образом создайте триггер активации для скролла более 90% (или для того уровня, который вы считаете достаточным).

Таким образом у нас получилось два триггера, которые будут активировать тег отправки цели в Метрику в том случае, если пользователь провел на сайте более 60 секунд, при этом он сейчас находится на второй или более странице сайта и проявлял на ней активность (кликал или просмотрел её более чем на 90%).
Создаем тег отправки события в Метрику
Отнеситесь к этому пункту внимательно, т.к. мы будем модернизировать код отправки JS события в Яндекс Метрику и простым копированием своих тегов нашу задачу не решить. Создадим тег типа «Пользовательский HTML» с 2-мя триггерами активации, которые мы создали на предыдущем шаге и запишем в него такой код:
<script> ym('{{YM-number}}', 'reachGoal', 'active_session'); // Проверка, поддерживает ли браузер sessionStorage if (typeof sessionStorage !== 'undefined') { // Запись в sessionStorage переменной, которая будет означать что мы уже отправили в Метрику данные об активном визите посетителя sessionActiveSeted = 'true'; sessionStorage.setItem('sessionActiveSeted', sessionActiveSeted); } </script>
Поменяйте {{YM-number}} на номер своего счетчика Метрики и название цели active_session на то, которое вы прописали в Метрике.
В этом скрипте мы, как обычно, отправляем JS событие с целью в аналитику, но вместе с событием мы отправляем в сессионное хранилище переменную «sessionActiveSeted» со значением «true». Это значение потом попадет в нашу переменную GTM с именем «activeSessionSet». Помните, в триггерах мы ставили условие активации на то, что «activeSessionSet» не равно «true»? Вот для нее мы это и делали.
Таким образом, как только у нас сработает отправка активного визита в Метрику, у нас сразу в нашу переменную запишется значение «true», которое заблокирует триггеры на повторную отправку активных визитов в аналитику и действовать это будет до конца сессии. Немного сложно, но проще у меня придумать не получилось.
В Менеджере тегов это будет смотреться вот так:

На этом все. Проверяем работоспособность в режиме отладки, публикуем контейнер, создаем цель в Метрике, считаем корреляцию и оптимизируем РК по micro целям. При этом вы можете в триггерах поправлять время на сайте, величину скролла или вообще добавлять свои условия активации, записанные в другие переменные. Они будут срабатывать по условию «И».