Введение
Руководство пользователя
Использование Панели управления
Туториалы
Получение данных из других сервисов
Построение истории отдельного пользователя
Классические модели атрибуции
Вероятностное прохождение воронки
Атрибуция по индексу активности
Воронки
X
Выберите раздел

Автоматические события Web-SDK

Все события уходят в сервис track и имеют общую структуру. Ниже описано только поле data каждого события и условия, при которых оно возникает.

СобытиеИсточникВключается
sessionстарт или перезапуск сессиивсегда
pagerstat4('page')вызовом
page_loadedwindow.loadвсегда
page_unloadbeforeunloadbrowserEvents.unloadHandlers
page_visibilityvisibilitychangebrowserEvents.visibilityHandlers
activityсчётчик DOM-событий, раз в flushIntervaltrackActivity
scrollпрокрутка остановиласьtrackActivity.scrollEvents
link_clickклик по ссылкеtrackClicks
element_clickклик по любому элементуtrackClicks.allClicks
form_submitотправка формыtrackForms
field_focus, field_blur, field_change, field_invalidсобытия полейtrackForms
user_paramsсинхронизация с GA4 и Яндекс Метрикойвсегда
rec_start, rec_batchзапись сессииtrackRecord или rstat4('record')

Сессия

Отправляется вместо события, которое инициировало старт сессии, а оно уходит следом. data пустой, вся информация в блоке sess. Подробнее в разделе Сессии.

{
  "name": "session",
  "data": {},
  "sess": {
    "pageNum": 0, "eventNum": 0, "num": 1,
    "type": "organic", "engine": "google", "refhost": "google.com",
    "marks": {}, "hasMarks": false, "start": 1757960000000
  }
}

Просмотр страницы

Библиотека не отправляет page сама, его вызывает сайт. В data попадает всё, что передано в вызов. К событию добавляется блок perf с таймингами загрузки.

{
  "name": "page",
  "data": { "type": "category", "id": "2342344", "name": "Товары для дома" },
  "perf": { "cs": 0, "ce": 0, "scs": -1, "rqs": 211, "rss": 1549, "rse": 1560, "dl": 1581, "di": 1812, "dc": -1 }
}

Страница загружена

Уходит по window.load, data пустой, блок perf заполнен уже полностью.

{ "name": "page_loaded", "data": {}, "perf": { "...": "..." } }

Выгрузка страницы

Уходит по beforeunload при переходе на другую страницу или закрытии вкладки, data пустой. Доставка через sendBeacon, поэтому событие успевает уйти.

{ "name": "page_unload", "data": {} }

Видимость вкладки

Уходит по visibilitychange: пользователь переключил вкладку, свернул браузер или вернулся.

{
  "name": "page_visibility",
  "data": {
    "hidden": 1,          // 1 — вкладка скрыта, 0 — видима
    "state": "hidden",    // document.visibilityState
    "dur": 48213          // сколько мс держалось предыдущее состояние
  }
}

Активность

Счётчик DOM-событий накапливает статистику и раз в flushInterval секунд (по умолчанию 5) отправляет её на сервер. Если за период действий не было, событие не уходит, но номер итерации растёт. С zeroEvents: true отправляются и пустые периоды.

{
  "name": "activity",
  "data": {
    "interval": 5,     // период, секунд
    "iteration": 65,   // номер периода с момента загрузки страницы
    "active": 4,       // номер периода с активностью
    "mousemove": 62,
    "mousedown": 2,
    "mouseup": 2,
    "click": 2,
    "wheel": 23,
    "scroll": 22,
    "keydown": 5,
    "touchstart": 1
  }
}

Считаются события: touchmove, touchstart, touchleave, touchenter, touchend, touchcancel, click, mouseup, mousedown, mousemove, mousewheel, wheel, scroll, keypress, keydown, keyup, resize, focus, blur. В data попадают только те, что произошли за период. Описание событий есть на developer.mozilla.org.

Прокрутка

Уходит, когда прокрутка остановилась. data пустой, позиция в блоке scroll, который добавляется и ко всем остальным пользовательским событиям.

{ "name": "scroll", "data": {}, "scroll": { "dh": 1148, "ch": 326, "to": 479, "cs": 100, "ms": 100 } }

