Keitaro и Facebook Conversions API (cAPI)

Keitaro и Facebook Conversions API (cAPI) Полезные сервисы

Что лучше — обычный Facebook Pixel или cAPI? На практике и тот, и другой работают одинаково эффективно, даже на больших объёмах. Однако когда в Facebook начинаются «тряски», сообщество традиционно начинает перебирать все варианты и внедрять что-то новое — в столь непростые времена.

Ранее в нашей команде мы использовали трекер Keitaro в связке с S2S-постбэками для передачи конверсий в Facebook через API. Но, как вы знаете, такая связка устроена по принципу:
1 кампания в Keitaro — 1 пиксель — 1 токен,
что не совсем удобно и ограничивает гибкость.

Поэтому мы решили протестировать наработки Адама — платформу для передачи конверсий по API в Meta. У неё был плюс: можно было наглядно отслеживать все переданные события, данные к ним и статусы ответов от Facebook. Однако она не решала ключевую проблему, о которой я говорил выше — необходимость передавать в постбэке и пиксель, и токен.

Чтобы решить этот вопрос, я добавил функционал сохранения пикселя и токена в базу данных. Теперь, когда на платформу приходит S2S-постбэк от Keitaro, в нём содержится только пиксель. Далее система проверяет в БД наличие токена, соответствующего этому пикселю.
Если токен найден — мы отправляем событие в Facebook через API.
Если токен не найден — возвращаем в ответ на постбэк ошибку с сообщением о том, что для указанного Facebook Pixel не найден токен.

Плафторма для Facebook Conversions API

Ниже — скриншот платформы для работы с Keitaro и Facebook cAPI.
Интерфейс понятный и интуитивный. На главной странице размещена инструкция по настройке необходимых параметров и постбеков в Keitaro.

Также доступны вкладки «Статистика» и «Пиксели», где баинг вносит свои пиксели и соответствующие им токены.

Передача данных о лидах с Keitaro в Facebook Conversions API

Все основные данные для отправки конверсий мы передаём S2S-постбеком из кампании в Keitaro на собственную платформу. Исключение — токен. Он заранее хранится в базе данных и подтягивается по пикселю.

В дополнение к основным параметрам постбека мы также можем передавать дополнительные данные, такие как имя, телефон, а при наличии — email. Эти данные пригодятся для улучшения качества события в cAPI и повышения точности атрибуции.

Как передаём имя и телефон с Keitaro в cAPI

На всех наших лендингах в файле api.php после успешной отправки лида мы редиректим пользователя на страницу «спасибо», передавая имя и номер телефона в URL-параметрах для отображения и записи:

header('Location: success.php?name=' . urlencode($_POST['name']) . '&phone=' . urlencode($_POST['phone']));

На странице success.php мы записываем эти данные в нужные саб-айди следующим образом:

document.addEventListener("DOMContentLoaded", () => {
  const getCookie = (name) => {
    const cookies = document.cookie.split(';');
    for (let cookie of cookies) {
      const [key, value] = cookie.trim().split('=');
      if (key === name) return decodeURIComponent(value);
    }
    return null;
  };

  const subid = getCookie('_subid');
  const name = new URLSearchParams(window.location.search).get("name");
  const phone = new URLSearchParams(window.location.search).get("phone");

  if (subid && name && phone) {
    const pingUrl = `${location.protocol}//${location.hostname}?_update_tokens=1&sub_id=${encodeURIComponent(subid)}&sub_id_22=${encodeURIComponent(name)}&sub_id_23=${encodeURIComponent(phone)}`;
    const trackingImg = new Image();
    trackingImg.src = pingUrl;
    trackingImg.referrerPolicy = 'no-referrer-when-downgrade';
    trackingImg.style.display = 'none';
    document.body.appendChild(trackingImg);
  }
});

Эти значения сохраняются и используются для дальнейшей отправки событий в Facebook Conversions API.

Работа с Facebook Pixel и cAPI одновременно

Мы используем как обычный JavaScript Pixel, так и сервисную отправку через cAPI. Чтобы события не дублировались, применяется дедупликация: мы передаём одинаковый eventID как в js-пикселе, так и в cAPI. Это позволяет Facebook перезаписать событие с более актуальными или точными данными, пришедшими позже через сервер.

