Facebook CAPI může opravdu extrémně pomoct s konverzemi nejen prodeje, ale i se získáváním kontaktů.. např. na webinář.
Dávám k dispozici techničtějším typům velice jednoduché nastavení skrz vlastní php script. Díky javascriptu spuštěnému např. při vložení zboží do košíku nebo nákupu, můžete poslat informaci nejen skrz prohlížeč, ale i skrz server (tzv. server-side).
O deduplikaci se také postará uvedený javascript.
Obsah článku
Postup
- Nejdříve je nutné nahrát váš upravený php kód na vaši doménu skrz FTP. Např. do podadresáře /sync. Odkaz na něj pak bude https://www.vasedomena.cz/sync/capi.php
- Pro jednotlivé události spustíte speciální kód na standardní konverze (více o konverzích zde)
- pro eshopy minimálně:
- ViewContent
- AddToCart
- InitiateCheckout
- Purchase
- pro weby, které získávají kontakty
- CompleteRegistration
- pro eshopy minimálně:
- Otestujete a máte to 😃
PHP script
Jde o jednoduchý PHP script, který převezme hodnotu zaslanou javascriptem a předá skrz API Facebooku.
Červeně označené věci si změňte podle vašeho nastavení.
<?php
header("Access-Control-Allow-Origin: https://www.vasedomena.cz");
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header("Access-Control-Allow-Headers: *");
// Check POST data
$post_json = file_get_contents('php://input');
if (!$post_json) die(); // The post data required
// Setup
$fb_access_token = 'VAS_TOKEN_Z_FACEBOOKU';
$fb_pixel_id = 'VAS_FACEBOOK_PIXEL';
$fb_test_event_code = '';
$timestamp = time();
$post_array = array();
$data = array();
$error_send = FALSE;
$post_array = json_decode($post_json, true);
if (!$post_array['event']) die(); // The event name required
// IP address
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$ch = curl_init();
$data['event_name'] = &$post_array['event'];
$data['event_time'] = $timestamp;
if ($post_array['event_id']) {
$data['event_id'] = &$post_array['event_id'];
}
$data['event_source_url'] = &$post_array['url'];
$data['action_source'] = "website";
if ($post_array['event_data']) {
$data['custom_data'] = &$post_array['event_data'];
}
$data['user_data']['client_ip_address'] = $ip; // ip address
$data['user_data']['client_user_agent'] = &$post_array['user_agent'];
$data['user_data']['fbp'] = &$post_array['fbp'];
$data['user_data']['fbc'] = &$post_array['fbclid'];
if ($post_array['em']) {
$data['user_data']['em'] = &$post_array['em']; // email
}
$fields = "{'data':'[".json_encode($data)."]'";
if ($fb_test_event_code) $fields .= ",'test_event_code':'".$fb_test_event_code."'";
$fields .= "}";
curl_setopt_array($ch, array(
CURLOPT_URL => 'https://graph.facebook.com/v10.0/'.$fb_pixel_id.'/events?access_token='.$fb_access_token,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $fields,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
));
$result = curl_exec($ch);
curl_close ($ch);
?>
Javascript
Tyto scripty se spouští v případě udělané konverze. Použil jsem to i na obyčejné zobrazení stránky (PageView), ale není to nutné.
Script počítá i s tím, pokud byste věděli email návštěvníka stránky (nemusí to být jen v rámci objednávky 😃). V rámci našeho Klubu NDigital je spousta vychytávek, jak email posílat nejen do Facebooku a zpřesnit tak měření o cca 20%.
Ukázka scriptu s deduplikací v případě dokončení objednávky (Purchase). Samozřejmě musíte červené hodnoty dynamicky měnit… já to dělám v Google Tag Manageru a díky datalayer, ale můžete to měnit i např. ve vašem eshopu doplněním proměnných.
Pro deduplikaci jsem použil id transakce: {{ecommerce.transaction_id}}. Pokud máte email {{ecommerce.email}}, přidejte ho tam.
<script>
function CAPI(event, eventData) {
var fbp = document.cookie.split(';').filter(function (c) {
return c.includes('_fbp=');
}).map(function (c) {
return c.split('_fbp=')[1];
});
var fbc = document.cookie.split(';').filter(function (c) {
return c.includes('_fbc=');
}).map(function (c) {
return c.split('_fbc=')[1];
});
fbp = fbp.length && fbp[0] || null;
fbc = fbc.length && fbc[0] || null;
var headers = new Headers();
headers.append("Content-Type", "application/json");
var body = {
"event": event,
"event_data": eventData,
"fbp": fbp,
"fbclid": fbc,
"user_agent": navigator.userAgent,
"url": window.location.origin + window.location.pathname,
"em": {{SHA256}}({{ecommerce.email}}), // SHA256 email
"event_id": {{ecommerce.transaction_id}}
};
var options = {
method: "POST",
headers: headers,
mode: "cors",
body: JSON.stringify(body)
};
fetch("https://www.vasedomena.cz/sync/capi.php", options);
}
var custom_data = {
value: {{TransactionTotalPrice}},
content_ids: {{transactionProductsId}},
currency: {{currency}},
content_type: 'product',
}
CAPI ('Purchase', custom_data);
if (typeof fbq == 'function') {
fbq('track', 'Purchase', {currency: {{currency}}, content_type: 'product',value: {{TransactionTotalPrice}}, content_ids: {{transactionProductsId}}},{eventID: {{ecommerce.transaction_id}}});
} </script>
..a tady např. vložení do košíku (AddToCart). Deduplikace je zde jednoduchá proměnná customEventID, který vznikl ve spojení času a náhodného čísla {{Random Number}}:
<script>
var customEventID = 'addtocart.'+Date.now()+'.'+{{Random Number}};
function CAPI(event, eventData) {
.. stejné jako v Purchase ..
}
var custom_data = {
.. stejné jako v Purchase ..
}
CAPI ('AddToCart', custom_data);
if (typeof fbq == 'function') {
fbq('track', 'AddToCart', custom_data, {eventID: customEventID});
}
</script>
… to samé pak uděláte pro ViewContent:
<script>
var customEventID = 'viewcontent.'+Date.now()+'.'+{{Random Number}};
function CAPI(event, eventData) {
.. stejné jako v Purchase ..
}
var custom_data = {
.. stejné jako v Purchase ..
}
CAPI ('ViewContent', custom_data);
if (typeof fbq == 'function') {
fbq('track', 'ViewContent', custom_data, {eventID: customEventID});
}
</script>
a další je pro InitialCheckout
<script>
var customEventID = 'initialcheckout.'+Date.now()+'.'+{{Random Number}};
function CAPI(event, eventData) {
.. stejné jako v Purchase ..
}
var custom_data = {
.. stejné jako v Purchase ..
}
CAPI ('InitialCheckout', custom_data);
if (typeof fbq == 'function') {
fbq('track', 'InitialCheckout', custom_data, {eventID: customEventID});
}
</script>
Jde to samozřejmě dělat i pro PageView, ale bacha na výkon webhostingu nebo serveru. Není zde už proměnná customdata.
Zde ukazuji i možnost posílat to „obrázkem“ (musíte změnit ID_PIXEL)
<script> var customEventID = 'pageview.'+Date.now()+'.'+{{Random Number}}; function CAPI(event) { .. stejné jako v Purchase, pouze bez customdata proměnné .. } CAPI ('PageView'); if (typeof fbq == 'function') { fbq('track', 'PageView',NULL, {eventID: customEventID}); } </script> <img src="https://www.facebook.com/tr?id=ID_PIXEL&ev=PageView" height="1" width="1" style="display:none"/>
Závěr
Určitě vás napadne i spousta dalších možností, jak zlepšit měření… namátkou jsou to:
- Google Analytics 4
- Google Ads
- Activecampaign
apod…
Mám pro vás dobrou zprávu: Extrémně to pomáhá nejen s analytikou, ale i s lepší efektivitou reklamních nástrojů.
Doporučuji se registrovat do našeho Klubu NDigital, kde to probíráme a řešíme v rámci tipů a od dubna 2023 plánuji i speciální sekci: Server-side měření.