Не работает Facebook пиксель. Что делать?

Не работает Facebook пиксель. Что делать? Скрипты и боты

Немного предыстории

Последние пару недель пиксель начал вести себя очень странно. То дублировал лиды в Facebook: например, в Кейтаро 10 лидов, а в FB 15, что было лишь полбеды. Затем ситуация изменилась: в Кейтаро 10 лидов, а в Facebook всего 4-5.

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

Решение

Было принято решение дважды отправлять пиксель на один лид. Первый раз на серверной стороне нашего сайта, второй раз на пользовательской, как и раньше, на странице «Спасибо».

Чтобы в Facebook не дублировались лиды, идем в документацию FB и находим параметр event_id.

Зачем нужен event_id:

  1. Связывание серверных и клиентских событий: Обеспечивает сопоставление событий, отправленных с клиента и сервера.
  2. Устранение дублирования: Избегает регистрации одного и того же события дважды.

Мы можем сами каждому клику присваивать уникальный event_id и передавать его в FB вместе с пикселем. Кейтаро уже присваивает каждому клику уникальный ID в параметре subid, который мы и будем использовать в качестве event_id, чтобы избежать дублирования лидов.

Это также решает проблему, когда пользователь, например, обновляет страницу «Спасибо«, и пиксель отправляется в FB еще раз и еще раз.

Настройка серверной отправки пикселя в файле api.php

$return = curl_exec($process);
if ($return === false) {
    echo 'cURL Error: ' . curl_error($process);
} else {
    $arr = json_decode($return, true);
    if (!isset($arr['error'])) {
        // Отправка пикселя на сервер Facebook с event_id
        $pxl_id = $_REQUEST['pxl'];
        $event_id = $_REQUEST['subid']; // Добавление event_id
        $fb_url = "https://www.facebook.com/tr?id=$pxl_id&ev=Lead&noscript=1&event_id=$event_id";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $fb_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        curl_close($ch);
 
        header('Location: ./success.php?pxl=' . $pxl_id . '&event_id=' . $event_id);
        exit;
    } else {
        echo $return;
    }
}
curl_close($process);

Первый раз событие лида мы отправляем в FB со страницы api.php. Далее данные пикселя и event_id передаем на страницу success.php и там отправляем данные о событии повторно.

$pxl_id = $_GET['pxl'];
$event_id = $_GET['event_id'];
 
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=<?php echo $pxl_id ?>&ev=Lead&noscript=1&event_id=<?php echo $event_id ?>" />

При таком подходе мы дважды сообщаем Facebook о целевом действии, при этом не дублируя информацию.

По результатам теста, 100% лидов успешно зарегистрировались в FB.

UPD темы от 13.10.24 Новый подход к работе с ФБ пикселм

Обновил и протестировал новый подход к работе с Facebook Pixel. Сейчас этот метод работает стабильно, и все события трекаются без перебоев. Для хранения данных использую sessionStorage, и это решение оказалось очень удачным.

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

На странице index.html размещаем следующий код, перед закрывающим тегом </head>:

        <script>
            (function () {
                const urlParams = new URLSearchParams(window.location.search);
                const pxl = urlParams.get('pxl');

                if (pxl) {
                    sessionStorage.setItem('pxl', pxl);
                }
            })();
        </script>

На странице success.html размещаем следующий код, перед закрывающим тегом </head>:

        <script>
            (function () {
                const pxl = sessionStorage.getItem('pxl');
                if (pxl) {
                    const img = new Image(1, 1);
                    img.style.display = 'none';
                    img.src = `https://www.facebook.com/tr?id=${pxl}&ev=Lead&noscript=1`;
                    document.body.appendChild(img);
                }
            })();
        </script>

При таком исполнении, в api.php пиксель мы не передаем.

Переходите в мой ТГ канал, там много интересного!

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