Ad ops и инфраструктура рекламы
27 subscribers
4 photos
2 links
Пиксели, серверная аналитика, postback
Download Telegram
Серверный трекинг не «возвращает» данные. Он перераспределяет ответственность

Раз в пару месяцев приходит запрос с одной и той же формулировкой: «давайте переедем на server-side и вернём потерянные конверсии». За этим стоит красивая, но ложная модель мира — будто данные где-то лежат, а браузер их просто «не отдаёт». Нет. Если пользователь не дал согласие или заблокировал сбор, серверный контур не материализует событие из воздуха. Он лишь меняет точку, где вы это событие собираете и кому доверяете его атрибуцию.

Что server-side реально даёт — это контроль. Вы перестаёте зависеть от того, доедет ли клиентский запрос до десяти разных эндпоинтов через адблок, ITP и обрезанные сторонние куки. Один доверенный канал: браузер шлёт событие на ваш домен, ваш сервер обогащает его и рассылает дальше — в аналитику, в рекламные кабинеты через Conversions API, в postback партнёрам. Дедупликация по event_id, единый идентификатор, ваши правила валидации.

Наблюдение из практики: при переезде на гибридную схему (клиент + сервер с дедупом) у нас «прибавилось» около 12% конверсий в кабинете. Но это не воскрешённые данные — это конверсии, которые клиентский пиксель терял по дороге, а сервер довёз. Потолок ровно там, где заканчивается ваше согласие на сбор. Выше него server-side не прыгает.

Поэтому правильный вопрос не «сколько вернём», а **«какую долю событий мы реально контролируем и можем подтвердить»**. Server-side — это про надёжность и воспроизводимость доставки, а не про магический прирост. Кто продаёт его как способ обойти потерю согласия — продаёт вам будущий разбор с юристами, а не аналитику.

@AdOpsRoom

Соседняя редакция @AttributionRoom недавно писала об этом под другим углом
Когда 30% конверсий «испарились»: как server-side трекинг вернул атрибуцию

**Контекст.** После перехода Safari на ITP и выката iOS 14.5 с ATT крупные ритейл-бренды столкнулись с одинаковым симптомом: браузерные пиксели Meta и аналитика начали недосчитывать конверсии. Клиентский `_fbp`-cookie жил 7 дней вместо двух лет, часть событий резалась блокировщиками, а на iOS отвал доходил до четверти-трети покупок. Картина по сетке RU-брендов (Lamoda, Ozon, Aviasales и др.) была схожей — медиабаинг оптимизировался на «слепых» данных.

**Задача.** Вернуть полноту событий, не нарушая приватность и не ломая скорость загрузки. Браузерный пиксель оставлять единственным источником было нельзя: он зависит от того, что переживёт ad-blocker и куки-политику.

**Решение.** Связка из трёх слоёв:
— Server-Side GTM в собственном облаке вместо клиентского контейнера. Тег грузится с first-party домена (`gtm.brand.ru`), а не с googletagmanager.com — меньше режется.
— Conversions API: ключевые события (Purchase, AddToCart, Lead) дублируются с бэкенда напрямую в Meta, минуя браузер.
— Дедупликация по `event_id` — один и тот же заказ приходит и от пикселя, и от сервера, платформа склеивает их по общему идентификатору, чтобы не задвоить.

Critical деталь — передача хешированных идентификаторов (email, телефон в SHA-256) для Advanced Matching: это и поднимает match rate, и остаётся в рамках приватности.

**Результат.** Публичные кейсы по интеграции CAPI дают стабильный диапазон: возврат 10–30% «потерянных» событий, рост match rate с ~40–50% до 70%+, и как следствие — снижение CPA на 8–20% за счёт того, что алгоритм снова видит реальные конверсии. Server-side контейнер дополнительно убирает 3–5 сторонних скриптов из браузера — выигрыш в LCP.

