События виджета и воронка

Как чат-виджет шлёт события в Яндекс.Метрику, VK Pixel, Top@Mail.Ru, GA4, GTM — и как смотреть конверсионную воронку в Framix

События виджета и воронка

Чат-виджет в реальном времени шлёт 24 типа событий — что юзер загрузил, открыл, начал писать, оставил контакт, что-то купил или забронировал. Эти события идут параллельно по трём независимым каналам:

  1. window.dispatchEvent + dataLayer — для GTM, Roistat, amoCRM, любого внешнего listener'а на хост-сайте.
  2. Прямые вызовы счётчиков — Яндекс.Метрика (ym('reachGoal')), VK Pixel (VK.Goal), Top@Mail.Ru (_tmr.push), Google Analytics 4 (gtag('event')).
  3. POST в БД Framix — батчем на /api/agents/public/event, питает встроенную воронку.

Каждый канал отключается отдельно в настройках агента. PII (email, phone, имена) в metadata событий не уходит — только тип контакта и анонимные счётчики.

Воронка внутри Framix (без сторонней аналитики)

Открой «ИИ-агенты» → выбранный агент → вкладка «Аналитика». Это собственная воронка Framix, не зависящая от Метрики:

ЭтапЧто считаем
Загрузкисколько раз виджет загрузился на странице (каждое открытие страницы = +1)
Открытияуникальные посетители, кликнувшие по виджету (по visitorId в localStorage)
Первое сообщениеуникальные посетители, дошедшие до первой отправки
Лидыуникальные сессии, в которых бот распарсил email/phone и создал карточку клиента
Брони(если у агента подключены услуги) уникальные сессии с созданной записью

Между этапами показывается conversion %. Сразу видно, где «теряются» — посетители увидели виджет, но не открыли? Открыли, но не написали? Написали, но не оставили контакт?

Дополнительно на той же вкладке:

  • Дневной график — area-chart по 4 ключевым событиям за период (7/30/90 дней).
  • Топ-10 страниц — где виджет получает больше всего показов / открытий.
  • Настройки счётчиков — поля для Metrika / VK / Mail.ru / GA4 ID + три тоггла каналов аналитики.

Полный список событий

Имя цели в Метрике и GA4 = framix_ + тип события. Например, framix_widget_opened, framix_lead_captured. В VK Pixel несколько ключевых событий маппятся на стандартные lead / initiate_checkout / complete_registration (см. ниже).

Жизненный цикл виджета

СобытиеКогда срабатывает
widget_loadedвиджет инициализировался на странице (показалась плашка-bubble)
widget_openedюзер кликнул, чат развернулся
widget_closedюзер свернул чат
chat_resetюзер очистил историю переписки
consent_acceptedпринято согласие на обработку ПД (если экран consent включён)

Диалог

СобытиеКогда срабатывает
message_sentюзер отправил сообщение (любое, включая первое)
first_message_sentпервое сообщение в этой сессии — реальный engagement
message_receivedбот ответил
quick_reply_clickedклик по quick-reply пилюле под ответом бота
conversation_starter_clickedклик по стартеру разговора (готовый вопрос на пустом чате)
pre_chat_form_submittedюзер заполнил pre-chat форму контакта (если включена)
feedback_givenпоставил лайк или дизлайк сообщению бота
file_uploadedприкрепил файл к сообщению

Workflow (form-filler / quiz)

СобытиеКогда срабатывает
workflow_startedстартанул workflow (опросник / квиз)
workflow_completedдошёл до конца workflow, ответы зафиксированы

Конверсии (главные)

СобытиеКогда срабатываетVK goal
lead_capturedбот распарсил email или phone из сообщения юзера → создалась карточка лидаlead
product_buy_clickedюзер нажал кнопку «Оплатить» в карусели товаровinitiate_checkout
booking_createdсоздана запись на услугуcomplete_registration

Коммерция (товары)

СобытиеКогда срабатывает
products_shownбот вывел карусель карточек товаров
product_added_to_cartюзер добавил товар в корзину
product_buy_clickedюзер нажал «Купить / Оплатить» (см. выше)

Услуги и брони

СобытиеКогда срабатывает
services_shownбот показал список услуг
service_pickedюзер выбрал услугу
slots_shownбот показал доступные слоты
slot_pickedюзер выбрал конкретный слот
booking_createdбронь создана (см. выше)

Настройка счётчиков

В «ИИ-агенты» → агент → вкладка «Аналитика» есть блок «Подключение счётчиков»:

  • Yandex Metrika ID — номер счётчика (например 12345678). Виджет начнёт звать ym(id, 'reachGoal', 'framix_<type>').
  • VK Pixel ID — id пикселя VK Ads.
  • Top@Mail.Ru Counter ID — id счётчика top.mail.ru.
  • Google Analytics 4 ID — Measurement ID (G-XXXXXXXXXX).

И три тоггла каналов:

  • emit_window_events — слать ли CustomEvent + dataLayer.push на хост-сайт (для GTM/Roistat/amoCRM). По умолчанию включено.
  • analytics_enabled — писать ли события в БД Framix (воронка внутри Framix). По умолчанию включено.
  • Конкретный counter ID — если поле пустое, в этот счётчик ничего не уходит.

Виджет сам не подгружает скрипт Метрики / VK / GA — он только дёргает уже установленные на хост-сайте счётчики. Это правильная архитектура: счётчики настраиваешь у себя, виджет шлёт цели.

