Все статьи
12 мин чтения

Pixel против Conversions API против S2S Postback: что использовать

Несколько пучков сигнальных проводов сходятся со всех направлений в одну малиновую искру у вышки связи

Одна и та же кампания, один и тот же день — три разных итога. Ads Manager показывает 26 покупок. Лог событий CAPI в Events Manager показывает 41. Таблица постбеков в CRM — которая наполняется напрямую из подтверждения депозита от адвертайзера — показывает 58. Никто не задублировал таблицу и никто не врёт: каждая цифра — честный подсчёт того, что конкретно мог увидеть этот слой трекинга. Байер, который воспринимает это как «один сломанный пиксель», потратит неделю на дебаг JS-скрипта, который никогда не был настоящей проблемой. Реальная проблема — стек из трёх разных слоёв измерения без единого идентификатора, который бы их связывал, и без чёткого ответа на вопрос, под какой из них на самом деле оптимизируется алгоритм Facebook.

Почему браузерный сигнал продолжает сокращаться

Классический Facebook Pixel — это скрипт, который срабатывает в браузере при загрузке страницы или клике по кнопке. Он держится на трёх хрупких допущениях одновременно: скрипт должен загрузиться без блокировок, кука должна прожить достаточно долго, чтобы нести идентификацию, а вкладка должна оставаться открытой, пока запрос действительно не уйдёт с устройства. Ни на одно из этих трёх допущений больше нельзя полагаться.

Intelligent Tracking Prevention в Safari ограничивает срок жизни кук, установленных скриптом, — в некоторых конфигурациях вплоть до одного дня. Enhanced Tracking Protection в Firefox прямо блокирует известные трекинговые домены и разделяет хранилище по сайтам. Адблокеры срезают запрос пикселя ещё до того, как он доберётся до Facebook, — какая доля трафика это затрагивает, зависит от ГЕО и вертикали, но она никогда не равна нулю (подробнее о механике — в материале почему трекинг на куках умирает). Добавьте сюда юзеров, которые закрывают вкладку посреди чекаута, или кликают с телефона, а конвертятся потом с ноутбука, — и сетап только на пикселе показывает всё уменьшающуюся, и при этом неслучайную, часть реальной картины. Именно неслучайность здесь и болит: юзеры, которые с наибольшей вероятностью блокируют трекеры или сидят в защищённом браузере, распределены по вашим крео и ГЕО неравномерно, так что разрыв — это не просто потеря объёма, это смещение выборки (bias). Алгоритм Facebook оптимизируется под тот сигнал, который пережил этот фильтр, — аккаунт, работающий только на пикселе, тренируется на всё менее репрезентативной выборке собственных же победителей.

Conversions API: как восстановить сигнал и сматчить идентичность

Conversions API отправляет то же самое событие — лид, покупку, регистрацию — напрямую с вашего сервера в Facebook, минуя браузер и всё, что может пойти не так внутри него. Здесь нет зависимости от кук, нет вмешательства адблокеров и нет необходимости, чтобы вкладка продержалась достаточно долго для срабатывания скрипта.

Главное, что даёт CAPI, — это лучшее распознавание идентичности, а не просто более надёжный канал доставки. Матчинг-движок Facebook работает двумя способами. Детерминированный матчинг сшивает событие с кликом по рекламе с помощью идентификатора, прошедшего весь путь через вашу воронку, — browser ID, зафиксированный в момент клика, либо собственный external ID, переданный через цепочку редиректов. Это сильный матч: высокая уверенность, без каких-либо догадок. Вероятностный (probabilistic) матчинг — запасной вариант для всего, до чего детерминированный не дотягивается: хешированный email, хешированный номер телефона, client IP и user agent прогоняются через матчинг-движок Facebook, чтобы сделать вывод о том же человеке без единого общего идентификатора. Он срабатывает достаточно часто, чтобы иметь смысл отправлять его на каждом событии, но по своей природе он слабее ID, проехавшего весь путь.

Events Manager показывает это как match quality score для каждого event set — его стоит проверять по расписанию, а не только когда CPA выглядит подозрительно. Тихое падение скора обычно означает, что где-то выше по цепочке пропало поле — баг в хешировании, потерянный external ID, редирект, переставший передавать browser ID, — и это происходит задолго до того, как кто-то заметит изменение цифр ниже по воронке. Если запустить CAPI параллельно с браузерным пикселем с общим идентификатором события, он восстанавливает события, которые пиксель пропустил, а не просто подменяет его; байеры, запускающие оба вместе, обычно получают лучшее покрытие матчинга и более низкий репортящийся CPA, хотя размер этого улучшения слишком сильно зависит от аккаунта и вертикали, чтобы считать его фиксированным числом.

Рука перебирает несколько ключей разной формы у одного замка, и только один ключ полностью входит в механизм

S2S-постбек: репортим само событие дохода

Server-to-server постбек решает совершенно другую задачу. Речь не о восстановлении браузерного события, а о том, чтобы отправить правильное событие в правильный момент — напрямую с вашего бэкенда или CRM. Вместо того чтобы полагаться на клиентский скрипт, который должен поймать депозит или квалифицированный лид, что могут произойти через минуты или дни после клика, ваш сервер отправляет прямой колбэк в тот момент, когда статус действительно меняется в вашей системе учёта.

