Сервера, которые “путают” воронку: как я лечу разъехавшиеся события в first-party аналитике
Когда мы переходим с клиентских пикселей (или смешанной схемы) на server-side аналитика, самая частая боль звучит одинаково: «воронка стала хуже». При этом заказов не меньше, а в отчётах конверсия просела — иногда на десятки процентов. На практике причина почти всегда не в маркетинге, а в том, что события начали “жить” в разных мирах: разные таймлайны, разные ключи пользователя, разные правила дедупликации.
Моё рабочее правило: если воронка “сломалась” сразу после внедрения server-side, я не трогаю кампании и бюджеты. Я сначала проверяю, как именно собираются и сшиваются события на сервере.
1) Самая частая ошибка — двойные события с разными “верситетами”
На клиенте событие могло отправляться с одного источника, а в server-side вы добавили ещё один маршрут (например, ретрай, параллельные трекеры, расширение из тег-менеджера + прямой event API). В результате одно и то же действие попадает в систему дважды, но с разными параметрами: один раз — с user_id, второй — только с client_id.
Я обычно начинаю с простого теста: беру событие “Sign Up” (или “Add to Cart”) и строю частоту по связке ключей:
— client_id + session_id
— user_id + session_id
— только user_id
Дальше сравниваю распределение во времени (до/после) и смотрю, где появился второй “хвост”. Если второй хвост есть — это не “органика ухудшилась”, а схема матчинга ключей стала несовместимой.
2) Тайм-ауты и очереди: события не исчезают, но меняют порядок
В server-side часто добавляют буферизацию, повторные отправки (retry) и очереди для устойчивости. Это улучшает надёжность доставки, но создаёт новый класс артефактов: событие “purchase” может прийти раньше “view_product”, потому что оно отправляется позже по пользовательскому пути, но раньше доезжает до сервера (или наоборот).
Мой приём: я храню для каждого события два времени:
— event_time (время действия в браузере/приложении)
— received_time (время прихода на сервер)
И дальше строю проверку монотонности: для одной сессии “view → add → purchase” разница event_time должна соответствовать ожидаемому порядку чаще, чем сейчас. Если монотонность упала — проблема в транспортной логике, а не в воронке.
Наблюдение из практики: при первой попытке server-side иногда получается, что 3–7% purchase-событий оказываются “раньше” своих предшественников по event_time (из‑за несогласованного часового пояса/смещения или сериализации). Это не звучит страшно, но для расчётов конверсии в “строгих” последовательностях даёт заметный эффект.
3) Дедупликация должна быть не “по событию”, а по смыслу
“Дедуплицируем по event_name + timestamp” — плохая стратегия. Timestamp часто округляется, имеет дрожание из-за сетевых задержек, а один и тот же timestamp может встречаться в разных сценах.
Я перехожу на дедупликацию по детерминированному fingerprint (отпечатку) события:
— user_key (user_id или client_id, что доступно)
— event_type
— source (внутренний роутинг/канал)
— параметр-идентификатор (например, order_id, transaction_id, item_id+quantity+price или request_id)
И делаю окно допустимой повторяемости (например, 10–30 минут) по received_time. Тогда ретраи не ломают аналитику, а реальные повторные действия остаются.
4) Контракт события важнее “магии тегов”
В 2026 году выигрывает тот, кто мыслит как инженер: фиксирует схему данных, контракты и инварианты. В first-party аналитике нельзя жить “как получится”: если вы меняете параметры события, меняется семантика. Если вы меняете ключи атрибуции — меняется всё.
Поэтому я ввожу минимальный “контроль качества” на стороне сервера:
— обязательные поля (user_key, session_key, event_id / request_id)
— допустимые типы/форматы
— проверка полноты (процент событий без ключей)
— алерты на скачки долей “пустых” user_id и на рост событий без идентификаторов
…
Server-side tracking
@ServerSideTrackingRuPro
Сервера, которые “путают” воронку: как я лечу разъехавшиеся события в first-party аналитике
Этот пост опубликован в Telegram-канале Server-side tracking. Подписаться можно по ссылке: @ServerSideTrackingRuPro.