Советы по альтернативным вариантам реализации, использованию пикселя в одностраничных веб-приложениях и отслеживанию конверсий с нажатием кнопок и прокруткой страниц.
Если ваша деятельность охватывает страны, в которых действует Общий регламент по защите данных (GDPR), ознакомьтесь с документом по GDPR, в котором рассказывается, как добиться нормативного соответствия.
Хотя пиксель можно устанавливать с помощью тега IMG, рекомендуем использовать способы из руководства по реализации.
Если вы хотите установить пиксель в рамках облегченной реализации, воспользуйтесь тегом <img>
. Для этого добавьте следующий код между открывающим и закрывающим тегами <noscript>
в заголовок или тело кода веб-сайта, подставив вместо {pixel-id}
ID своего пикселя, а вместо {standard-event}
— стандартное событие.
<img src="https://www.facebook.com/tr?id={pixel-id}&ev={standard-event}" height="1" width="1" style="display:none"/>
Пиксели, заданные в теге <img>
, также поддерживают параметры, которые можно добавлять в строку запроса. Пример:
<img src="https://www.facebook.com/tr?id=12345 &ev=ViewContent &cd[content_name]=ABC%20Leather%20Sandal &cd[content_category]=Shoes &cd[content_type]=product &cd[content_ids]=1234 &cd[value]=0.50 &cd[currency]=USD" height="1" width="1" style="display:none"/>
Ниже приведен пример установки тега Meta Pixel IMG на ключевые страницы вымышленного веб-сайта с использованием вымышленного идентификатора пикселя (12345
) и пользовательских параметров (например, cd[currency]=USD
).
На странице товара один пиксель используется для отслеживания события PageView
и ещё один — для события ViewContent
:
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=12345&ev=PageView"/>
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=12345&ev=ViewContent"/>
На странице добавления в корзину один пиксель используется для отслеживания события PageView
и ещё один — для события AddToCard
с пользовательскими данными:
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=12345&ev=PageView"/>
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=12345&ev=AddToCart&cd[currency]=USD&cd[value]=0.00"/>
На странице покупки один пиксель используется для отслеживания события PageView
и ещё один — для события Purchase
с данными о покупке:
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=12345&ev=PageView"/>
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=12345&ev=Purchase&cd[currency]=USD&cd[value]=0.00"/>
Измерение на основе агрегированных данных Meta о событиях — это протокол для измерения веб-событий и событий в приложении, полученных от устройств с iOS 14.5 и более поздними версиями. Если данных не хватает или они неполные, можно использовать статистическое моделирование, которое предназначено для предоставления более полной картины результатов.
Мы настоятельно рекомендуем ознакомиться с инструкциями в разделе этого документа, посвященном установке пикселя в теге IMG, или воспользоваться нашим руководством по реализации.
Если вы настроите ваш пиксель IMG, используя выполняемый код JavaScript для генерирования JavaScript Image class без добавления этого класса изображения в дерево DOM веб-сайта, например, используя сторонние библиотеки JavaScript для отправки вашего пикселя IMG, вы должны добавить следующий код, иначе Meta не получит данные вашего пикселя IMG.
var nativeBridge = window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.receiveImgPixel; if (nativeBridge) { const postObj = { id: {pixel-id}, ev: {standard-event}, cd: {stringified-custom-data}, dpo: {data-processing-options}, // Optional CCPA param dpoco: {data-processing-option-country}, // Optional CCPA param dpost: {data-processing-option-state}, // Optional CCPA param }; nativeBridge.postMessage(JSON.stringify(postObj)); }
Если вы размещаете пиксель и тег IMG в объекте iframe с атрибутом sandbox
, добавьте значение allow-scripts
, чтобы Facebook получал данные вашего пикселя в теге IMG.
Мы расширили функциональность AEM: теперь этот механизм учитывает конверсии со всех страниц, связанных с рекламодателем, где срабатывают оптимизированные события пикселя. Примеры сценариев, когда это может понадобиться: рекламодатель использует сервисы для сокращения URL или переадресацию на основании геолокации, работает в нескольких сферах деятельности или пользуется услугами рекламных агентств. Если вы хотите использовать AEM в таких сценариях, следуйте этим указаниям:
Когда посетитель нажимает кнопку, код JavaScript пикселя Meta автоматически определяет актуальные поля и передает их в Meta.
Предположим, у вас есть сайт для электронной торговли, на котором при нажатии кнопки "Добавить в корзину" не открывается новая страница, а активируется событие.
В этом примере при загрузке страницы активируется стандартное событие ViewContent
. При нажатии кнопки "Добавить в корзину" активируется стандартное событие AddToCart
.
Для этого сначала загружается код пикселя Meta, который должен выполняться при загрузке страницы:
<!-- Facebook Pixel Code --> <script> fbq('track', 'ViewContent', { content_name: 'Really Fast Running Shoes', content_category: 'Apparel & Accessories > Shoes', content_ids: ['1234'], content_type: 'product', value: 0.50, currency: 'USD' }); </script> <!-- End Facebook Pixel Code -->
Затем событие AddToCart
инициируется либо при загрузке новой страницы, либо при нажатии кнопки "Добавить в корзину". Обрабатывать нажатия кнопок можно разными способами. Вот пример добавления eventListener
для кнопки.
<!-- Somewhere there is a button that performs Add to Cart --> <button id="addToCartButton">Add To Cart</button> <!-- Add Pixel Events to the button's click handler --> <script type="text/javascript"> var button = document.getElementById('addToCartButton'); button.addEventListener( 'click', function() { fbq('track', 'AddToCart', { content_name: 'Really Fast Running Shoes', content_category: 'Apparel & Accessories > Shoes', content_ids: ['1234'], content_type: 'product', value: 4.99, currency: 'USD' }); }, false ); </script>
Обрабатывать события нажатия можно разными способами. Главное — не забывайте вызывать функцию fbq
после каждого нажатия.
В зависимости от того, как реализован пиксель, помощник по пикселям может возвращать ошибку до нажатия кнопки. Чтобы убедиться, что пиксель срабатывает правильно, можно нажать кнопку, после чего ошибка помощника исчезнет.
В этом примере предположим, что у вас есть блог и вы хотите отслеживать случаи, когда пользователи прочитали всю статью. Определить это можно по прокрутке страницы до конца.
Вот пример HTML-кода для загрузки пикселя на странице:
<!DOCTYPE html> <html> <head> <!-- Facebook Pixel Code --> <script> !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', '<FB_PIXEL_ID>'); fbq('track', "PageView"); </script> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=<FB_PIXEL_ID>&ev=PageView&noscript=1" /></noscript> <!-- End Facebook Pixel Code --> </head> <body> <h1>Scroll Page until the Lead event is fired</h1> <div style="height: 120vh; width: 100vw; background-color: #00f;"></div> <h1 id="fb-fire-pixel">Lead event will fire when this phrase enters the screen</h1> <div style="height: 120vh; width: 100vw; background-color: #000;"></div> </body> </html>
Когда на экране появится элемент h1
с атрибутом id=fb-fire-pixel
, должно инициироваться стандартное событие Lead
. Чтобы проверить, отображается ли элемент на экране, добавим на страницу следующий код:
// This code should be loaded together with Meta Pixel var executeWhenElementIsVisible = function(dom_element, callback) { if (!(dom_element instanceof HTMLElement)) { console.error('dom_element must be a valid HTMLElement'); } if (typeof callback !== 'function') { console.error( 'Second parameter must be a function, got', typeof callback, 'instead', ); } function isOnViewport(elem) { var rect = elem.getBoundingClientRect(); var docElem = document.documentElement; return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || docElem.clientHeight) && rect.right <= (window.innerWidth || docElem.clientWidth) ); } var executeCallback = (function() { var wasExecuted = false; return function() { if (!wasExecuted && isOnViewport(dom_element)) { wasExecuted = true; callback(); } }; })(); window.addEventListener('scroll', executeCallback, false); };
После этого необходимо определить, как будет срабатывать пиксель при появлении элемента на экране:
// Get the element that should be visible to trigger the pixel fire var element = document.getElementById('fb-fire-pixel'); // Then, set the event to be tracked when element is visible // Note that second parameter is a function, not a function call executeWhenElementIsVisible(element, function() { fbq('track', 'Lead'); });
Предположим, вам нужно отслеживать случаи, когда пользователь просмотрел некоторую часть страницы. Определить это можно по прокрутке страницы до определенного места.
В первом примере отслеживается просмотренная часть страницы в пикселях. Пиксель срабатывает, если пользователь просмотрел страницу до 500-го пикселя.
var executeWhenReachedPageLength = function(length, callback) { if (typeof length !== 'number') { console.error( 'First parameter must be a number, got', typeof length, 'instead', ); } if (typeof callback !== 'function') { console.error( 'Second parameter must be a function, got', typeof callback, 'instead', ); } function getWindowLength() { return window.innerHeight || (document.documentElement || document.body).clientHeight; } function getCurrentScrolledLengthPosition() { return window.pageYOffset || (document.documentElement || document.body.parentNode || document.body).scrollTop; } var executeCallback = (function() { var wasExecuted = false; return function() { if (!wasExecuted && getCurrentScrolledLengthPosition() > length) { wasExecuted = true; callback(); } }; })(); if (getWindowLength() >= length) { callback(); } else { window.addEventListener('scroll', executeCallback, false); } }; executeWhenReachedPageLength(10, function() { fbq('track', 'Lead'); });
Во втором примере отслеживается просмотренная часть страницы в процентах. Пиксель срабатывает, если пользователь просмотрел 75 % страницы.
var executeWhenReachedPagePercentage = function(percentage, callback) { if (typeof percentage !== 'number') { console.error( 'First parameter must be a number, got', typeof percentage, 'instead', ); } if (typeof callback !== 'function') { console.error( 'Second parameter must be a function, got', typeof callback, 'instead', ); } function getDocumentLength() { var D = document; return Math.max( D.body.scrollHeight, D.documentElement.scrollHeight, D.body.offsetHeight, D.documentElement.offsetHeight, D.body.clientHeight, D.documentElement.clientHeight ) } function getWindowLength() { return window.innerHeight || (document.documentElement || document.body).clientHeight; } function getScrollableLength() { if (getDocumentLength() > getWindowLength()) { return getDocumentLength() - getWindowLength(); } else { return 0; } } var scrollableLength = getScrollableLength(); window.addEventListener("resize", function(){ scrollableLength = getScrollableLength(); }, false) function getCurrentScrolledLengthPosition() { return window.pageYOffset || (document.documentElement || document.body.parentNode || document.body).scrollTop; } function getPercentageScrolled() { if (scrollableLength == 0) { return 100; } else { return getCurrentScrolledLengthPosition() / scrollableLength * 100; } } var executeCallback = (function() { var wasExecuted = false; return function() { if (!wasExecuted && getPercentageScrolled() > percentage) { wasExecuted = true; callback(); } }; })(); if (getDocumentLength() == 0 || (getWindowLength()/getDocumentLength() * 100 >= percentage)) { callback(); } else { window.addEventListener('scroll', executeCallback, false); } }; executeWhenReachedPagePercentage(75, function() { fbq('track', 'Lead'); });
Предположим, что событие пикселя нужно инициировать, только если пользователь находится на странице уже несколько секунд. Для этого можно использовать функцию setTimeout
.
// Delay pixel fire by 3 seconds var seconds = 3; setTimeout(function() { fbq('track', 'Lead'); }, seconds * 1000);
Таким образом можно определять случаи, когда пользователи действительно заинтересованы содержимым страницы, а не просто переходят по ссылкам.
Если вы хотите знать, кто из посетителей просмотрел определенное количество статей на вашем сайте, можно добавить счетчик сеанса и загружать код пикселя Meta при достижении определенного количества просмотров.
Сеанс — это ряд операций пользователя с вашим сайтом, которые выполняются за определенный период времени. Определяя активность пользователя в течение этого периода времени, можно увеличить количество просмотров страниц.
Если имеется переменная sessionCountViews
для site_request
, можно добавить код пикселя Meta, который будет выполняться при достижении определенного количества просмотров страниц.
Пример для просмотра всего шести статей
if (site_request.sessionCountViews == 6) { fbq('track', "ViewContent", { sessionCountViews: site_request.sessionCountViews, }); }
Если на одной странице есть несколько пикселей и нужно выборочно инициировать события для каждого из них, используйте возможности trackSingle
и trackSingleCustom
.
Если использовать функцию track
на странице, где инициализировано несколько пикселей (с помощью отдельного базового кода для каждого из них или общего базового кода для всех), может инициироваться слишком много событий либо возможен непредсказуемый эффект. Поэтому делать это следует только в исключительных случаях.
Ниже приведен пример, в котором событие PageView
инициируется для обоих инициализированных пикселей, стандартное событие Purchase
выборочно инициируется для одного из них, а индивидуально настроенное событие — для другого.
fbq('init', '<PIXEL_A>'); fbq('init', '<PIXEL_B>'); fbq('track', 'PageView'); //fire PageView for both initialized pixels // only fire the Purchase event for Pixel A fbq('trackSingle', '<PIXEL_A>', 'Purchase', { value: 4, currency: 'GBP', }); // only fire the custom event Step4 for Pixel B fbq('trackSingleCustom', '<PIXEL_B>', 'Step4',{ //optional parameters });
В редких случаях события нужно отправлять только на один из пикселей, установленных на сайте (например, чтобы ограничить отправку данных тем или иным пикселям). Эти методы позволяют отслеживать срабатывание для определенного пикселя. Используйте следующий код:
fbq('trackSingle', 'FB_PIXEL_ID', 'Purchase', customData); fbq('trackSingleCustom', 'FB_PIXEL_ID', 'CustomEvent', customData);
Пиксель Meta будет отправлять с вашего сайта информацию о нажатии кнопок и метаданные страницы (например, в формате Opengraph или Schema.org). Это позволяет улучшить показ и измерение рекламы, а также автоматизировать настройку пикселя. Если вы не хотите, чтобы пиксель Meta отправлял эту дополнительную информацию, добавьте в его базовый код перед вызовом init строку fbq('set', 'autoConfig', 'false', 'FB_PIXEL_ID')
.
<!-- Facebook Pixel Code --> <script> !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'); // Line to enable Manual Only mode. fbq('set', 'autoConfig', false, 'FB_PIXEL_ID'); //Insert Your Facebook Pixel ID below. fbq('init', 'FB_PIXEL_ID'); fbq('track', 'PageView'); </script> <noscript> <img height="1" width="1" style="display:none"src="https://www.facebook.com/tr?id=FB_PIXEL_ID&ev=PageView&noscript=1"/> </noscript> <!-- End Facebook Pixel Code -->
Если на вашем сайте действуют правила в отношении безопасности контента, необходимо разрешить загрузку JavaScript с сайта https://connect.facebook.net
. Примечание. Скрипты пикселя загружаются по двум путям: /en_US/fbevents.js
и /signals/config/{pixelID}?v={version}
.