**Урок.** Пиксель в браузере — это уже не источник правды, а один из сигналов. Атрибуция, которая живёт только на клиенте, обречена деградировать с каждым обновлением приватности. Сервер как точка сбора событий — не «фишка для продвинутых», а базовая гигиена: тот, кто держит дедупликацию и CAPI, просто видит больше при том же бюджете.

@AdOpsRoom
Дедупликация событий между браузерным пикселем и серверным CAPI: настройка за один вечер

Когда вы шлёте одно и то же событие и пикселем, и с сервера, платформа считает его дважды. Конверсии задваиваются, ROAS врёт, оптимизация учится на мусоре. Лечится сквозным `event_id`. Что сделать на этой неделе:

— Сгенерируйте `event_id` на бэкенде в момент действия пользователя (UUID v4 на заказ/лид). Не на клиенте — клиент потеряете при блокировке скриптов.

— Прокиньте этот id на фронт вместе со страницей подтверждения. Браузерный пиксель шлёт событие с `eventID`, передавая ровно ту же строку.

— Сервер шлёт то же событие через Conversions API с полем `event_id` (snake_case — у Meta поля в API и в пикселе называются по-разному, это типовая ошибка).

— Совпасть должны три вещи: `event_id`, `event_name` и попадание в окно дедупликации (у Meta — 48 часов). Разное имя события (`Purchase` против `purchase`) ломает склейку.

— Проверьте в Events Manager → Test Events: у пары должен стоять флаг *Deduplicated*. Если его нет — сверьте регистр имени и формат id побайтово.

Контрольная точка: в Events Manager доля дедуплицированных событий по `Purchase` за сутки должна быть около 90–100%. Всё что ниже 80% — у вас часть трафика без серверного id, ищите где обрывается проброс.

Серверный канал не замена пикселю, а страховка от блокировок. Дедупликация — то, что превращает два источника в один чистый сигнал.

@AdOpsRoom
Почему пиксель почти всегда проигрывает серверной аналитике

Я всё чаще вижу одну и ту же картину: маркетинг уверенно смотрит в отчёт рекламной платформы, а CRM и BI живут в другой реальности. И дело не в «плохой настройке» как универсальном объяснении. Дело в том, что пиксель — это клиентский сигнал, а клиентский сигнал сегодня системно шумит: блокировщики, ограничения браузеров, отказ от cookies, потеря событий при смене домена, дубли на повторных загрузках.

Моё мнение простое: пиксель нужно оставить как слой для оптимизации и быстрых проверок, но не делать его источником истины. Источник истины в performance — это связка first-party данных, server-side событий и нормального постбэка/идентификатора лида. Иначе вы оптимизируете не спрос, а поведение трекера.

У меня был кейс, где по пикселю конверсия выглядела на 18–22% выше, чем в server-to-server цепочке. На уровне отчёта это выглядело как «канал стал лучше», а на уровне воронки выяснилось другое: часть заявок терялась на клиенте, часть дублировалась, а часть доходила без корректного attribution key. После перевода ключевых событий на сервер мы не «потеряли эффективность» — мы просто перестали подменять результат красивой метрикой.

Что я считаю рабочей архитектурой:
— пиксель — для вспомогательной оптимизации и ретаргетинга;
— серверные события — для primary conversion и качества данных;
— postback — для связки источника с лидом и последующей доходностью;
— единый event schema — чтобы Purchase, Lead, Qualified Lead не жили как три разных вселенные.

Главная ошибка команд — пытаться «докрутить» пиксель до роли бухгалтерии. Он для этого не создан. Если у вас платный трафик, то точность атрибуции — это не роскошь, а способ не переплатить за иллюзию эффективности.

@AdOpsRoom
Как бренд сократил потери атрибуции: кейс с server-side аналитикой на e-commerce

В классическом web-стеке пиксель — это «неплохой» источник данных, пока браузер не начинает резать cookies, блокировать скрипты и ломать цепочки сессий. В одном из публично обсуждаемых кейсов крупного e-commerce-бренда команда увидела, что в отчетах Meta и GA4 расходятся цифры по конверсиям: разница доходила до 18–25% в пользу CRM и backend-учета.

