В любом счетчике аналитики для сайта существуют метрики вовлечения, по ним определяют насколько пользователь заинтересован в контенте:

  • Время на сайте
  • Отказы
  • Глубина просмотра (в страницах)

Для сайтов одностраничников, которые очень популярны для микро и малого бизнеса эти метрики не очень актуальны, глубина просмотра в страницах полностью не релевантная метрика для лендинга, значение всегда будет около 1.

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

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

Отказы, метрика которая ранее была очень популярна и хорошо работала, но сейчас она постоянно дает осечки, ее нужно фильтровать визитами.

Иногда первый визит пользователя показывает как отказной, а со следующих визитов у того же пользователя есть продажи/конверсии. Причины в усложнении интернета: появились браузеры, мобильные устройства, многочисленные приложения и т.д.

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

А еще на основе ==Глубины скроллинга== можно перестроить порядок блоков, чтобы доставить взору посетителя нужный контент как можно быстрее, + в рекламе для товарных блогов или сайтов магазинов прокинуть цель для умного ретаргетинга в Я.Директе.

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

Переходим к настройке. Подключаем Яндекс Тег менеджер (ЯТМ)

Если мы впервые работаем с ЯТМ, его нужно включить:

  • Переходим в меню настроек счетчика Я. Метрики
  • Открываем раздел ==Счетчик==
  • Включаем тумблер Тег менеджер и активируем чекбокс Пользовательский HTML

NOTE

Пользовательский HTML нужен для внедрения на сайт сторонних скриптов, которых нет в стандартных тегах ЯТМ. Глубина скроллинга как раз требует внедрения стороннего скрипта от ADSWERVE

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

Создаем триггер на событие глубина просмотра

  • Переходим в раздел теги ЯТМ, нажимаем Добавить новый триггер
  • В новом окне выбираем Инициализация
  • Выбираем страницы на которых хотим отслеживать событие
    • Нажимаем Некоторые события
    • Page URL содержит или соответствует регулярному выражению
    • Перечисляем страницы для отслеживания скроллинга с помощью “/” и ссылки на страницу или раздел

Если нужно отслеживать скроллинг на всех страницах сайта, то в условиях активации тега оставляем Все события.

Создаем тег на основе Пользовательского HTML

  • Открываем раздел теги ЯТМ
  • В новом окне выбираем Пользовательский HTML
  • Вставляем готовый скрипт от ADSWERVE
    • Он подходит и для Google Tag Manager

Скрипт для отслеживания

<script>
  //Version 1.1.2 Scroll Tracking - 4/15/21
  //RP Added support for mobile fast touch scroll
  //YC Added global var setup so options are at top of code
