Meta(Facebook) Pixel重複載入、自訂事件與指定ID的解決方案 trackSingle
許多行銷人員都會依賴 GTM 插入 Facebook Pixel 的程式碼,但你是否有想過,當一個網站上出現多個 Pixel ID 的時候,一直 init(重新宣告)Pixel ID、直接觸發事件、整段程式碼貼上,會重複追蹤事件(一直Add to Cart)、覆蓋變數影響其它 Pixel ID……等問題,最終除了讓網頁效能降低外,收集到的數據也不準確。
曾經經手過一個充滿好幾個 meta pixel 和 bing uet 的網站,單純把 GTM 拿掉,效能就可以提升超過40分。
自訂事件一般寫法
許多行銷人員會在 GTM 中使用「自訂 HTML」直接貼上像這樣的程式碼來達成他想要的自訂事件:
<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', '1234567890');
fbq('trackCustom', '自訂事件名稱', { '額外要傳送的數據Object': 999 });
</script>
但他完全沒有考慮可能會發生的問題:
- https://connect.facebook.net/en_US/fbevents.js 是否已經載入過了。(這個其實官方程式碼已經處理:
if(f.fbq)return;) - Pixel ID 是否已經宣告(init)過了。
- 若存在別的 Pixel ID,這個事件也會影響所有 Pixel ID。
其實不止自訂事件,標準事件也是如此。這種寫法若是處理像 Add to Cart 這樣的標準事件,有三個 Pixel ID 就會觸發三次,等於使用者才剛進入頁面,你收集到的數據就已經 Add to Cart 三次了。
改善之後的寫法
在釐清問題之後,我們的目標就很明確了:避免 fbevents.js 重複載入、避免重複宣告、避免影響別的 Pixel ID。所以我們加上一些判斷式來改善原本的程式碼:
var myPixelID = '1234567890';
if (typeof fbq === 'function' && fbq.getState) {
var pixels = fbq.getState().pixels || [];
var hasInit = pixels.some(function(p) { return p.id === myPixelID; });
if (!hasInit) {
fbq('init', myPixelID);
}
} else {
!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', myPixelID);
}
fbq('trackCustom', '我的自訂事件名稱', {
'回傳數據a': '某個你想要的a數據值' || ''
});
fbq.getState.pixels 這個語法可以叫出網頁中所有的 Pixel ID 與它們的資訊,所以可以用來判斷 fbevents.js 需不需要載入、某個 Pixel ID 有沒有宣告過,非常好用。
然而,只使用判斷式仍然會把事件推送到所有 Pixel ID 之中,所以我們還必需要改用別的語法。
使用trackSingle指定Pixel ID
為了讓觸發的事件不影響別的 Pixel ID,這時就不應該使用 trackCustom,而是使用另一個語法 trackSingle:
fbq('trackSingle', '指定要推送的 Pixel ID', '我的自訂事件', { '額外要傳送的數據Object': 999 });
因此,最終的程式碼要改寫成:
var myPixelID = '1234567890';
if (typeof fbq === 'function' && fbq.getState) {
var pixels = fbq.getState().pixels || [];
var hasInit = pixels.some(function(p) { return p.id === myPixelID; });
if (!hasInit) {
fbq('init', myPixelID);
}
} else {
!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', myPixelID);
}
fbq('trackSingle', myPixelID, '我的自訂事件名稱', {
'回傳數據a': '某個你想要的a數據值' || ''
});
利用 Meta Pixel Helper 可以觀察到,在有三個 Pixel ID 的情況下,事件成功只被推送到指定的 Pixel ID,沒有污染其它兩個 ID。

留言
張貼留言