Контекст был простой: платный трафик рос, доля mobile Safari увеличивалась, а часть событий терялась на этапе client-side. На уровне маркетинга это выглядело как «плохая реклама», но инженерный разбор показал другое: не хватало наблюдаемости.

Задача была не «добавить еще один пиксель», а восстановить измеримость цепочки:
— передавать события из backend;
— уменьшить зависимость от браузерных ограничений;
— связать лид/заказ/оплату в единую схему;
— сохранить сопоставимость с рекламными кабинетами.

Решение собрали в два слоя. Первый — server-side трекинг через отдельный endpoint, куда уходили `event_id`, `user_id_hash`, `utm`, `client_id` и статус заказа. Второй — postback на ключевые стадии воронки: не только purchase, но и подтвержденный заказ, отмена, возврат. Так команда перестала оптимизироваться по «шумным» кликам и начала смотреть на события, которые действительно влияют на выручку.

Что изменилось в цифрах:
— доля «потерянных» конверсий в отчетности упала с ~22% до 6–8%;
— матчинг событий между CRM и рекламными системами вырос на 30+%;
— CPL по отдельным кампаниям перестал «прыгать» из-за дыр в атрибуции;
— доля решений, принимаемых по backend-данным, выросла: маркетинг начал отключать неэффективные связки раньше, а не через 2–3 недели.

**Ключевой эффект** был не только в росте точности, а в смене модели управления трафиком. Когда источник правды — не пиксель в браузере, а серверный контур, можно сравнивать каналы по одинаковым правилам.

Урок здесь прямой: если у вас performance и есть хотя бы заметный mobile-трафик, client-side аналитика уже не является достаточной базой. Server-side + postback — это не «тюнинг», а способ вернуть управляемость в воронку и не переплачивать за слепые зоны.

@AdOpsRoom

Глубже разбирают этот метод в @PerfNewsDigest
Настройка Server-to-Server (S2S) передачи данных для повышения качества атрибуции

В условиях деградации Third-party cookies стандартные клиентские пиксели теряют до 30% событий из-за блокировщиков рекламы и ограничений ITP. Переход на S2S-интеграцию (Conversion API) позволяет отправлять данные напрямую с вашего сервера в рекламную систему.

Алгоритм внедрения S2S-трекинга:

— Генерация уникального event_id. На стороне вашего бэкенда при каждом целевом действии (например, оформление заказа) генерируйте уникальный идентификатор события. Этот же ID должен передаваться в пиксель на стороне клиента (браузера). Он станет ключом дедупликации: рекламная платформа сопоставит запрос из браузера и запрос с сервера, отбросив дубли.

— Сбор параметров пользователя. Для успешного матчинга (Matching Quality) сервер должен передавать не только данные о событии, но и хешированные идентификаторы пользователя: email, phone, IP-адрес и User-Agent. Используйте алгоритм SHA-256 для хеширования строк перед отправкой.

— Формирование payload. Подготовьте JSON-структуру согласно документации API конкретной площадки (Facebook CAPI, Google Enhanced Conversions или VK Pixel API). Убедитесь, что временная метка (timestamp) соответствует моменту совершения действия, а не моменту отправки запроса.

— Реализация API-запроса. Используйте POST-запрос с сервера на эндпоинт рекламной платформы. Рекомендуется ставить отправку в очередь (через Redis или RabbitMQ), чтобы задержка при выполнении запроса к API площадки не влияла на скорость ответа вашего сайта пользователю.

— Валидация через Test Event Code. В интерфейсе рекламного кабинета активируйте режим отладки (Test Event Code). Отправьте тестовый запрос с сервера и проверьте статус обработки в логах площадки. Система должна показать статус «Processed» и подтвердить получение event_id.

*Критический момент:* при настройке дедупликации следите, чтобы параметр event_id в браузере и на сервере был идентичен до последнего символа. Разница даже в один пробел приведет к тому, что площадка засчитает оба события как уникальные, что исказит статистику в 2 раза.

@AdOpsRoom