Коротко. Цель по JS-событию нужна для любого действия без смены URL — клика по кнопке, отправки AJAX-формы, воспроизведения видео; она вызывается кодом ym(СЧЁТЧИК,'reachGoal','название_события'), вставленным в обработчик действия. Составная цель собирается из уже существующих простых целей в заданном порядке и показывает воронку с отвалом на каждом шаге — но засчитывает шаги только внутри одного визита, а визит в Метрике по умолчанию закрывается после 30 минут бездействия. Без Google Tag Manager обе настройки требуют правки кода сайта; с GTM JS-событие можно собрать без разработчика за 15-20 минут.
Когда URL-цели недостаточно
URL-цель засчитывается, когда посетитель открывает конкретный адрес страницы — она работает только там, где после действия физически меняется URL. Как только форма отправляется через AJAX без перезагрузки, кнопка открывает всплывающее окно вместо перехода или на странице воспроизводится видео — адрес не меняется, и URL-цель никогда не сработает, сколько бы раз ни происходило нужное действие. Для всех этих случаев есть только один рабочий вариант — цель по JS-событию, которая ловит не адрес страницы, а сигнал, переданный кодом в момент самого действия.
Код вызова цели: reachGoal
Технически JS-событие — это вызов функции ym(XXXXXXXX,'reachGoal','идентификатор_события', параметры, колбэк), где XXXXXXXX — номер счётчика, а идентификатор события — произвольное название, которое дальше указывается в настройках цели в личном кабинете Метрики буквально так же, с учётом регистра. Вызов вставляется в обработчик нужного действия на странице — например, в функцию, которая срабатывает по клику на кнопку или по успешному ответу сервера на отправку формы. Именно в этой связке чаще всего случается ошибка: код вызова физически отсутствует в обработчике (потерялся при правке шаблона) или вызывается не на то событие — например, на клик по кнопке «Отправить», а не на подтверждение успешной отправки, из-за чего цель засчитывается даже при ошибке валидации формы.
Настройка через Google Tag Manager без правки кода сайта
Если на сайте уже установлен GTM, JS-цель можно собрать без прямого доступа к файлам шаблона. Порядок: создать тег типа «Пользовательский HTML» или использовать встроенный шаблон «Отслеживание форм»/клика, в коде тега прописать тот же вызов ym(...,'reachGoal',...), привязать триггер — «Клик по элементу» с CSS-селектором нужной кнопки или «Отправка формы» с условием на успешный ответ, опубликовать контейнер. Занимает 15-20 минут для одного события. Ограничение способа — точность триггера: если селектор кнопки задан слишком широко (например, по классу, который используется на нескольких элементах страницы), цель начнёт засчитываться по кликам на элементы, не имеющие отношения к целевому действию, и завысит конверсию незаметно для того, кто настраивал.
Параметры цели — что можно передать дополнительно
Третий аргумент функции reachGoal — необязательный объект с дополнительными параметрами, который передаётся вместе с фактом достижения цели: например, сумму заявки, категорию товара или название формы, если на странице их несколько. Эти данные попадают в параметры визита и доступны в отчётах Метрики для сегментации — можно посмотреть не просто «сколько было заявок», а «сколько заявок пришло по каждой категории услуг» без создания отдельной цели на каждую категорию. На практике параметры используют реже, чем стоило бы: чаще ограничиваются фактом достижения цели, хотя разница в глубине анализа заметная — особенно на сайтах с несколькими формами или товарными категориями.
Составная цель: как собрать воронку из готовых шагов
Составная цель — не отдельный тип с собственной технической настройкой, а надстройка над уже существующими простыми целями. В интерфейсе Метрики выбираются 2-4 ранее созданные цели (URL-цели или JS-события) и выстраиваются в порядке следования — например: «открыл каталог» → «открыл карточку товара» → «положил в корзину» → «оформил заказ». Готовые шаги должны существовать и быть проверены по отдельности до сборки составной цели — иначе ошибка в одном шаге исказит всю воронку, и будет непонятно, действительно ли отваливаются посетители на этом этапе или просто не работает сама цель-компонент.
Ограничения составной цели: визит, порядок, число шагов
Ключевое ограничение, которое часто упускают: шаги составной цели засчитываются только в рамках одного визита. Визит в Метрике по умолчанию закрывается после 30 минут бездействия — если посетитель зашёл в каталог сегодня, а вернулся оформить заказ через два дня, для составной цели это два разных визита, и полная воронка не засчитается, хотя человек в итоге купил. Второе ограничение — порядок: некоторые составные цели требуют строгой последовательности шагов, другие допускают более гибкий сценарий, это стоит проверять непосредственно в настройках при создании. По количеству шагов интерфейс рассчитан на воронки из нескольких этапов — для большинства сценариев продажи 3-4 шага достаточно, чтобы увидеть основной разрыв в конверсии, и растягивать составную цель на десяток мелких шагов обычно не имеет практического смысла: чем длиннее цепочка, тем меньше посетителей проходят её целиком за один визит просто по вероятности.
| Параметр | JS-событие | Составная цель |
|---|---|---|
| Что фиксирует | Одно действие без смены URL | Последовательность из готовых целей |
| Нужен код на сайте | Да, вызов reachGoal или GTM-тег | Нет, сборка в интерфейсе Метрики |
| Временное ограничение | Нет | Шаги должны попасть в один визит (30 минут бездействия закрывают визит) |
| Типичная ошибка | Код не вставлен или вызывается не на то событие | Один из шагов-компонентов сам по себе не работает |
Типичные ошибки в коде и как их находить
Помимо отсутствующего или неверно расположенного вызова, встречаются три характерные ошибки. Первая — JS-ошибка выше по коду страницы обрывает выполнение скрипта до того, как доходит очередь до вызова цели: событие в интерфейсе Метрики создано, но никогда не сработает, пока не устранена сама ошибка в консоли разработчика. Вторая — событие вызывается несколько раз за одно действие, например при двойном клике или при повторной отправке формы после ошибки валидации — это завышает конверсию и требует проверки логики обработчика на защиту от повторного вызова. Третья — название события в коде не совпадает буквально с названием в настройках цели: лишний пробел, другой регистр буквы или использование дефиса вместо нижнего подчёркивания делают цель формально существующей, но никогда не засчитываемой. Проверять новую JS-цель нужно сразу после настройки — через вкладку Network в инструментах разработчика или расширение «Инспектор сайтов», не откладывая на потом, потому что ошибка находится обычно случайно, когда отчёт по конверсиям уже показал подозрительный ноль за пару недель.
Куда идут данные дальше
Проверенные JS-события и составные цели становятся основой для более широкой картины: связка с рекламными кабинетами вроде Яндекс.Директа позволяет оптимизировать ставки под реальные конверсии, а не под клики, а данные по составным воронкам обычно попадают в отчёты сквозной аналитики, если на сайте настроена интеграция с CRM через автоматизацию процессов. Без правильно настроенного кода на этом уровне всё выше строится на неверных цифрах — поэтому техническую часть настройки стоит проверять отдельно от факта «цель существует в интерфейсе».
Обязательно ли использовать Google Tag Manager для JS-целей?
Нет, можно вставить вызов reachGoal напрямую в код сайта. GTM удобен тем, что позволяет обойтись без прямого доступа к шаблону и без разработчика для большинства типовых сценариев — клика по кнопке или отправки формы.
Почему составная цель показывает меньше конверсий, чем ожидалось?
Чаще всего потому, что шаги воронки растянуты на разные визиты — например, посетитель вернулся оформить заказ через несколько дней. Составная цель засчитывает только шаги внутри одного визита, разорванные во времени действия в неё не попадают.
Можно ли передать сумму заказа вместе с целью?
Да, через параметры в вызове reachGoal можно передать дополнительные данные — сумму, категорию, название формы. Для полноценной работы с суммами заказов в интернет-магазине правильнее использовать отдельный модуль электронной торговли.
Что будет, если название события в коде не совпадает с настройкой цели?
Цель останется в интерфейсе Метрики созданной, но никогда не будет засчитывать конверсии — событие с другим названием система не свяжет с этой целью, даже если оно фактически означает то же самое действие.
Сколько шагов можно включить в составную цель?
Интерфейс поддерживает несколько шагов, но для большинства воронок продаж достаточно 3-4 — чем длиннее цепочка, тем меньше посетителей проходят её целиком в рамках одного визита.
Настроить JS-события и составные цели без ошибок в коде
Разберём, какие действия на сайте нужно ловить JS-событиями, соберём воронку составных целей и проверим, что код действительно передаёт данные в Метрику.