Владелец студии ремонта запустил лендинг, настроил Директ, подключил Метрику. Клики шли, деньги тратились — а заявок было 3 за неделю. Он думал, что проблема в дизайне. Оказалось, нужно было настроить 5 целей через Яндекс Тег Менеджер — и воронка стала видна как на ладони.
Яндекс Тег Менеджер (ЯТМ) позволяет управлять тегами на сайте без правки исходного кода. Это критично для лендингов: нужно отследить скролл до формы, клик по полю телефона, начало заполнения — эти события не меняют URL, и стандартные цели Метрики их не увидят.
Через ЯТМ события настраиваются централизованно: создаётся триггер (условие срабатывания), тег (что передать в Метрику) и переменная (какие данные собрать). Маркетолог делает всё сам через интерфейс — не нужно каждый раз просить программиста вставить код в HTML.
Войдите в Яндекс.Метрику, перейдите Настройки → Счётчик и активируйте Тег Менеджер. После этого включите функцию Пользовательский HTML.
Пользовательский HTML — это тип тега, который позволяет добавлять произвольный JavaScript-код для отслеживания событий, не поддерживаемых стандартными шаблонами. Код выполняется при срабатывании триггера, внутри можно использовать переменные для динамической подстановки значений.
Сохраните изменения. Теперь в ЯТМ доступен шаблон Пользовательский HTML для создания тегов.
Откройте Яндекс Тег Менеджер, перейдите Триггеры → Добавить триггер. Выберите тип Инициализация.
Если нужно отслеживать скролл только на лендингах, добавьте условие Некоторые события → Page URL содержит /landing/. Для всех страниц оставьте Все события.
Назовите триггер Инициализация — Скролл и сохраните.
Перейдите Теги → Добавить тег. Выберите шаблон Пользовательский HTML.
Вставьте в поле HTML следующий код:
<script>
(function(){
dataLayer = window.dataLayer || [];
// НАСТРОЙКИ
var scroll_as_threshold = 2000; // Время в миллисекундах (2 сек)
var scroll_as_milestones = [0, 25, 50, 75, 90, 100]; // Пороги в %
var trackZero = false; // Отслеживать 0% (false = нет)
var threshold = scroll_as_threshold;
var milestones = scroll_as_milestones;
var lowerBound = trackZero === true ? -1 : 0;
var milestonesFired = [];
var pastMilestone = lowerBound;
var timeoutID;
var deepestScroll = lowerBound, max = Math.max, _round = Math.round;
function getwinheight(W, D){
return W.innerHeight || (D.documentElement ? D.documentElement.clientHeight : D.body.clientHeight) || D.body.clientHeight;
}
function getscroll(W, D){
return W.pageYOffset || (D.documentElement ? D.documentElement.scrollTop : D.body.scrollTop) || D.body.scrollTop;
}
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));
}
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));
return 100 * (pixels_below / document_height);
}
function currentPercentageViewed(window, document){
return 100 - currentPercentageBelowFold(window, document);
}
function formatLabel(i) {
return milestones[i].toString();
}
function pushCleanupMilestones(index) {
milestonesFired.push(milestones[index]);
for (j = 0; j < index; j++) {
if (!milestonesFired.includes(milestones[j])) {
milestonesFired.push(milestones[j]);
var label = formatLabel(j);
dataLayer.push({"event": "scroll-milestone", "milestone": label});
}
}
}
function pushMilestone(index) {
var label = formatLabel(index);
pushCleanupMilestones(index);
dataLayer.push({"event": "scroll-milestone", "milestone": label});
}
window.addEventListener("scroll", trackScroll);
window.addEventListener("touchmove", trackScroll);
function trackScroll() {
var scrollDepth = currentPercentageViewed(window, document);
var count = milestones.length;
while(count) {
count--;
if(_round(scrollDepth) >= milestones[count] && deepestScroll < milestones[count]) {
currentMilestone = deepestScroll = milestones[count];
if(currentMilestone != pastMilestone) {
pastMilestone = currentMilestone;
var index = count;
window.clearTimeout(timeoutID);
timeoutID = window.setTimeout(pushMilestone(index), threshold);
}
count = 0;
}
}
};
})();
</script>
Что настроить в коде:
scroll_as_threshold = 2000 — пользователь должен находиться на уровне прокрутки 2 секунды, чтобы событие сработалоscroll_as_milestones = [0, 25, 50, 75, 90, 100] — пороги прокрутки в процентахtrackZero = false — отслеживать ли 0% (первый заход на страницу)В качестве триггера активации выберите Инициализация — Скролл. Сохраните тег.
Перейдите Триггеры → Добавить триггер. Выберите тип Специальное событие.
В поле Название события укажите scroll-milestone. Это имя события прописано в коде выше.
Назовите триггер Custom Event — scroll-milestone и сохраните.
Перейдите Переменные → Добавить переменную. Выберите тип Переменная уровня данных.
В поле Имя переменной уровня данных укажите milestone. Это имя прописано в коде — оно передаёт пороговые значения (25, 50, 75 и т.д.).
Назовите переменную DLV milestone и сохраните.
Откройте Яндекс.Метрику, перейдите Цели → Добавить цель. Выберите тип JavaScript-событие.
Создайте 2 цели для скролла:
Цель 1: Скролл до цен (50%)
Скролл до блока с ценамиscroll_50Цель 2: Скролл до формы (75%)
Скролл до формы заявкиscroll_75Сохраните цели.
Вернитесь в ЯТМ, перейдите Теги → Добавить тег. Выберите шаблон Яндекс Метрика.
Если шаблона нет, добавьте его через Шаблоны из каталога.
Заполните поля:
Яндекс Метрика — Глубина прокруткиscroll_{{DLV milestone}}Эта конструкция автоматически подставит значение из переменной (25, 50, 75), и событие передастся в Метрику как scroll_25, scroll_50, scroll_75.
В качестве триггера выберите Custom Event — scroll-milestone. Сохраните тег.
Откройте лендинг, нажмите правую кнопку мыши на поле телефона → Просмотр кода. В открывшемся окне найдите атрибут id или class поля.
Пример: <input id="phone-input" type="tel">.
Если id нет, используйте CSS-селектор или class.
Перейдите Триггеры → Добавить триггер. Выберите тип Клики — все элементы.
В условиях активации укажите Некоторые события:
phone-inputЕсли используете CSS-селектор: Click Element → соответствует CSS-селектору → input[type="tel"].
Назовите триггер Клик по полю телефона и сохраните.
В Яндекс.Метрике создайте цель JavaScript-событие с идентификатором form_field_click.
Создайте тег Пользовательский HTML с кодом:
<script>
ym(98765432, 'reachGoal', 'form_field_click');
</script>
Замените 98765432 на ваш номер счётчика.
В качестве триггера выберите Клик по полю телефона. Сохраните и опубликуйте.
Создайте тег Пользовательский HTML с кодом:
<script>
(function() {
var form = document.querySelector('form');
var fieldsCount = 0;
var trackedFields = form.querySelectorAll('input[type="text"], input[type="tel"], input[type="email"]');
trackedFields.forEach(function(field) {
field.addEventListener('blur', function() {
if (field.value !== '') {
fieldsCount++;
if (fieldsCount >= 2) {
ym(98765432, 'reachGoal', 'form_interaction');
fieldsCount = 0; // Сбрасываем, чтобы событие сработало один раз
}
}
});
});
})();
</script>
Замените 98765432 на номер счётчика. В Метрике создайте цель form_interaction.
Триггер активации: Инициализация (код выполнится при загрузке страницы).
Если у вас HTML-форма, добавьте в тег <form> атрибут onsubmit:
<form action="#" method="post" onsubmit="ym(98765432, 'reachGoal', 'form_submit'); return true;">
<input name="phone" type="tel" placeholder="Телефон">
<input type="submit" value="Отправить">
</form>
Замените 98765432 на номер счётчика.
Создайте триггер Клики — все элементы с условием:
button[type="submit"]Создайте тег Пользовательский HTML:
<script>
ym(98765432, 'reachGoal', 'form_submit');
</script>
Триггер: Клик по кнопке отправки.
В Метрике создайте цель form_submit.
Нажмите Предварительный просмотр → Открыть предварительный просмотр. Откроется лендинг с параметром _ytm_preview в URL.
Внизу страницы появится панель отладки ЯТМ. Перейдите на вкладку Events и выполните прокрутку, клик по полю, отправку формы. Если всё настроено правильно, на шкале событий появятся достижения целей: scroll_50, scroll_75, form_field_click, form_interaction, form_submit.
Опубликуйте контейнер ЯТМ, чтобы настройки применились ко всем пользователям.
Клиент — компания по установке окон. Лендинг на Tilda, Директ настроен, 250 переходов в неделю, заявок — 5.
Настроили 5 целей. Воронка:
Проблемы:
Исправили: добавили конкретику в оффер, переписали текст над формой, убрали лишние поля.
Результат: заявок выросло с 5 до 19 (в 3,8 раза) при том же бюджете.
Нужен лендинг с настроенной аналитикой? Пишите: sdelayusait.ru
Логика настройки JavaScript-событий опирается на практики веб-аналитики Дмитрия Кота и подход к отслеживанию конверсий из методологии Игоря Манна.


















