События трекинга: что мы видим и зачем
Одна страница: какие события мы собираем, что они говорят, и какие из них критичны для оптимизации рекламы. Это карта данных, на которой строится отчёт по воронке.
⚙️ Технический as-built (May 2026) и runbook для добавления новых воронок —
24-tracking-runbook.md. Этот документ описывает что мы трекаем (карта данных); runbook — как оно собрано в коде, Make сценарии и Meta-стеке, плюс чек-лист для запуска ещё одной воронки.
Что изменилось недавно (май 2026)
form_idтеперь содержит CTA-источник для модальной формы. PR #572. Былоmodal, сталоmodal:hero/modal:pricing-offer/modal:countdown-reserve/modal:cta-band-finalи т.д. Это говорит, какая кнопка на странице открыла форму, которая в итоге конвертировала. Полная таблица CTA — в разделе «CTA → cta_location» ниже.- Новое поле в
lead-блоке:exclusive_interest(boolean). PR #573. Срабатывает, когда пользователь поставил чекбокс «Мне интересен Exclusive · 1:1 с Юсупом» в форме регистрации. Используется CRM для приоритизации на квалифицирующем звонке. lead_upsellсобытие больше не срабатывает на текущем флоу. PR #573. Раньше клик «Да, рассмотреть Exclusive» на/thank-youсоздавал второй submission + второй conversion event. Теперь интерес ловим в исходной регистрации черезexclusive_interest. Скриптsrc/scripts/upsell.tsостался в репо (dormant) — если в будущем понадобится отдельный upsell на другом флоу, его можно переподключить.
Принцип
Каждое событие отвечает на один из трёх вопросов:
- Сколько людей дошли до X?
- Где они отвалились?
- Какой вариант работает лучше?
Если событие не отвечает ни на один из них — оно не нужно. Чем меньше событий, тем понятнее отчёт.
Карта воронки → события
Показ рекламы Meta показывает (статистика в кабинете)
│
▼
Клик по рекламе utm_*, fbclid, gclid, yclid → летят на сайт
│
▼
Открыли лендинг page_view + scroll_depth (глубина)
│
▼
Видео / контент video_* | section_view (что посмотрели)
│
▼
Клик по CTA cta_click + whatsapp_click
│
▼
Открыли форму form_view
│
▼
Заполнили form_start → form_step → form_submit
│
▼
Лид зафиксирован form_success + Lead (Meta Pixel)
│
▼
/thank-you generate_lead (ключевая конверсия)
│
▼
Менеджер → оплата [вне сайта: amoCRM + Продамус]
│
▼
Покупка Purchase (CAPI с шлюза) ← главное для рекламы
Три события, без которых нет рекламной оптимизации
| Событие | Где живёт | Зачем |
|---|---|---|
page_view | Браузер — Pixel сам | Meta учится «как выглядит наш трафик», строит look-alike |
Lead | Браузер + CAPI (с шлюза) | Meta учится «какой клик стал заявкой» |
Purchase | Только CAPI с шлюза | Meta учится «какой клик стал покупателем» — на этом оптимизация рекламы |
Без Purchase реклама оптимизируется только на дешёвые лиды. С Purchase —
на людей, которые реально платят. Разница для нас в ROAS — в разы. Это
главная причина, почему серверная сторона (шлюз → Meta CAPI) не опциональна.
Полный список событий
Сгруппированы по этапу воронки. Колонка Статус: ✅ работает · 🟡 ставим в плане · 🔲 пока не нужно.
Этап 1 — Заход на сайт
| Событие | Когда срабатывает | Несёт | Статус |
|---|---|---|---|
page_view | Загрузка любой страницы | вариант, mechanism, UTMs, click-IDs | ✅ |
scroll_depth | Прокрутили 25/50/75/90% | scroll_percent, page_path | 🟡 |
Этап 2 — Вовлечение
| Событие | Когда срабатывает | Несёт | Статус |
|---|---|---|---|
section_view | Блок ≥40% во вьюпорте | section_id (hero, modules, pricing, …) | ✅ |
cta_click | Клик по [data-cta] | cta_location (hero, pricing-offer, …) | ✅ |
whatsapp_click | Клик по плавающей кнопке WhatsApp | from_page | 🟡 |
outbound_click | Клик на внешний бренд-канал (IG, YT, t.me) | outbound_host, outbound_url | 🟡 |
Этап 3 — VSL (видео на /vsl)
| Событие | Когда срабатывает | Несёт | Статус |
|---|---|---|---|
video_start | Начали смотреть | vsl_version (medium/short), duration_total | 🟡 |
video_first_30s | Посмотрели первые 30 сек | vsl_version — сигнал «хук сработал» | 🟡 |
video_progress | Дошли до 25 / 50 / 75 / 100% | video_percent, video_seconds | 🟡 |
video_complete | Досмотрели до 95%+ | vsl_version | 🟡 |
video_cta_click | Клик по CTA во время / после видео | time_at_click | 🟡 |
Этап 4 — Форма
| Событие | Когда срабатывает | Несёт | Статус |
|---|---|---|---|
form_view | Форма попала во вьюпорт | form_id (базовый: modal / final / hero / guide-modal) | ✅ |
form_start | Первый фокус в поле | form_id (базовый) | ✅ |
form_step | Шаг многошаговой формы пройден | form_id (базовый), step_index, step_id | ✅ |
form_submit | Нажата кнопка отправки | form_id (обогащённый: modal:<cta>), funnel_step_reached | ✅ |
form_success | Сервер ответил 2xx | form_id (обогащённый), submission_id, lead_score | ✅ |
form_error | Ошибка отправки | form_id (обогащённый), error_type | ✅ |
form_abandon | Покинули форму с пустыми полями | form_id, step_index, last_field | 🔲 (после запуска) |
Почему form_view / form_start / form_step несут БАЗОВЫЙ form_id,
а form_submit / form_success / form_error — ОБОГАЩЁННЫЙ: форма
монтируется (client:idle) до того, как пользователь кликнул кнопку,
которая её открыла, — на этом этапе CTA-источник ещё неизвестен. Как
только пользователь дошёл до submit, мы знаем точно, какая кнопка вела
к конверсии — добавляем её в form_id через :<cta>. Полный payload
лида (тот, что летит на бэкенд) тоже несёт обогащённый form_id.
В Sheets/Looker колонку form_id достаточно разделить по : —
получите две размерности: form_location (modal / final / hero) и
form_trigger (hero / pricing-offer / countdown-reserve / …). Сводная
по form_trigger × count of conversions = рейтинг «какая CTA на
странице приводит к конверсии».
Поля внутри lead-блока в payload (form_success + бэкенд)
| Поле | Тип | Источник | Когда заполняется |
|---|---|---|---|
name | string | поле формы | всегда |
email | string | поле формы | механизм registration |
phone | string | поле формы (с кодом страны) | всегда |
niche | string | селект | механизмы registration / info-gather |
city | string | поле формы | механизм registration |
exclusive_interest | boolean | чекбокс в форме регистрации | true когда выбран; иначе поле отсутствует в payload |
lead_score | number | скоринг по answers | механизмы со скорингом (quick-lead, info-gather, qualification, application) |
qualified | boolean | lead_score >= qualifyThreshold | те же механизмы |
Этап 5 — Лид зафиксирован
| Событие | Когда срабатывает | Несёт | Статус |
|---|---|---|---|
generate_lead | Загрузка /thank-you | вариант, mechanism, qualified, lead_score, вся атрибуция | ✅ |
Этап 6 — Покупка (вне сайта, server-side)
| Событие | Когда срабатывает | Куда | Статус |
|---|---|---|---|
Lead (CAPI) | Сразу с шлюза — на отправку формы | Meta CAPI | 🟡 |
Purchase (CAPI) | Шлюз получил «оплачено» от Продамус | Meta CAPI | 🟡 |
Универсальный пакет атрибуции
Любое событие в браузере уже несёт стандартный набор «откуда пришёл» — он
зашивается на первом заходе и хранится в sessionStorage. Реализация — в
src/conversion/attribution.ts + src/scripts/page-init.ts + Layout.astro.
| Поле | Источник | Когда захватывается |
|---|---|---|
ab_variant | Пропс лендинга | На каждом page_view |
ab_experiment | Constants | На каждом page_view |
funnel_mechanism | Пропс формы | На каждом page_view |
session_id | UUID при первом заходе | Один раз на сессию |
landing_path | URL первого заходa | Один раз |
referrer | document.referrer | Один раз |
utm_source/medium/campaign/term/content | URL | Первое непустое значение |
gclid, fbclid, yclid | URL | Первое непустое значение (yclid собирается на будущее) |
touch | first-touch или second-touch | По localStorage возврата |
Правило first-touch: значение записывается только если оно не пустое и в storage ещё ничего нет. Это значит, что атрибуция рекламы переживает внутреннюю навигацию по сайту — не теряется на втором клике.
Кто принимает события
Два приёмника, каждый отвечает за своё:
| Приёмник | Что видит | Чем питается |
|---|---|---|
| GA4 | Все события воронки | Через GTM, из dataLayer |
| Meta Pixel + CAPI | PageView, ViewContent, Lead, Purchase | Браузер (Pixel) + сервер (CAPI), дедуп по eventID |
Дедупликация Pixel + CAPI — браузер шлёт событие с eventID = submission_id,
шлюз шлёт то же событие с тем же eventID. Meta видит оба и считает один раз.
Это даёт качество выше, чем у каждого из них по отдельности (особенно на iOS
Safari, где ITP режет браузерный пиксель).
Yandex Metrika на этот сайт не подключаем — Yandex Direct в медиаплане пока не используем. Если позже зайдём в этот канал, добавим счётчик и серверный goal отдельным шагом;
yclidв атрибуции уже захватывается «на будущее».
Что отвечает на какой вопрос отчёта
Чтобы не утонуть в событиях, держим в голове, какое из них на что отвечает:
| Вопрос | Какое событие смотреть |
|---|---|
| Сколько трафика дошло до сайта? | page_view |
| Какой вариант лендинга держит внимание? | scroll_depth, section_view |
| Какая VSL версия лучше? | video_first_30s, video_complete |
| Какой CTA пуллит лучше? | cta_click по cta_location |
| Где люди отваливаются в форме? | form_start → form_step → form_submit (% перехода) |
| Сколько форм ушло в брак? | form_error |
| Сколько лидов получили? | generate_lead |
| Какие лиды качественные? | generate_lead где lead_qualified=true |
| Сколько купили? | Purchase (CAPI) |
| Какая реклама принесла покупки? | Purchase × utm_campaign × variant_id |
Статус и план
✅ Готово сейчас (Этапы 1–2, 4–5 браузерные)
page_view,section_view,cta_click— работают- Полный цикл формы (
form_view → start → step → submit → success → error) generate_leadна/thank-youс атрибуцией- Атрибуция (UTMs, click-IDs, session_id) собирается на каждом заходе
🟡 Неделя 1 — Доделать Meta Pixel
База уже стоит через GTM (Pixel ID 662311819389495, PageView срабатывает).
Осталось:
- Добавить тег
Meta Pixel — Leadв GTM на триггерevent - form_successсeventID = submission_idдля будущей CAPI-дедупликации - Документировать Pixel ID в
sites-config.json(metaPixel.pixelId) - (Опционально, позже): вынести базовый пиксель из GTM в
Layout.astroчерез@websites/analytics, если решим бороться за production-grade reliability (даёт +5–10% доставки событий, особенно на iOS Safari)
🟡 Неделя 2 — Engagement-события
video_*для VSL (VSL.astro— YouTube IFrame API)whatsapp_clickдля плавающего FABscroll_depth(25/50/75/90%)outbound_clickдля ссылок на IG/YT/wa.me
🟡 Неделя 3 — Server-side (самое важное для ROAS)
- Шлюз принимает Продамус webhook «оплачено»
- Из шлюза идёт Purchase в Meta CAPI с тем же
eventID, что и у Lead - Дублирующий серверный
Lead(CAPI) для покрытия iOS Safari
🟡 Неделя 4 — Путь A (Instagram Lead Ads)
- Прием webhook Meta Lead Ads на шлюзе
- Эхо в CAPI как
Leadс campaign IDs из webhook - Связка с Путём B по номеру телефона («Поток данных»)
🔲 После запуска
form_abandon(когда увидим реальные drop-off точки)- Кастомные размерности GA4 для отчёта по вариантам
- Server-side GA4 Measurement Protocol (если понадобится больше signal)
CTA → cta_location
Каждое событие cta_click несёт cta_location = значение data-cta на
кликнутом элементе. Это же значение появляется как суффикс в обогащённом
form_id (если CTA открыл модалку, в которой произошла конверсия).
Полный список CTA на проекте:
Точки входа (хук на трафик)
cta_location | Где живёт | Триггерит |
|---|---|---|
hero | Hero на /, /vsl, /kg, /kg/vsl | Регистрационную модалку |
guide-hero | Hero на /guide | Lead-magnet модалку |
vsl | Видео-блок на /vsl | Воспроизведение VSL (engagement, не лид) |
Прогрев в середине страницы
cta_location | Где живёт |
|---|---|
section-cta-timeline | Под Timeline-блоком |
section-cta-modules | Под Modules-блоком |
section-cta-winnumbers | Под WinNumbers-блоком |
cta-band-author | Между Author и Proof |
cta-band-problems | Только на /kg (после Problems) |
cta-band-proof | После Proof (большинство воронок) |
cta-band-exclusive | Только на /exclusive страницах |
Близко к покупке
cta_location | Где живёт |
|---|---|
countdown-reserve | Кнопка «Забронировать» в Countdown-виджете |
pricing-offer | Главная кнопка в Pricing-карточке |
cta-band-final | Закрывающий CTABand под FAQ |
Пост-конверсионные (на /thank-you)
cta_location | Что делает |
|---|---|
thankyou-registration-confirm | WhatsApp-подтверждение после регистрации |
thankyou-quicklead-group-confirm | WhatsApp-подтверждение после quick-lead |
thankyou-exclusive-priority | WhatsApp-приоритет для quali Exclusive |
thankyou-exclusive-downsell | Даунселл с Exclusive в Group |
thankyou-leadmagnet-course | Апселл курса после lead-magnet |
thankyou-fallback-whatsapp | Fallback-контакт при ошибке submit |
thankyou-registration-exclusive-upsell | ⛔ Удалён в PR #573 — интерес теперь ловим в исходной форме через exclusive_interest |
Хром сайта
cta_location | Где живёт |
|---|---|
whatsapp-fab | Плавающая WhatsApp-кнопка (на каждой странице) |
fallback-whatsapp | Fallback-кнопка в форме при отсутствии endpoint |
Итого: ~16 уникальных CTA. Все ловятся одним делегированным
listener в src/scripts/page-init.ts — если повесили data-cta на
новый элемент, событие cta_click появится автоматически, отдельной
проводки не нужно.
Связь с другими документами
- Воронка и точки атрибуции — «Поток данных»
- Техническая интеграция (шлюз, amoCRM, Meta CAPI, Продамус) — «Интеграция»
- Critical path сборки — «План действий»
- Definition of Done по трекингу — «Definition of Done» (раздел «Трекинг»)