Что делает скрипт
Скрипт отслеживает активность на сайте в интервале 10 секунд. Цель считается достигнутой когда набирается 60 секунд из этих интервалов.
На пальцах — вы зашли на страницу, листаете, читаете, скролите, водите курсором, кликаете и каждые 10 секунд срабатывает скрипт. При достижении 60 секунд вашей активности на сайте — скрипт отпарвляет в Яндекс Метрику или Google Analytics событие, т.е срабатывает цель 60sec.
Нужен для добавления микроконверсий в счётчики и дальнейшей оптимизации рекламных кампаний.
Авторы оригинального скрипта — https://www.it-agency.ru/academy/tools/60seconds/
Упрощенный и доработанный вариант скрипта
В Телеграме нашёл доработанный вариант скрипта, вставляю пост:
Как использовать скрипт
Мой сценарий:
- Добавляю в счётчики цели по 30, 60, 90 и 120 секунд
- Далее в рекламных кампаниях Директа, добавляю эти цели к макроконверсиям
- Набираю статистику
- Считаю корреляцию макро— и микроконверсий
- Перевожу кампании на оптимизацию по микроконверсиям
Можете придумать свои сценарии использования. Например, можно настроить оплату за несколько целей и этим микроконверсиям выставлять небольшое значение, для того, чтобы кампании получали больше статистики для обучения алгоритма.
Как настроить
Вся инфа по настройке есть в ссылках выше. Я делаю так — добавляю скрипт через GTM на срабатывание при просмотре любой страницы.
В метрике добавляю Javascript-события: 30sec, 60sec, 90sec, 120sec.
В двух словах:
- Копируете код ниже
- Меняете в нём ID счетчика Яндекс Метрике на свой
- Добавляете весь код в Google Tag Manager с триггером просмотра любых страниц
- Всё готово
Где скачать скрипт
Ссылка на 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-продвижение