События виджета и воронка
Как чат-виджет шлёт события в Яндекс.Метрику, VK Pixel, Top@Mail.Ru, GA4, GTM — и как смотреть конверсионную воронку в Framix
События виджета и воронка
Чат-виджет в реальном времени шлёт 24 типа событий — что юзер загрузил, открыл, начал писать, оставил контакт, что-то купил или забронировал. Эти события идут параллельно по трём независимым каналам:
window.dispatchEvent+dataLayer— для GTM, Roistat, amoCRM, любого внешнего listener'а на хост-сайте.- Прямые вызовы счётчиков — Яндекс.Метрика (
ym('reachGoal')), VK Pixel (VK.Goal), Top@Mail.Ru (_tmr.push), Google Analytics 4 (gtag('event')). - 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-событие» нужно завести вручную).
Пошагово:
- В Метрике: Настройки счётчика → Цели → Добавить цель.
- Тип: «JavaScript-событие».
- Идентификатор цели:
framix_<type>(точное имя из таблиц выше). Например:framix_lead_captured. - Сохрани.
Рекомендую завести 4-5 целей, а не все 24 — иначе будет каша. Минимальный набор для воронки:
framix_widget_opened— юзер заинтересовалсяframix_first_message_sent— engagedframix_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_sent—length(символов),hasAttachments. - Для
product_added_to_cart/product_buy_clicked—productId,productSlug,price. - Для
booking_created—serviceId,slotStartAt,bookingId. - Для
lead_captured—contactKind(email/phone), без самой строки контакта. - Для
feedback_given—messageId,rating(1или-1). - Для
quick_reply_clicked/conversation_starter_clicked—suggestion(текст пилюли). - Для
slot_picked/service_picked—serviceId,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 Mode | dataLayer-события для проверки/отладки триггеров |
Серверные события 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 — учти это в политике конфиденциальности своего сайта.