Клик по ссылке

Ищется ближайший <a> вверх от элемента, на который пришёлся клик. outbound — ссылка ведёт на другой хост. Элементы с классом trackClicks.ignoreClass (по умолчанию rst-ignore) не отслеживаются.

{
  "name": "link_click",
  "data": {
    "target": {
      "tag": "span",              // тег самого глубокого элемента под курсором
      "type": "",
      "name": "",
      "ph": "",                   // placeholder
      "cls": "menu-item",         // class
      "id": "",
      "href": "",
      "text": "Меню"
    },
    "href": "https://www.example.com/catalog/#menu",
    "text": "Текст ссылки",
    "outbound": false
  }
}

Клик по любому элементу

Только при trackClicks: { allClicks: true }. Клики по ссылкам по-прежнему уходят как link_click, element_click для них не отправляется.

{
  "name": "element_click",
  "data": {
    "target": {
      "tag": "input",
      "type": "text",
      "name": "city",
      "ph": "Введите город прибытия",
      "cls": "SearchWidget-input -to",
      "id": "",
      "href": "",
      "text": ""
    }
  }
}

Поля формы

Четыре события с одинаковым набором параметров:

  • field_focus — каретка поставлена в поле;
  • field_change — значение поля изменилось;
  • field_blur — каретка покинула поле;
  • field_invalid — поле не прошло браузерную валидацию при отправке формы.

Параметры с префиксом e описывают поле, с префиксом f — форму, в которой оно находится.

{
  "name": "field_change",
  "data": {
    "event": "change",            // DOM-событие
    "etag": "input",              // тег элемента
    "etype": "text",              // атрибут type
    "ename": "delivery_address",  // атрибут name
    "eph": "",                    // placeholder
    "ecl": "form-field",          // class
    "eid": "",                    // id
    "evalue": "",                 // значение, см. ниже
    "fmthd": "post",              // метод формы
    "fact": "/checkout/purchase", // action формы
    "fname": "order-form",        // name формы
    "fcls": "",                   // class формы
    "fid": "order-form"           // id формы
  }
}

Если поле не внутри формы, вместо f* приходит "ferr": "Form element absent".

Значения полей

По умолчанию значения не отправляются, evalue пустой. Варианты:

  • trackForms: { trackValues: true } — значение уходит открытым текстом в evalue;
  • trackForms: { encryptionKey: '...' } — значение шифруется в браузере публичным RSA-ключом (WebCrypto RSA-OAEP) и уходит в evalue с eenc: 1. Если шифрование недоступно, значение отбрасывается и приходит eenc: 0.

События полей — одни из самых полезных для поиска проблем в формах: по цепочке field_focus → field_change → field_invalid видно, где посетитель застрял.

Отправка формы

{
  "name": "form_submit",
  "data": {
    "event": "submit",
    "fmthd": "post",
    "fact": "/cart",
    "fname": "cart",
    "fcls": "cart-submit",
    "fid": "cart-submit"
  }
}

Синхронизация идентификаторов

Если на странице есть GA4 или Яндекс Метрика, SDK получает их client id и отправляет внутреннее событие user_params. Идентификаторы сохраняются в хранилище и далее приходят в блоке user каждого сообщения как ga4ClientId и ymId.

{ "name": "user_params", "data": { "ga4ClientId": "2039255293.1537236640", "ymId": "1537242943246737376" } }

Запись сессии

При старте записи уходит rec_start, затем буфер rrweb отправляется батчами rec_batch.

{ "name": "rec_start", "data": { "packed": 1, "masked": 1 } }
{ "name": "rec_batch", "data": { "seq": 3, "part": 1, "of": 2, "p": 1, "d": "[{\"type\":3,..." } }

d — фрагмент JSON-массива упакованных событий rrweb. Массив сериализуется целиком и режется на части по maxBatchBytes символов. Сервер склеивает d по ключу (uid, lib.st, seq) в порядке part (of — число частей), разбирает JSON и распаковывает каждое событие (p: 1 — fflate, p: 0 — сырой JSON).

Запись сессии и identify не создают событий с scroll; остальные события пользователя получают блок scroll с текущей позицией страницы.