(function(){

  // Checks to see if dataLayer has been initialized outside of library, if not
  // then initializes dataLayer
  dataLayer = window.dataLayer || [];

  //MODIFY
  //threshold = refresh time
  //milestones = milestones wished to be tracked

  //**OPTION 1**
  //Passes window threshold value to variable threshold
  scroll_as_threshold = 2000;

  //**OPTION 2**
  //Passes milestones array to variable milestones
  // expecting i.e. [[25, "low engagement"], [50, "medium engagement"], [75, "high engagement"])
  // Add in numbers (in order) of wanted %s
  scroll_as_milestones = [0, 25, 50, 75, 90, 100];

  //**OPTION 3**
  //Track 0% true or false
  // if true, scroll_as_milestones array must start with 0
  // tracking 0% event can be useful for easier calculated metrics
  var trackZero = false;

  //END OPTIONS SECTION

  //
  //DO NOT MODIFY BELOW THIS LINE
  //

  var threshold = scroll_as_threshold;
  var milestones = scroll_as_milestones


  // Determine whether user wants to track 0% depth.
  var lowerBound;
  if (trackZero === true) {
    lowerBound = -1;
  }
  else {
    lowerBound = 0;
  }

  // Setup record of which milestones have fired.
  var milestonesFired = [];

  // The previous lower bound is set to 0 so data is not sent with no activity
  var pastMilestone = lowerBound;

  // Initialize our timeoutID
  var timeoutID;

  // Function called to concatinize milestone value with milestone label to push
  // to dataLayer
  function formatLabel(i) {
      return milestones[i].toString() + "%";
  }

  // setup the math functions
  var deepestScroll = lowerBound, max = Math.max, _round = Math.round;

  // Get the window height
  function getwinheight(W, D){
    return W.innerHeight || (D.documentElement ? D.documentElement.clientHeight : D.body.clientHeight) || D.body.clientHeight;
  }

  // Get the scroll height from the top of the window
  function getscroll(W, D){
    return W.pageYOffset || (D.documentElement ? D.documentElement.scrollTop : D.body.scrollTop) || D.body.scrollTop;
  }

  // Get the document height
  function getdocheight(D) {
    var b = D.body, e = D.documentElement;
    return D.height || max(
      max(b.scrollHeight, e.scrollHeight),
      max(b.offsetHeight, e.offsetHeight),
      max(b.clientHeight, e.clientHeight)
    );
  }

  // Calculate the percentage below the fold
  function currentPercentageBelowFold(window, document){
    var window_height = getwinheight(window, document);
    var document_height = getdocheight(document);
    var scroll_overhead = getscroll(window, document);

    var pixels_below = (document_height - (window_height + scroll_overhead));
    var percent_scrolled = 100 * (pixels_below / document_height);
    return (percent_scrolled);
  }

  // Calculate the percentage above the fold
  function currentPercentageViewed(window, document){
    return 100 - currentPercentageBelowFold(window, document);
  }

  function pushCleanupMilestones(index) {
    // Make sure you don't push the current depth as part of the cleanup.
    milestonesFired.push(milestones[index]);
    for (j = 0; j < index; j++) {
      if (!milestonesFired.includes(milestones[j])) {
        // Make sure the cleanup milestones only fire once.
        milestonesFired.push(milestones[j]);
        var label = formatLabel(j);
        dataLayer.push({
          "event": "scroll-milestone",
          "milestone": label
        });
      }
    }
  }

  // Called if user passes into new milestone and is there beyond the threshold time limit
  function pushMilestone(index) {
      // Calls formatLabel function to create label to push to dataLayer
      var label = formatLabel(index);
      pushCleanupMilestones(index);
      // Push data to dataLayer
      dataLayer.push({
        "event": "scroll-milestone",
        "milestone": label
      });
  }

  // Whenever user scrolls, we fire this lengthly function to see if user past a milestone and
  // if yes then push that data to dataLayer
  window.addEventListener("scroll", trackScroll);
  // mobile users don't scroll, they "touchmove", so track that as well.
  window.addEventListener("touchmove", trackScroll);

  function trackScroll() {
    // Make scrollDepth equal to percentage scrolled down web page
    var scrollDepth = currentPercentageViewed(window, document);
    // Counter for while loop
    var count = milestones.length;
    // Loops through each milestone to find if user has passed new milestone
    while(count) {
      // Decrease counter by 1
      count--;
      // Checks to see if current scrollDepth is over Milestone
      if(_round(scrollDepth) >= milestones[count] && deepestScroll < milestones[count]) {
        currentMilestone = deepestScroll = milestones[count];
        // Checks to see if currentMilestone is different than pastMilestone
        if(currentMilestone != pastMilestone) {
          // Makes pastMilestone equal to currentMilestone
          pastMilestone = currentMilestone;
          // Make index value equal to count
          var index = count;
          //Clears threshold timer if still in progress
          window.clearTimeout(timeoutID);
          // Start threshold timer to push to dataLayer in user stays in milestone
          timeoutID = window.setTimeout(pushMilestone(index), threshold);
        }
        // Terminate while loop
        count = 0;
      }

    }
  };

})();

</script>

Tip

Код учитывает скроллинг на всех типах устройств, с помощью мыши, ТВ пульта, тачпада и смартфонов. Вставляем его в Пользовательский HTML и сохраняем тег.