Это слой, который имеет наибольшее значение для вертикалей, где значимая конверсия — не клик и даже не просмотр страницы, а событие ниже по воронке: завершённый депозит, квалифицированный лид или продлённая подписка. Постбек может донести этот статус напрямую в Facebook как событие CAPI, в аналитику и в триггер push-аудитории — всё из одного и того же изменения статуса, без участия браузера на каком-либо этапе цепочки.

То, что по-настоящему отличает постбек от сетапа только на CAPI, — это роутинг. Регистрация, первый депозит и ребилл — это не одно и то же событие, и их не стоит каждый раз репортить как один сплющенный «Purchase»: каждый статус может маршрутизироваться на своё направление со своим именем события и пейлоадом, и решение об этом принимается на уровне стрима, а не хардкодится раз и навсегда для всего аккаунта. Именно поэтому постбек устойчив к тому самому браузерному деградированию, описанному выше, — он изначально не зависел от того, есть ли у браузера хоть какая-то опора.

Дедупликация и проверка: как заставить event_id доказать свою пользу

Запустить браузерный пиксель и CAPI параллельно без плана — это не больше сигнала, а та же самая конверсия, посчитанная дважды. Facebook дедуплицирует по точному совпадению имени события плюс event ID (или имени события плюс узкого окна event time, если ID отсутствует), так что исправление сугубо механическое: генерируете один идентификатор на каждую реальную конверсию и отправляете его и в клиентский вызов, и в серверный.

На стороне браузера:

fbq('track', 'Purchase', { value: 42.00, currency: 'USD' }, { eventID: 'dep-7f3ac91e-42' });

На стороне сервера тот же идентификатор едет внутри пейлоада CAPI для этого события:

{
  "event_name": "Purchase",
  "event_id": "dep-7f3ac91e-42",
  "event_time": 1751961600,
  "action_source": "website",
  "user_data": {
    "em": ["c775e7b757ede630cd0aa1113bd102661ab38829ca52a6422ab782862f268646"],
    "external_id": "usr_88231",
    "client_ip_address": "198.51.100.7",
    "client_user_agent": "Mozilla/5.0 ..."
  },
  "custom_data": {
    "currency": "USD",
    "value": 42.00
  }
}

Facebook видит один и тот же event ID дважды, оставляет одно событие и отбрасывает дубликат — вместо того чтобы ваш дашборд репортил один депозит как две конверсии, а реальный CPA выглядел вдвое меньше, чем есть на самом деле.

Прежде чем доверять любым из этих цифр, проверьте цепочку, а не просто поверьте на слово: отправьте тестовое событие через Test Events в Facebook и убедитесь, что оно доходит с правильным именем, значением и event ID; следите за падением match quality score, а не ждите, пока первым сдвинется CPA; выборочно сверьте значения event ID в логах пикселя и CAPI, чтобы убедиться, что они действительно совпадают, а не генерируются независимо с каждой стороны, — это распространённый баг; и проверяйте лог доставки постбеков на неудачные или повторные колбэки, потому что тихий таймаут выглядит точь-в-точь как конверсия, которой никогда не было, — пока кто-то специально не начнёт это искать.

Штамп завис над бумагой с двумя наложенными оттисками, и только один из них полностью пропечатан

Pixel против Conversions API против S2S-постбека

Браузерный PixelConversions APIS2S-постбек
НадёжностьНизкая — блокируется адблокерами, ITP, потерянными вкладкамиВысокая — server-to-server, без зависимости от браузераСамая высокая — срабатывает с вашего бэкенда на реальных изменениях статуса
Готовность к cookielessНетДаДа
Сложность настройкиНизкая (один тег скрипта)Средняя (серверная интеграция, матчинг событий)Средняя-высокая (роутинг по статусам, настройка эндпоинта)
Матчинг идентичностиТолько cookie/browser IDДетерминированный + вероятностный (хешированный PII, external ID)Наследует любой ID, который ваш бэкенд уже хранит на юзера
Типичный режим сбояТихое выпадение — событие просто не срабатывает, без видимой ошибкиОтсутствующие или некорректные поля идентичности тихо просаживают match qualityОшибка конфигурации эндпоинта или таймаут — статус не доходит до систем ниже по цепочке
Лучше всего подходит дляРанних просмотров страниц в воронке, быстрых проверокВосстановления потерянных событий пикселя, матчинга сигнала верхней части воронкиСобытий глубокой воронки: депозитов, продаж, продлений подписок, точной по доходу атрибуции

Ни один из этих слоёв не является прямой заменой другого — каждый отвечает на свой вопрос об одном и том же пути пользователя. Практическое правило: относитесь к серверному трекингу (CAPI плюс постбек) как к источнику истины, а браузерному пикселю оставьте роль вспомогательного сигнала на раннем этапе воронки, а не записи того, что на самом деле произошло.

Как подобрать слои под вашу вертикаль

Правильный микс меняется в зависимости от вертикали, потому что событие, которое действительно предсказывает доход, везде разное.

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