Как настроить цели в Яндекс.Метрике

В Метрике события reachGoal('framix_xxx') приходят, но в отчёте «Цели» не показываются, пока ты сам не создашь цель с этим именем. Это особенность Метрики (тип «JavaScript-событие» нужно завести вручную).

Пошагово:

  1. В Метрике: Настройки счётчика → Цели → Добавить цель.
  2. Тип: «JavaScript-событие».
  3. Идентификатор цели: framix_<type> (точное имя из таблиц выше). Например: framix_lead_captured.
  4. Сохрани.

Рекомендую завести 4-5 целей, а не все 24 — иначе будет каша. Минимальный набор для воронки:

  • framix_widget_opened — юзер заинтересовался
  • framix_first_message_sent — engaged
  • framix_lead_captured — главная цель (лид) ⭐
  • framix_booking_created — для агентов с услугами ⭐
  • framix_product_buy_clicked — для commerce-агентов ⭐

После этого в отчёте «Конверсии» появятся графики и можно строить сегменты, ретаргетинг VK Ads и т.д.

Интеграция через GTM / dataLayer

Виджет автоматически пушит каждое событие в window.dataLayer:

window.dataLayer.push({
  event: 'framix_agent_widget_opened',
  framix_agent_id: '40bab4c5-...',
  framix_session_id: 'sess_abc' || null,
  framix_metadata: { vid: 'v_xxx', ...payload }
})

В GTM-триггере выбери тип «Custom Event», название события framix_agent_lead_captured — и привязывай к нему любую цель (отправка в GA4, Facebook Pixel, ROI-калькулятор).

Прослушивание через CustomEvent (без dataLayer)

Любой скрипт на хост-сайте может слушать события напрямую:

window.addEventListener('framix:agent:lead_captured', (e) => {
  console.log('Новый лид!', e.detail)
  // e.detail = { agentId, sessionId, type, metadata, ts }
})

Удобно для интеграции с собственной CRM, Roistat'ом, кастомным трекингом.

Как проверить, что события доходят

В DevTools Console на странице с виджетом:

// Слушаем все события виджета
['widget_loaded', 'widget_opened', 'first_message_sent', 'lead_captured', 'booking_created']
  .forEach(t => window.addEventListener(`framix:agent:${t}`, e => console.log('🔔', t, e.detail)))

Открой виджет, отправь сообщение — в консоль прилетят логи. Если прилетают, но в Метрике пусто — значит не создана цель в Метрике (см. выше).

В Network-табе: должен идти POST на /api/agents/public/event с массивом events каждые ~3 секунды (debounce) или при уходе со страницы (через navigator.sendBeacon). Лиды/брони/первое сообщение флашатся немедленно, не ждут debounce.

Метаданные событий

В каждом событии в metadata приходят дополнительные поля (зависят от типа):

  • vid — стабильный анонимный visitorId, общий для всех событий одного браузера × агент.
  • Для message_sent / first_message_sentlength (символов), hasAttachments.
  • Для product_added_to_cart / product_buy_clickedproductId, productSlug, price.
  • Для booking_createdserviceId, slotStartAt, bookingId.
  • Для lead_capturedcontactKind (email / phone), без самой строки контакта.
  • Для feedback_givenmessageId, rating (1 или -1).
  • Для quick_reply_clicked / conversation_starter_clickedsuggestion (текст пилюли).
  • Для slot_picked / service_pickedserviceId, slotStartAt или serviceSlug.

PII (полные email, phone, имена) не шлются ни в один из каналов — это сознательное решение для соответствия 152-ФЗ и GDPR.

Где смотреть данные

ИсточникЧто видно
Framix → Аналитика агентаворонка 4-5 этапов, дневной chart, топ страниц, всё в реальном времени
Яндекс.Метрика → Целиконверсии по созданным framix_* целям, сегменты, ретаргет
Яндекс.Метрика → Карта целейвсё, что пришло как reachGoal, даже без созданной цели (в reports → JS-события)
GA4 → Engagement → Eventsвсе framix_* события автоматически, без настройки целей
VK Ads → Аудиториипиксельные события lead / initiate_checkout для оптимизации кампаний
GTM → Preview ModedataLayer-события для проверки/отладки триггеров

Серверные события vs клиентские

Большинство событий шлёт клиент (виджет в браузере посетителя). Но lead_captured — особенный: его пишет сервер в момент, когда maybeCaptureLead разбирает сообщение юзера regex'ом по email/phone. Это сделано специально:

  • виджет не знает, был ли в сообщении валидный email/phone до того, как сервер его проверит;
  • лиды из Telegram и VK тоже попадают в воронку, хотя там виджета с JS вообще нет.

В Метрике / dataLayer / GTM lead_captured появится только если на хост-сайте загружен соответствующий счётчик и виджет ещё открыт в момент серверного эвента. Для Telegram/VK событие пишется только в БД Framix (воронку внутри платформы это не ломает).

Приватность

Все события — анонимны. visitorId (vid) — random UUID в localStorage браузера, не привязан к личности. Удаляется юзером очисткой кэша. PII (email/phone) в metadata не передаётся даже в lead_captured — только contactKind. Если интегрируешь с собственной CRM через framix:agent:* events — учти это в политике конфиденциальности своего сайта.