Большинство конверсий на современных сайтах - не просто переход на страницу «Спасибо», а действия без смены URL: кнопка «Отправить» в попапе, клик по WhatsApp, скачивание файла, просмотр видео до конца. Для всего этого нужны JavaScript-события. Это самый гибкий инструмент настройки целей в Яндекс Метрике.
Как работают JavaScript-события в Метрике
Яндекс Метрика устанавливает на сайт глобальный объект - функцию ym(). Эта функция принимает несколько параметров:
ym(XXXXXXXX, 'reachGoal', 'IDENTIFIER', { parameters });
Где:
- XXXXXXXX - номер вашего счётчика Метрики
- 'reachGoal' - тип вызова (достижение цели)
- 'IDENTIFIER' - идентификатор цели (латиницей, без пробелов)
- { parameters } - необязательные дополнительные данные
Когда этот код выполняется в браузере пользователя, Метрика получает сигнал и засчитывает достижение цели с привязкой к текущей сессии, источнику трафика и пользователю.
Создание цели для JavaScript-события
- Настройки счётчика - Цели - Добавить цель
- Тип: «JavaScript-событие»
- Идентификатор цели: введите строку латиницей (например,
video_playилиpdf_download) - Название: человекочитаемое («Воспроизведение видео», «Скачивание PDF»)
- Сохраните
Важно: идентификатор в настройках Метрики и в коде на сайте должны совпадать точно, включая регистр. form_submit и Form_Submit - это разные цели.
Примеры JavaScript-событий для типичных сценариев
Отправка формы через AJAX
// После успешного ответа сервера
fetch('/api/submit/', { method: 'POST', body: formData })
.then(response => response.json())
.then(data => {
if (data.success) {
ym(XXXXXXXX, 'reachGoal', 'form_submit');
}
});
Клик по номеру телефона
document.querySelectorAll('a[href^="tel:"]').forEach(link => {
link.addEventListener('click', () => {
ym(XXXXXXXX, 'reachGoal', 'phone_click');
});
});
Клик по мессенджеру (WhatsApp, Telegram)
document.querySelector('.whatsapp-btn').addEventListener('click', function() {
ym(XXXXXXXX, 'reachGoal', 'whatsapp_click');
});
document.querySelector('.telegram-btn').addEventListener('click', function() {
ym(XXXXXXXX, 'reachGoal', 'telegram_click');
});
Скачивание файла
document.querySelectorAll('a[href$=".pdf"], a[href$=".xlsx"]').forEach(link => {
link.addEventListener('click', function() {
ym(XXXXXXXX, 'reachGoal', 'file_download', {
file: this.getAttribute('href')
});
});
});
Просмотр видео
// Для YouTube iFrame API
player.addEventListener('onStateChange', function(event) {
if (event.data === YT.PlayerState.PLAYING) {
ym(XXXXXXXX, 'reachGoal', 'video_start');
}
if (event.data === YT.PlayerState.ENDED) {
ym(XXXXXXXX, 'reachGoal', 'video_complete');
}
});
Достижение глубины прокрутки (scroll depth)
var scrollGoalSent = { '50': false, '90': false };
window.addEventListener('scroll', function() {
var scrollPercent = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100;
if (scrollPercent >= 50 && !scrollGoalSent['50']) {
ym(XXXXXXXX, 'reachGoal', 'scroll_50');
scrollGoalSent['50'] = true;
}
if (scrollPercent >= 90 && !scrollGoalSent['90']) {
ym(XXXXXXXX, 'reachGoal', 'scroll_90');
scrollGoalSent['90'] = true;
}
});
Передача параметров с событием
JavaScript-события можно обогащать дополнительными данными через четвёртый аргумент функции ym(). Эти параметры попадают в отчёт «Параметры визитов» в Метрике.
Структура параметров - вложенный объект:
ym(XXXXXXXX, 'reachGoal', 'form_submit', {
form: {
type: 'consultation',
source: 'popup',
city: 'moscow'
}
});
Это позволяет сегментировать одну цель по разным параметрам. Например, цель form_submit одна, но в отчёте вы видите: 40 заявок с type=consultation, 25 заявок с type=price_request, 15 заявок с type=callback.
В Метрике перейдите: Отчёты - Параметры - Параметры визитов - разверните структуру до нужного уровня.
Отладка JavaScript-событий
Перед запуском рекламы обязательно проверьте, что события срабатывают корректно.
Метод 1. Параметр отладки в URL
Добавьте к URL страницы ?_ym_debug=1 и откройте консоль разработчика (F12 - вкладка Console). При срабатывании события вы увидите запись:
[Метрика] Goal: form_submit
Метод 2. Расширение Яндекс Метрика для браузера
Установите официальное расширение Яндекс Метрика для Chrome или Firefox. Оно показывает все срабатывания счётчика и событий в реальном времени на любой странице.
Метод 3. Проверка через Network
В инструментах разработчика перейдите на вкладку Network, отфильтруйте по watch. При срабатывании цели должен появляться запрос к mc.yandex.ru с параметрами цели.
Частые ошибки при настройке JavaScript-событий
Ошибка 1. Код выполняется до загрузки счётчика
Если ym() вызывается раньше, чем загружается код Метрики - событие теряется. Решение: используйте очередь событий через глобальный массив или размещайте код счётчика в самом начале <head>.
Ошибка 2. Несовпадение идентификатора
reachGoal('FormSubmit') в коде и цель с идентификатором formsubmit в Метрике - разные вещи. Регистр важен. Рекомендация: всегда используйте строчные буквы и подчёркивания: form_submit.
Ошибка 3. Событие не передаётся при закрытии страницы
Если пользователь кликнул на ссылку (например, на внешний сайт) и в обработчике клика стоит reachGoal - браузер может закрыть страницу раньше, чем событие отправится.
Решение: добавьте небольшую задержку:
link.addEventListener('click', function(e) {
e.preventDefault();
ym(XXXXXXXX, 'reachGoal', 'external_link');
setTimeout(function() {
window.location.href = link.href;
}, 300);
});
Ошибка 4. Событие срабатывает несколько раз
Если обработчик события навешивается несколько раз (например, при использовании React или Vue без правильной очистки), событие может срабатывать 2-3 раза за одно действие. Используйте флаги или { once: true } в addEventListener.
Интеграция через Google Tag Manager
Если на сайте установлен GTM или Яндекс Тег Менеджер, JavaScript-события проще настроить без вмешательства в код:
- Создайте тег типа «Пользовательский HTML»
- Вставьте код с
ym(XXXXXXXX, 'reachGoal', 'event_id') - Создайте триггер (клик на элемент, отправка формы, custom event)
- Опубликуйте
Это позволяет маркетологам управлять целями без программиста, но требует, чтобы GTM уже был установлен на сайте.
Заключение
JavaScript-события - это инструмент для отслеживания всего, что не является простым переходом по страницам. Клики по мессенджерам, скачивания, AJAX-формы, видео - всё это отслеживается только через reachGoal. Настройка требует минимального знания JavaScript и понимания структуры сайта, но даёт полную картину конверсий. Каждое неотслеживаемое конверсионное действие - это слепая зона, которая мешает объективной оценке рекламы.