Нутра и COD — событие, видимое пикселем, обычно — это отправка формы или оформление заказа; событие, которое действительно платит, — это подтверждённая доставка или принятый звонок, которые могут наступить через дни и могут откатиться назад при отказе от заказа. CAPI восстанавливает сигнал об оформленном заказе; постбек должен нести статус подтверждения, а не только исходный заказ.

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

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

Во всех четырёх случаях паттерн повторяется: пиксель — для дешёвого раннего сигнала, CAPI — чтобы восстановить то, что теряет браузер, постбек — для события, связанного с реальным доходом. Настройка пикселей и push в DarkCore построена именно вокруг этого разделения — event mapping позволяет решать для каждого статуса конверсии, какое событие срабатывает и под каким именем, так что регистрация, депозит и ребилл попадают в Facebook как отдельные, разные события, а не как один общий «Purchase», повторённый трижды. В паре с интеграцией Facebook Ads от DarkCore события пикселя и CAPI срабатывают только на статусах, подтверждённых вашим бэкендом, — а не на просмотре страницы, который может никогда не превратиться в доход, — так что Ads Manager перестаёт гадать о том, что ваша CRM уже точно знает.

Пара рук разводит пучок толстых кабелей разного диаметра по отдельным гнёздам старой коммутационной панели

Типичные ошибки

  • Непоследовательное хеширование полей идентичности. Заглавные буквы, лишние пробелы или неубранный +alias в email захешируются в совершенно другое значение, чем тот же адрес, хешированный правильно, — это тихо просаживает вероятностный match rate без какой-либо видимой ошибки.
  • Считать дашборд пикселя источником истины аккаунта для автоправил. Правила, которые ставят на паузу или масштабируют на основе только цифр браузерного пикселя, реагируют на наименее полный сигнал в стеке — особенно на офферах с отложенными конверсиями ниже по воронке.
  • Отправлять каждый статус как одно общее событие. Сплющивание регистрации, депозита и ребилла в один «Purchase» ломает способность Facebook оптимизироваться под конкретное событие, которое действительно платит, — и алгоритм в итоге гонится за объёмом вместо качества депозитов.
  • Считать, что один лишь CAPI закрывает разрыв, для которого предназначен постбек. CAPI восстанавливает только те события, для которых ваш собственный трекинговый домен вообще присутствовал. Он не может зарепортить депозит, который происходит полностью внутри системы адвертайзера или оффера через дни, — этот разрыв закрывает только настоящий постбек.
  • Игнорировать сбои доставки постбеков. Колбэк, упавший по таймауту или вернувший 404, с дашборда выглядит точь-в-точь как конверсия, которой никогда не было, — без алертов на неудачные доставки этот разрыв ошибочно списывают на качество трафика, а не на проблему с доставкой.

FAQ

Нужны ли мне все три слоя, или можно вообще обойтись без браузерного пикселя?

Можно запустить CAPI и постбек вообще без браузерного пикселя, и для вертикалей с глубокой воронкой и отложенными конверсиями это часто оказывается более лёгким сетапом. Но пиксель всё равно отрабатывает своё на дешёвых, высокообъёмных сигналах раннего этапа воронки — просмотры страниц, первые клики, — где скорость и простота важнее полноты.

Как Facebook решает, какое из дублирующихся событий оставить при дедупликации?

Facebook сначала матчит по имени события плюс event ID, а если ID отсутствует — переходит на имя события плюс узкое окно event time. Считается то событие, которое он обработал первым для этого идентификатора, — дубликат просто отбрасывается, а не объединяется.

Какой минимум данных идентичности стоит отправлять в каждом событии CAPI?

Как минимум — хешированный email или external ID, привязанный к исходному клику. Добавление client IP, user agent и любого идентификатора, зафиксированного браузером, ощутимо улучшает match rate — особенно для событий, которые срабатывают через дни после завершения исходной сессии и которым больше не за что зацепиться.

Может ли S2S-постбек работать вообще без CAPI?

Да — постбек может доставить изменение статуса напрямую в Facebook как собственное событие в формате CAPI, без необходимости в отдельной CAPI-интеграции где-то ещё в воронке. На практике большинство сетапов используют один и тот же серверный канал для обоих, поскольку событие постбека и событие CAPI — это один и тот же механизм доставки, просто инициированный разными источниками.

Для этого не нужен какой-то экзотический стек — нужно признать, что ни один отдельный слой измерения никогда не увидит всю вашу воронку, потому что половина важного происходит уже после того, как браузер потерял интерес. Пиксель — для дешёвого сигнала, CAPI — чтобы восстановить то, что теряет браузер, с сохранённой идентичностью и дедупликацией, постбек — для события, которое действительно оплачивает счета. Если цифры в вашем Ads Manager и в CRM давно не сходятся, стоит разобраться, какой слой на самом деле говорит правду, прежде чем трогать бюджет — пишите команде DarkCore в Telegram, и мы поможем правильно связать все три слоя.

  • facebook capi
  • conversions api
  • трекинг пикселя
  • s2s постбек
  • дедупликация событий
  • атрибуция