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

Что делает скрипт

Скрипт отслеживает активность на сайте в интервале 10 секунд. Цель считается достигнутой когда набирается 60 секунд из этих интервалов.

На пальцах — вы зашли на страницу, листаете, читаете, скролите, водите курсором, кликаете и каждые 10 секунд срабатывает скрипт. При достижении 60 секунд вашей активности на сайте — скрипт отпарвляет в Яндекс Метрику или Google Analytics событие, т.е срабатывает цель 60sec.

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

Авторы оригинального скриптаhttps://www.it-agency.ru/academy/tools/60seconds/

Упрощенный и доработанный вариант скрипта

В Телеграме нашёл доработанный вариант скрипта, вставляю пост:

Как использовать скрипт

Мой сценарий:

Не забудьте подписаться на мой Telegram-канал о интернет-маркетинге, чтобы не пропускать новые интересные статьи и полезные материалы (чек-листы, шаблоны, кейсы).
  1. Добавляю в счётчики цели по 30, 60, 90 и 120 секунд
  2. Далее в рекламных кампаниях Директа, добавляю эти цели к макроконверсиям
  3. Набираю статистику
  4. Считаю корреляцию макро— и микроконверсий
  5. Перевожу кампании на оптимизацию по микроконверсиям

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

Как настроить

Вся инфа по настройке есть в ссылках выше. Я делаю так — добавляю скрипт через GTM на срабатывание при просмотре любой страницы.

В метрике добавляю Javascript-события: 30sec, 60sec, 90sec, 120sec.

В двух словах:

  1. Копируете код ниже
  2. Меняете в нём ID счетчика Яндекс Метрике на свой
  3. Добавляете весь код в Google Tag Manager с триггером просмотра любых страниц
  4. Всё готово

Где скачать скрипт

Ссылка на Pastebin

Можно скопировать код скрипта прямо тут:

<script>
var settings = {
    /* Настройки которые надо менять */
    need: 30, // Сюда вписываем через какое количество секунд повторно отправлять цель, по умолчанию стоит 60, но можно указать и 30
    checkTime: 10, // секунды. период проверки. 
    //желательно, чтобы need было кратно checkTime
    IDmetrika: 90057536, // Сюда вписываем ИД Счетчика Яндекс Метрики
    code_gtm: true, //Скрипт вставляете с помощью GTM пишем True, если вставляете напрямую на сайт пишем False (в данном случае и Google Analytics требуется вставлять напрямую на сайт)
    // При False в настройках Tilda счетчика UA не забудьте "Включить gtag.js"
    /* Настройки которые надо менять */
}
 
/* 
## Инструкция по добавлению целей в Яндекс.Метрику ##
Если вы указываете в функции NEED шаг в 30 секунд, то в Метрике вы можете отслеживать цели с шагом в 30 секунд и цели событий добавляйте такие:
30sec
60sec
90sec
120sec
150sec и т.д.
 
Если вы указываете в функции NEED шаг в 60 секунд, то в Метрике вы можете отслеживать цели с шагом в 30 секунд и цели событий добавляйте такие:
60sec
120sec
180sec
240sec и т.д.
*/
 
/* БОЛЬШЕ В КОДЕ НИЧЕГО НЕ ТРОГАЕМ, ЦЕЛИ ТОЖЕ НЕ ПРАВИМ */
function gtag(){dataLayer.push(arguments);}
 
var metricsFn = function () {
    console.log(ActiveScore.timer);
    console.log(ActiveScore.need);
    var c1 = this.getCookie(this.cookieName);
    console.log(c1);
    if (ActiveScore.timer >= ActiveScore.need) {
        console.log("событие отправилось");
        /* Тут перечислять все что нужно будет вызвать по достижению цели */
        ym(settings.IDmetrika, "reachGoal", this.cookieName.slice(0, -3));
        
    if (settings.code_gtm == true) {
        dataLayer.push({'event': this.cookieName.slice(0, -3)});
    } else {
        gtag('event', 'Timer', {'event_category' : 'Page Timer', 'event_action' : this.cookieName.slice(0, -3)});
    }
        
        /* Тут перечислять все что нужно будет вызвать по достижению цели */
    }
};
 
