Выполните предварительные требования на странице Начало работы, а затем используйте эту страницу, чтобы узнать, как отправлять события и использовать инструмент тестирования событий. После отправки события проверьте свои настройки.
В основе Conversions API лежит Marketing API Facebook, который, в свою очередь, создан на базе нашего Graph API. Для Marketing API и Graph API действуют разные графики упразднения версий. Наш цикл выпуска соответствует графику для Graph API, поэтому каждая версия поддерживается как минимум два года. Это исключение действительно только для Conversions API.
Обзор Conversions APIПараметрыДля событий с сайта, из приложения или физического магазина, отправленных через Conversions API, требуются определенные параметры. Используя Conversions API, вы соглашаетесь, что параметр action_source
является максимально точным, насколько вам это известно. Их список можно посмотреть в этой статье.
Для отправки новых событий выполните запрос POST
к границе контекста /events
этого API со следующего пути: https://graph.facebook.com/{API_VERSION}/{PIXEL_ID}/events?access_token={TOKEN}
. При отправке запроса POST к этой границе контекста Facebook создает новые серверные события.
curl -X POST \
-F 'data=[
{
"event_name": "Purchase",
"event_time": 1732197800,
"user_data": {
"em": [
"309a0a5c3e211326ae75ca18196d301a9bdbd1a882a4d2569511033da23f0abd"
],
"ph": [
"254aa248acb47dd654ca3ea53f48c2c26d641d23d7e2e93a1ec56258df7674c4",
"6f4fcb9deaeadc8f9746ae76d97ce1239e98b404efe5da3ee0b7149740f89ad6"
],
"client_ip_address": "123.123.123.123",
"client_user_agent": "$CLIENT_USER_AGENT",
"fbc": "fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890",
"fbp": "fb.1.1558571054389.1098115397"
},
"custom_data": {
"currency": "usd",
"value": 123.45,
"contents": [
{
"id": "product123",
"quantity": 1,
"delivery_category": "home_delivery"
}
]
},
"event_source_url": "http://jaspers-market.com/product/123",
"action_source": "website"
}
]' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/<PIXEL_ID>/events
Прикрепите к этому запросу созданный вами безопасный маркер доступа в параметре access_token
. Для отправки запроса POST
к конечной точке /<pixel_id>/events
также можно использовать Graph API Explorer.
Пример тела запроса:
{ "data": [ { "event_name": "Purchase", "event_time": 1633552688, "event_id": "event.id.123", "event_source_url": "http:\/\/jaspers-market.com\/product\/123", "action_source": "website", "user_data": { "client_ip_address": "192.19.9.9", "client_user_agent": "test ua", "em": [ "309a0a5c3e211326ae75ca18196d301a9bdbd1a882a4d2569511033da23f0abd" ], "ph": [ "254aa248acb47dd654ca3ea53f48c2c26d641d23d7e2e93a1ec56258df7674c4", "6f4fcb9deaeadc8f9746ae76d97ce1239e98b404efe5da3ee0b7149740f89ad6" ], "fbc": "fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890", "fbp": "fb.1.1558571054389.1098115397" }, "custom_data": { "value": 100.2, "currency": "USD", "content_ids": [ "product.id.123" ], "content_type": "product" }, "opt_out": false }, { "event_name": "Purchase", "event_time": 1633552688, "user_data": { "client_ip_address": "192.88.9.9", "client_user_agent": "test ua2" }, "custom_data": { "value": 50.5, "currency": "USD" }, "opt_out": false } ] }
event_time
— это время транзакции события. Оно отправляется в виде метки времени Unix в секундах и указывает фактическое время возникновения события. Указанное время может быть раньше, чем время отправки события на Facebook. Это позволяет проводить пакетную обработку и оптимизировать производительность сервера.
event_time
может быть раньше отправки события в Meta на срок до 7 дней. Если какое-либо значение event_time
в data
старше 7 дней, мы возвращаем ошибку для всего запроса и не обрабатываем ни одно событие. Для офлайн-событий и событий из физического магазина, для которых action_source
имеет значение physical_store
, загружать транзакции следует в течение 62 дней с момента конверсии.
Используя Conversions API, вы соглашаетесь, что параметр action_source
является максимально точным, насколько вам это известно.
В составе data
можно отправить до 1000 событий. Однако для оптимизации производительности рекомендуем отправлять события по мере их возникновения (желательно в течение часа с этого момента). Если какое-либо событие в пакете оказывается недействительным, мы отклоняем весь пакет.
Информацию о хэшировании параметров перед отправкой на Facebook см. на странице, посвященной параметрам информации клиента. Если вы используете какой-либо из наших Business SDK, хэширование выполняется в SDK.
Ознакомьтесь с информацией о трех функциях Business SDK, созданных специально для пользователей Conversions API: асинхронных запросах, параллельных пакетных запросах и сервисном интерфейсе HTTP. Минимальная версия языка, необходимая для использования функций:
Поддержка Business SDK для PHP 5 прекращена с января 2019 г. Для использования Business SDK перейдите на PHP 7.
Если вам необходима версия PHP 5, воспользуйтесь нашей реализацией на базе Swagger.
После отправки событий вы должны убедиться, что мы их получили. Это делается в Events Manager:
PIXEL_ID
в вашем запросе POST
. Дополнительные сведения см. в статье о навигации по Events Manager в Справочном центре для бизнеса.Убедиться, что Facebook правильно получает серверные события, можно с помощью функции тестирования событий в Events Manager. Найти соответствующий инструмент можно в разделе Events Manager > Data Sources > Your Pixel > Test Events
.
Инструмент тестирования событий генерирует тестовый ID. Отправьте этот тестовый ID в параметре test_event_code
, чтобы в окне тестирования событий отображались связанные с событиями действия.
Примечание. Поле test_event_code
должно использоваться исключительно для тестирования. При отправке полезных данных разработки его необходимо удалить.
События, отправляемые с кодом test_event_code
, не отбрасываются. Они отправляются в Events Manager и используются для таргетинга и измерения эффективности рекламы.
Пример структуры запроса:
Пример отображения запроса в Graph API Explorer:
Вы можете сгенерировать эти полезные данные с помощью помощника по полезным данным Код тестового события предназначен только для тестовых полезных данных.
После отправки запроса в окне тестирования событий появляются серверные события.
Чтобы реализовать параметры обработки данных для этих двух API, добавьте data_processing_options
, data_processing_options_country
и data_processing_options_state
в каждый элемент в параметре data своих событий.
Примечание. App Events API и Offline Conversions API более не следует использовать для новых интеграций. Вместо этого рекомендуем использовать Conversions API, поскольку теперь он поддерживает веб- и офлайн-события, а также события в приложении. Подробнее см. в разделах API Conversions для событий в приложении и API Conversions для офлайн-событий.
Чтобы явным образом отключить режим ограниченного использования данных (LDU), укажите пустой массив для каждого события или просто удалите поле в полезных данных:
{ "data": [ { "event_name": "Purchase", "event_time": <EVENT_TIME>, "user_data": { "em": "<EMAIL>" }, "custom_data": { "currency": "<CURRENCY>", "value": "<VALUE>" }, "data_processing_options": [] } ] }
Чтобы включить режим LDU и разрешить Meta определить местоположение:
{ "data": [ { "event_name": "Purchase", "event_time": <EVENT_TIME>, "user_data": { "em": "<EMAIL>", "client_ip_address": "256.256.256.256" }, "custom_data": { "currency": "<CURRENCY>", "value": "<VALUE>" }, "data_processing_options": ["LDU"], "data_processing_options_country": 0, "data_processing_options_state": 0 } ] }
Чтобы включить режим LDU и вручную указать местоположение, например для штата Калифорния:
{ "data": [ { "event_name": "Purchase", "event_time": <EVENT_TIME>, "user_data": { "em": "<EMAIL>" }, "custom_data": { "currency": "<CURRENCY>", "value": "<VALUE>" }, "data_processing_options": ["LDU"], "data_processing_options_country": 1, "data_processing_options_state": 1000 } ] }
API Offline Conversions позволяет загружать события вручную из файла .csv
. В этом случае в файл нужно добавить столбцы Data Processing Options (Параметры обработки данных), Data Processing Country (Страна обработки данных) и Data Processing State (Штат обработки данных). Дополнительные сведения см. в пользовательском интерфейсе загрузки.
Подробнее о вариантах обработки данных.
В Marketing API используется собственная логика ограничения числа обращений. Этот API исключен из всех ограничений Graph API. Поэтому вызовы Marketing API не будут учитываться в регулировании Graph API.
Конкретных ограничений числа обращений для Conversions API не установлено. Вызовы Conversions API учитываются в числе вызовов Marketing API. Единственное ограничение: за раз можно отправить не более 1000 событий. Дополнительные сведения см. в статье об отправке запросов.
Ограничение числа обращений для Marketing APIВ этом руководстве описаны расширенные функции Meta Business SDK, разработанные специально для пользователей шлюза Conversions API. Основные функции шлюза Conversions API см. в документации.
Чтобы начать использовать функции, описанные ниже, необходимо установить Meta Business SDK. Обратитесь к руководству по началу работы с Meta Business SDK или следуйте инструкциям ниже:
В настоящий момент эти функции доступны только в Business SDK для PHP и Java. SDK для других языков программирования будут реализованы к концу 2023 года.
Минимальная версия языка, необходимая для использования функций:
PHP >= 7.2
Java >= 8.
Примечание. Чтобы устранить дублирование событий при вызове конечной точки Conversions API, передайте в запросе параметр eventId
. Это поможет предотвратить дублирование событий, если включена публикация Conversions API.
CAPIGatewayIngressRequest
Параметр | Описание |
---|---|
endpointUrl Строка | Конечная точка шлюза Conversions API, на которую отправляются события. Предварительно проверяется только тот факт, что параметр является действительным URL. Пример: https://test.example.com |
accessKey Строка | Ключ доступа шлюза Conversions API, необходимый для отправки событий конечной точке событий шлюза Conversions API. Инструкции по генерации ключа см. в этой статье. |
CAPIGatewayIngressRequest
Параметр | Описание |
---|---|
setSendToDestinationOnly Логическое значение | Логический флаг, указывающий, отправляются ли события только на выбранную конечную точку. Значение по умолчанию — |
setFilter Функция CustomEndpointRequest.Filter() | Функция фильтрации, обрабатывающая каждое событие. Если логика фильтра возвращает значение true, событие проходит фильтрацию. В противном случае событие отбрасывается. Необходимо реализовать функцию shouldSendEvent в интерфейсе, который имеет параметр Event. Значение по умолчанию — |
В системах, которые уже используют Business SDK, нужно просто сослаться на новый CAPIGatewayIngressRequest и прикрепить его к объекту customEndpoint запроса события eventRequest.
// this is the standard event request that we attach events to $event_request = new EventRequest($this->pixel_id); $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $event_request->setCustomEndpoint($capiIngressRequest); // pass the events to this event Request object $event_request->setEvents($events); $event_request->execute()
В системах, которые уже используют Business SDK, нужно просто сослаться на новый CAPIGatewayIngressRequest и прикрепить его к объекту customEndpoint запроса события eventRequest.
// this is the standard event request that we attach events to EventRequest eventRequest = new EventRequest(PIXEL_ID, context); CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); eventRequest.setCustomEndpoint(capiSyncRequest); eventRequest.addDataItem(testEvent); eventRequest.execute();
$api = Api::init(null, null, $this->access_token); $api->setLogger(new CurlLogger()); $event_request = new EventRequest($this->pixel_id); $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $event_request->setCustomEndpoint($capiIngressRequest); $user_data = (new UserData()) ->setEmails(array('joe@eg.com')) ->setPhones(array('12345678901', '14251234567')) ->setFbc('fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890') ->setFbp('fb.1.1558571054389.1098115397'); $event1 = (new Event()) ->setEventName('Purchase') ->setEventId('125') ->setEventTime(time()) ->setEventSourceUrl('http://jaspers-market.com/product/123') ->setUserData($user_data); $events = array($event1, $event2); $event_request->setEvents($events); $response = $event_request->execute(); print($response->__toString());
EventRequest eventRequest = new EventRequest(PIXEL_ID, context); UserData userData = new UserData() .email("abc@eg.com"); CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); eventRequest.setCustomEndpoint(capiSyncRequest); Event testEvent = new Event(); testEvent.eventId("125").eventName("Purchase") .eventTime(System.currentTimeMillis() / 1000L) .userData(userData) .dataProcessingOptions(new String[]{}).setEventId("134423232"); eventRequest.namespaceId("11") .uploadId("22222") .uploadTag("upload-tag-4") .uploadSource("upload-source-4") .testEventCode("test-event-code-5") .partnerAgent("partner-agent-6"); eventRequest.addDataItem(testEvent); eventRequest.execute();
$api = Api::init(null, null, $this->access_token); $api->setLogger(new CurlLogger()); $event_request = new EventRequestAsync($this->pixel_id); $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $capiIngressRequest->setSendToDestinationOnly(true); $event_request->setCustomEndpoint($capiIngressRequest); $event1 = (new Event()) ->setEventName('test Async Event') ->setEventId('134423232') ->setEventTime(time()) ->setEventSourceUrl('http://jaspers-market.com/product/123'); $events = array($event1, $event2); $event_request->setEvents($events); $response = $event_request->execute()->wait();
EventRequest eventRequest = new EventRequest(PIXEL_ID, context); UserData userData = new UserData() .email("abc@eg.com"); CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); capiSyncRequest.setSendToDestinationOnly(true); eventRequest.setCustomEndpoint(capiSyncRequest); Event testEvent = new Event(); testEvent.eventName("test Async Event") .eventTime(System.currentTimeMillis() / 1000L) .userData(userData) .dataProcessingOptions(new String[]{}).setEventId("134423232"); eventRequest.namespaceId("11222") .uploadId("22222") .uploadTag("upload-tag-4") .uploadSource("upload-source-4") .testEventCode("test-event-code-5") .partnerAgent("partner-agent-6"); eventRequest.addDataItem(testEvent); eventRequest.executeAsync();
lass APIFilter implements Filter { public function shouldSendEvent(Event $event): bool { if ($event->getEventId() === '125') { return false; } return true; } } $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $event_request->setCustomEndpoint($capiIngressRequest); $capiIngressRequest->setFilter(new APIFilter());
CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); eventRequest.setCustomEndpoint(capiSyncRequest); capiSyncRequest.setFilter(new CustomEndpointRequest.Filter() { @Override public boolean shouldSendEvent(Event event) { if (event.getEventId().equals("125")) { return true; } return false; } });