Подключаем специальное событие

  • Открываем раздел триггеры и выбираем пункт Специальное событие
  • В блок Название события прописываем scroll-milestone
  • Название для триггера даем любое, например scroll-milestone

Создание пользовательской переменной

Глубина скроллинга считается отрезками в процентах, 10, 25, 50, 75 и т.д. Необходимо подготовить эту нарезку внутри ЯТМ.

  • Открываем раздел Пользовательские переменные, нажимаем ==Добавить новую==
  • Выбираем переменную уровня данных
  • В имени переменной данных пишем ==milestone==
  • Названием переменной указываем как ранее ==scroll-milestone==

Создаем тег отладки события

Пока в ЯТМ нет нормального режима отладки, и предварительного просмотра как в GTM, но можно костылить через консоль разработчика. подготовим нужный тег а в следующих заметках попробуем разобрать как это работает. Пока нам этот режим не потребуется, отработку цели мы проверим и без этого.

  • Создаем новый тег и называем его ==Отладка глубины скроллинга==
  • Выбираем тип ==Мини дебаггер триггеров и переменных==
  • В переменную записываем ранее созданную но в фигурных скобках =={{scroll-milestone}}==
  • Сохраняем тег

Настройка целей на процентовку в Я.Метрике

  • Заходим в раздел цели Я.Метрики и нажимаем Добавить новую
  • Создаем цель со следующими параметрами
    • Название – Глубина 10
    • Выбираем условие JavaScript событие
    • ==Идентификатор цели совпадает: Scroll_10==
  • ==Создаем по аналогии цели для Scroll_25, Scroll_50 и т.д.==

Правим код скрипта от ADSWERVE

Этот шаг важен, чтобы цель передавалась отдельно по каждому пороговому значению без лишних символов %.

  • Идем вновь в ЯТМ и меняем код пользовательского HTML-тега от Adswerve. Найдите строчки с этим кодом и удалите концовку с + и %:
function formatLabel(i) {
      return milestones[i].toString() + "%";
  }

Теперь будет так:

function formatLabel(i) {
      return milestones[i].toString();
  }

Сохраняем изменения.

Тег для запуска отслеживания

  • Создаем новый тег, называем его Я.Метрика-Глубина скроллинга
  • Выбираем шаблон тега Я.Метрика из списка, если его нет то переходим внизу в ветку Шаблоны из каталога и выбираем там
  • В ID счетчика прописываем номер Я.Метрики
  • В идентификатор цели указываем конструкцию scroll_{{scroll-milestone}}
  • В триггеры ставим специальное событие Созданное ранее
  • Сохраняем тег

После этого ждем некоторое время, обычно в течении нескольких часов события начинают регистрироваться в разделе конверсий Я.Метрики

Триггер для связки между всеми

Для того чтобы все настроенные теги работали, нужно создать тег Инициализации. Он делается разделе Триггеры ЯТМ

  • Открываем раздел триггеры и нажимаем добавить
  • Название прописываем Инициализация а в Тип триггера выбираем так же вариант Инициализация
  • В условиях активации оставляем Все события (
    • Это для того чтобы скроллинг считался на всех страницах, подходит если у вас лендинг, в случае многостраничного сайта лучше выбирать Некоторые события и указывать страницы
  • Далее в основном теге не скроллинг сайта выбираем триггер Инициализация
    • В Отладке тега глубины просмотра и тега на Я.Метрика - Глубина скроллинга выбираем – Триггер на скроллинг сайта.

На этом настройка завершена, в течении суток или меньше события должны отображаться в разделе конверсии Я.Метрики. После чего можно настраивать Ретаргетинг по-умному. Сайт-Метрика-ЯТМ-Директ-Профит.


Боярский Глеб Юрьевич @GlebBoyarskii — Telegram | VK

Обо мне:
Настройка Яндекс Директ, Таргет, Google (Yandex) Tag Manager, разработка Power BI и DataLens дашбордов, глубокая аналитика рекламных систем, комплексная веб-аналитика и performance-маркетинг.