Пример реализации JS-пикселя с дедупликацией

document.addEventListener("DOMContentLoaded", () => {
  const eventKey = "fbEventSent";
  const now = Date.now();
  const twoHours = 7200 * 1000;

  const storedEvent = localStorage.getItem(eventKey);
  if (storedEvent) {
    try {
      const { timestamp } = JSON.parse(storedEvent);
      if (timestamp && now - timestamp < twoHours) return;
    } catch (e) {}
  }

  const pxl = sessionStorage.getItem('pxl');
  const subid = sessionStorage.getItem('external_id');
  const eventId = sessionStorage.getItem('event_id');
  const contentIds = sessionStorage.getItem('content_ids');

  if (!pxl) return;

  !function(f,b,e,v,n,t,s){
    if(f.fbq)return;
    n=f.fbq=function(){ n.callMethod ? n.callMethod.apply(n,arguments) : n.queue.push(arguments); };
    if(!f._fbq)f._fbq=n;
    n.push=n;
    n.loaded=!0;
    n.version='2.0';
    n.queue=[];
    t=b.createElement(e);
    t.async=!0;
    t.src=v;
    s=b.getElementsByTagName(e)[0];
    s.parentNode.insertBefore(t,s)
  }(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');

  fbq('init', pxl);

  const customData = {};
  if (subid) customData.external_id = subid;
  if (contentIds) customData.content_ids = contentIds;

  if (eventId) {
    fbq('track', 'Lead', customData, { eventID: eventId });
  } else {
    fbq('track', 'Lead', customData);
  }

  localStorage.setItem(eventKey, JSON.stringify({ timestamp: now }));
});

Где храним данные для пикселя и cAPI

Все ключевые параметры сохраняем на главной:

const pxl = sessionStorage.getItem('pxl');
const subid = sessionStorage.getItem('external_id');
const eventId = sessionStorage.getItem('event_id');
const contentIds = sessionStorage.getItem('content_ids');

мы сохраняем в sessionStorage на главной странице лендинга. Это позволяет использовать их как в JS-пикселе, так и в серверной части для отправки через Conversions API.

Настройка S2S-постбеков для передачи событий Lead и Sale в Facebook через платформу

Чтобы корректно отправлять события Lead и Sale в Facebook с помощью нашей платформы, необходимо настроить следующие URL постбеков в Keitaro.

🔹 Постбек для лида (Lead):

https://keitaro/lander/capi/postback.php?clickid={subid}&name={sub_id_22}&phone={sub_id_23}&time={conversion_time}&owner={sub_id_24}&fbclid={fbclid}&country={country_code}&city={city}&ip={ip}&user_agent={user_agent}&revenue={payout}&pixel={pxl}&domain={sub_id_25}&action=lead

🔹 Постбек для продажи (Sale):

https://keitaro/lander/capi/postback.php?clickid={subid}&name={sub_id_22}&phone={sub_id_23}&time={conversion_time}&owner={sub_id_24}&fbclid={fbclid}&country={country_code}&city={city}&ip={ip}&user_agent={user_agent}&revenue={payout}&pixel={pxl}&domain={sub_id_25}&action=sale

⚙️ Пошаговая инструкция по настройке постбеков в Keitaro:

  1. Перейдите в раздел Кампании → S2S постбеки
  2. Нажмите кнопку «Добавить»
  3. Выберите метод запроса: GET
  4. Вставьте соответствующий URL (для лида или продажи)
  5. Установите нужный статус события: lead или sale

🧩 Макросы, которые нужно указать вручную в параметрах кампании:

  • name — имя клиента
  • phone — телефон клиента
  • owner_name — имя байера (owner)
  • domain — домен страницы «спасибо»
  • fbclid — идентификатор клика Facebook ({fbclid})

Как использовать платформу

Внизу вы найдёте архив с платформой. Просто:

  1. Залейте содержимое архива в директорию оффера в Keitaro
  2. Подключите платформу к нужной кампании
  3. Отправляйте S2S-постбеки на файл postback.php, как указано выше
  4. Для открытия интерфейса используйте параметр доступа:
?secret=5555

По итогам прикрепляю саму платформу для Keitaro и Facebook Conversions API (cAPI)

Оцените статью
BoostClicks