시작하기 페이지의 필수 조건을 완료한 후 이 페이지에서 이벤트를 전송하고 테스트 이벤트 도구를 사용하는 방법을 알아보세요. 이벤트를 전송한 후 설정을 확인하세요.
전환 API는 그래프 API를 기반으로 구축된 Facebook 마케팅 API에 기반합니다. 마케팅 및 그래프 API는 버전 사용 중단 일정이 각각 다릅니다. 릴리스 사이클은 그래프 API를 따라가므로 모든 버전이 2년 이상 지원됩니다. 이 예외 사항은 전환 API에만 유효합니다.
전환 API: 개요매개변수전환 API를 사용하여 공유된 웹, 앱 및 오프라인 매장 이벤트에는 특정 매개변수가 필요합니다. 전환 API를 사용하면 회원님이 아는 한도 내에서 action_source
매개변수가 정확하다는 데 동의하게 됩니다. 필요한 매개변수의 리스트는 여기에서 확인할 수 있습니다.
새 이벤트를 전송하려면 https://graph.facebook.com/{API_VERSION}/{PIXEL_ID}/events?access_token={TOKEN}
경로에서 이 API의 /events
에지로 POST
요청을 보내세요. 이 에지로 POST 요청을 보내면 Facebook이 새 서버 이벤트를 생성합니다.
curl -X POST \
-F 'data=[
{
"event_name": "Purchase",
"event_time": 1732199634,
"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
쿼리 매개변수를 사용하여 요청에 첨부합니다. 그래프 API 탐색기를 사용하여 POST
요청을 /<pixel_id>/events
엔드포인트로 보낼 수도 있습니다.
요청 본문 예시는 다음과 같습니다.
{ "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일까지 가능합니다. data
에 최근 7일보다 이전인 event_time
이 있을 경우 전체 요청에 대해 오류가 반환되고 이벤트가 처리되지 않습니다. physical_store
가 action_source
로 포함된 오프라인 및 실물 매장 이벤트의 경우 전환 시점으로부터 62일 이내에 거래를 업로드해야 합니다.
전환 API를 사용하면 회원님이 아는 한도 내에서 action_source
매개변수가 정확하다는 데 동의하게 됩니다.
data
에서 최대 1,000개까지 이벤트를 전송할 수 있습니다. 그러나 최적의 성능을 위해서는 이벤트가 발생하는 즉시 전송하는 것이 좋고 이벤트가 발생하고 1시간 이내이면 가장 이상적입니다. 일괄 전송한 이벤트가 유효하지 않을 경우 전체 배치가 거부됩니다.
고객 정보 매개변수 페이지에서 Facebook에 전송하기 전에 해시되어야 하는 매개변수를 확인하세요. 비즈니스 SDK 중 하나를 사용하는 경우 SDK가 대신 해시를 처리합니다.
전환 API 사용자용으로 설계된 비즈니스 SDK 기능 3가지, 비동기식 요청, 동시 일괄 처리, HTTP 서비스 인터페이스에 대해 자세히 알아보세요. 이러한 기능을 사용하는 데 필요한 최소 언어 버전은 다음과 같습니다.
PHP 5에 대한 비즈니스 SDK 지원은 2019년 1월 이후로 사용 중단되었습니다. PHP 7로 업그레이드하여 비즈니스 SDK를 사용하세요.
PHP 5를 사용하는 경우 Swagger 구현을 사용하는 것을 고려하세요.
이벤트를 보내고 나면 이벤트 관리자에서 이벤트를 수신했는지 확인합니다.
이벤트 관리자의 테스트 이벤트 기능을 사용하여 Facebook에서 올바르게 서버 이벤트를 수신했는지 확인할 수 있습니다. 도구를 찾으려면 Events Manager > Data Sources > Your Pixel > Test Events
로 이동합니다.
테스트 이벤트 도구에서 테스트 ID를 생성합니다. 테스트 ID를 test_event_code
매개변수로 보내면 테스트 이벤트 창에 이벤트 활동이 나타나기 시작합니다.
참고: test_event_code
필드는 테스트에만 사용해야 합니다. 프로덕션 페이로드 전송 시 이를 삭제해야 합니다.
test_event_code
를 포함해 전송한 이벤트는 드롭되지 않습니다. 이벤트 관리자로 전송되어 타게팅 및 광고 측정 목적으로 사용됩니다.
요청 구조의 예시는 다음과 같습니다.
그래프 API 탐색기에서 요청이 나타나는 모습의 예시는 다음과 같습니다.
이 테스트 페이로드는 페이로드 도우미 도구를 사용하여 생성할 수 있습니다. 테스트 이벤트 코드는 페이로드를 테스트하는 데만 사용합니다.
요청이 전송되면 서버 이벤트가 테스트 이벤트 창에 나타납니다.
이 두 API의 경우 이벤트의 데이터 매개변수 내에서 각 이벤트 내부에 data_processing_options
, data_processing_options_country
및 data_processing_options_state
를 추가하여 데이터 처리 옵션을 구현합니다.
참고: 앱 이벤트 및 오프라인 전환 API는 더 이상 새로운 통합에 권장되지 않습니다. 대신 전환 API가 웹, 앱, 오프라인 이벤트를 지원하므로 이를 사용하는 것이 좋습니다. 자세한 내용은 앱 이벤트용 전환 API 및 오프라인 이벤트용 전환 API를 참조하세요.
제한된 데이터 사용(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는 .csv
파일에서 이벤트를 수동으로 업로드하는 옵션을 제공합니다. 이 경우 데이터 처리 옵션, 데이터 처리 국가, 데이터 처리 주를 파일 내 열로 추가합니다. 이에 대한 자세한 정보는 업로드 사용자 인터페이스를 참조하세요.
데이터 처리 옵션에 대해 자세히 알아보세요.
마케팅 API에는 자체 사용 제한 로직이 있으며 모든 그래프 API 사용 제한에서 제외됩니다. 따라서 마케팅 API를 호출하는 경우 그래프 API 제한으로 계산되지 않습니다.
전환 API에는 특정한 사용 제한이 없습니다. 전환 API 호출은 마케팅 API 호출로 계산됩니다. 유일한 제한은 한 번에 전송할 수 있는 이벤트가 최대 1,000개라는 것입니다. 자세한 내용은 요청 보내기를 참조하세요.
마케팅 API 사용 제한이 가이드는 전환 API 게이트웨이 사용자를 위해 설계된 Meta Business SDK 고급 기능을 둘러보는 데 도움이 됩니다. 기본 전환 API 게이트웨이 사용량의 경우 전환 API 게이트웨이 문서를 참조하세요.
아래에 나와 있는 기능을 사용하기 전에 Meta Business SDK를 설치해야 합니다. Meta Business SDK 시작하기를 참조하거나 여기에 나와 있는 README 지침을 따르세요.
현재 이러한 기능은 PHP 및 Java 비즈니스 SDK에서만 사용할 수 있습니다. 나머지 언어는 2023년 말까지 구현될 예정입니다.
이러한 기능을 사용하는 데 필요한 최소 언어 버전은 다음과 같습니다.
PHP >= 7.2
Java >= 8
참고: 전환 API 엔드포인트에 대한 이벤트에서 중복을 제거하려면 요청에서 eventId
를 전달하세요. 이는 전환 API 게시가 활성화되었을 때 중복 이벤트가 표시되지 않도록 도와줍니다.
CAPIGatewayIngressRequest
매개변수 형식 지정매개변수 | 설명 |
---|---|
endpointUrl 문자열 | 이벤트를 수신하는 전환 API 게이트웨이 엔드포인트. 유효한 URL인지 확인하는 것 외에는 이 매개변수에 대한 사전 검증을 수행하지 않습니다. 예: https://test.example.com |
accessKey 문자열 | 전환 API 게이트웨이 이벤트 엔드포인트에 이벤트를 보내는 데 필요한 전환 API 게이트웨이 액세스 키. 액세스 키를 생성하기 위한 지침이 나와 있습니다. |
CAPIGatewayIngressRequest
설정자매개변수 | 설명 |
---|---|
setSendToDestinationOnly 부울 | 이벤트가 선택된 엔드포인트로만 전송되는지 여부를 나타내는 부울 플래그. 기본값: |
setFilter CustomEndpointRequest.Filter() function | 각 이벤트를 처리하는 필터링 함수. 필터링 로직이 true를 반환하면 이벤트가 전달됩니다. 그렇지 않으면 이벤트가 취소됩니다. 매개변수 이벤트가 있는 인터페이스에 shouldSendEvent 함수를 구현해야 합니다. 기본값: |
Business SDK를 이미 사용 중인 시스템의 경우 새로운 CAPIGatewayIngressRequest를 참조하고 eventRequest의 customEndpoint 개체에 첨부해야 합니다.
// 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를 참조하고 eventRequest의 customEndpoint 개체에 첨부해야 합니다.
// 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; } });