var ActiveScore = {
    need: settings.need,
    checkTime: settings.checkTime,
    loop: true,
    counter: 0,
    cookieName: "60sec_ap",
    sendFn: null,
    parts: 0,
    active_parts: 0,
    timer: 0,
    events: [
        "touchmove",
        "blur",
        "focus",
        "focusin",
        "focusout",
        "load",
        "resize",
        "scroll",
        "unload",
        "click",
        "dblclick",
        "mousedown",
        "mouseup",
        "mousemove",
        "mouseover",
        "mouseout",
        "mouseenter",
        "mouseleave",
        "change",
        "select",
        "submit",
        "keydown",
        "keypress",
        "keyup",
        "error",
    ],
 
    setEvents: function () {
        for (var index = 0; index < this.events.length; index++) {
            var eName = this.events[index];
            window.addEventListener(eName, function (e) {
                if (e.isTrusted && ActiveScore.period.events == false) {
                    ActiveScore.period.events = true;
                }
            });
        }
    },
 
    period: {
        start: 0,
        end: 0,
        events: false,
    },
 
    init: function (fn) {
        this.calcParts();
        this.setEvents();
        this.setStartCounter();
        if (this.checkCookie()) {
            this.sendFn = fn;
            this.start();
        }
    },
 
    readLastCookie: function () {
        var absurdlyLarge = 100000;
        for (var i = 1; i < absurdlyLarge; i++) {
            var cookie = this.getCookie(i * this.need + 'sec_ap');
            if (cookie != this.parts * this.parts) return { i: i, cookie: cookie };
        }
        return { i: 1, cookie: 0 };
    },
 
    setStartCounter: function () {
        var lastCookie = this.readLastCookie();
        this.counter = lastCookie.i - 1;
        this.active_parts = Number(lastCookie.cookie);
        this.cookieName = (this.counter + 1) * this.need + "sec_ap";
    },
 
    calcParts: function () {
        this.parts = Math.ceil(this.need / this.checkTime);
    },
 
    setPeriod: function () {
        this.period.start = this.microtime();
        this.period.end = this.period.start + this.checkTime;
        this.period.events = false;
    },
 
    microtime: function () {
        var now = new Date().getTime() / 1000;
        var s = parseInt(now);
        return s;
    },
 
    start: function () {
        this.setPeriod();
        this.runPeriod();
    },
 
    timeoutId: null,
 
    checkPeriod: function () {
        if (this.period.events == true) {
            this.active_parts = this.active_parts + 1;
            // console.log('В этой секции были действия');
        } else {
            // console.log('В этой секции НЕБЫЛО действия');
        }
        this.timer = this.active_parts * this.checkTime;
        console.log(
            this.active_parts + " / " + this.parts + " [" + this.timer + "]"
        );
 
        if (this.checkSecs()) {
        } else {
            this.start();
        }
        this.setCookie(this.cookieName, this.active_parts);
    },
 
    checkSecs: function () {
        if (this.timer >= this.need) {
            this.send();
            if (this.loop == true) {
                this.counter++;
                this.timer = 0;
                this.active_parts = 0;
                this.cookieName = (this.counter + 1) * this.need + "sec_ap";
                return false;
            } else {
                // console.log('Завершили проверку активности');
                return true;
            }
        }
        return false;
    },
 
    timeoutFn: function () {
        ActiveScore.checkPeriod();
    },
 
    runPeriod: function () {
        this.timeoutId = setTimeout(this.timeoutFn, this.checkTime * 1000);
    },
 
    send: function () {
        if (this.getCookie(this.cookieName) == this.parts * this.parts) {
            this.setStartCounter();
        } else {
            this.setCookie(this.cookieName, this.active_parts * this.active_parts);
        }
        this.sendFn();
    },
 
    checkCookie: function () {
        var c = this.getCookie(this.cookieName);
        if (c == null) {
            return true;
        } else {
            if (c == '') return true;
            c = parseInt(c);
            if (c >= this.parts) {
                // console.log('Скрипт даже не запустился...');
                if (this.loop == true) {
                    return true;
                }
                return false;
            } else {
                this.active_parts = c;
                return true;
            }
        }
    },
 
    setCookie: function (name, value, days) {
        var expires = "";
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
            expires = "; expires=" + date.toUTCString();
        }
        document.cookie = name + "=" + (value || "") + expires + "; path=/";
    },
    getCookie: function (name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(";");
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == " ") c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    },
    eraseCookie: function (name) {
        document.cookie =
            name + "=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
    },
};
 
ActiveScore.init(metricsFn);
</script>

Если вам нужно:
  • настроить рекламу в Яндекс Директ
  • сделать аудит текущей рекламы
  • нужна консультация по настройке и запуску рекламы
  • нужно SEO или аудит SEO
пишите мне по контактам
Фото аватара
Алашеев Александр

В контекстной рекламе с 2018 года. Веду проекты в Яндекс Директ и Google Ads с бюджетами до 5 млн. в месяц. Работал с 20+ нишами на 5 языках.

Оцените автора