Facebook Pixelを複数設置したときの競合を解決する新機能がリリース
Facebook 広告を配信する場合、国内では「タグ」と呼ばれることも多いが、Facebook Pixel のインストールがマストとなる。特に日本では複数代理店が Facebook 広告を走らせていて、代理店ごとに Facebook Pixel をインストールするという事例が結構多かった。
パラメータも含めて完全に同一のイベントが送られている場合や不要なイベントが送られている場合はまだいいのだが、例えば
- ダイナミック広告でそれぞれ ID が違う
- 一方はスタティック広告で
Purchase
イベントのみを送信、もう一方はダイナミック広告でPurchase
イベントを商品 ID などとともに送信
といった場合に競合が発生していた。
Table of Contents
何が問題か
Facebook Pixel はこういった JavaScript コードになっている。
<!-- 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"); fbq('track', "ViewContent", { content_ids: [ '1234567890' ], content_type: 'product', value: 1200, currency: 'JPY' }); </script> <!-- End Facebook Pixel Code -->
fbq()
はイベントを送信するためのキューにイベントを詰める関数で、この関数で詰められたイベントが順次 Facebook に送信される。
複数代理店の Facebook Pixel が設置されている場合、当然これらは複数設置されることになるが、キューはグローバルに1つしかない。なので、
fbq('init', '<FB_PIXEL_ID>');
で新しい Pixel ID を初期化すると、今後詰められるイベントはすべての Facebook ID に対して送信されることになる。
その結果、例えば Pixel ID (A) には Purchase
を、Pixel ID (B) には Lead
を送るように設置した場合、結果的に (A) / (B) 双方に Purchase
と Lead
が送られることとなる。
上の場合はイベントが多めに発火されるだけだが、問題は複数代理店が異なるパラメータで同一のイベントを送信しているときにある。例えば Pixel ID (A) には Purchase
イベントのみを、Pixel ID (B) には商品 ID 込みで Purchase
イベントを送信しているとする。
この場合、(A) / (B) 双方にパラメータがある場合とない場合の 2 パターンで Purchase
が送られることになるが、一方で同一ユーザから短期間に同一のイベントが送られてきた場合、Facebook 側で Facebook Pixel の発火に問題があるとして 1 つに間引かれる。ここが問題で、間引かれるのがパラメータがないイベントであれば問題ないが、パラメータがあるイベントが間引かれた場合は Pixel ID (B) に紐付けられたダイナミック広告でコンバージョンが得られないことになる。
他にも、複数の代理店が複数のダイナミック広告を走らせているが商品 ID のフォーマットが違う場合なども同じで、理論的には媒体計測で上がってくるコンバージョンが半減することになる。
ピクセル共有
これの回答として、Facebook では Pixel ID を複数の広告アカウントで共有するというソリューションを提供してきていた。が、実際問題として代理店はビジネスとして競合しているわけで、国内ではなかなかピクセル共有が進まなかったのが現状だと思う。自分がみている範囲でも、例えばグローバルブランドでグローバルに利用している Pixel ID をリージョナルブランチに共有したり広告主がインハウスで運用している Pixel ID を代理店と共有することはあっても、代理店間で共有することはほとんどなかった。
trackSingle / trackSingleCustom
Facebook 広告周りの開発者向け公式ブログ、Ad News に日本時間 11/29 付けで Accurate Event Tracking with Multiple Pixels with trackSingle and trackSingleCustom という記事が公開されたが、これによれば、上記のような複数の Facebook Pixel ID 間の競合を防ぐソリューションとして新しいキューイベントが追加された。これが trackSingle
および trackSingleCustom
で、これを使うと 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'); fbq('init', '<FB_PIXEL_ID>'); fbq('track', "PageView"); fbq('trackSingle', '<FB_PIXEL_ID>', "ViewContent", { content_ids: [ '1234567890' ], content_type: 'product', value: 1200, currency: 'JPY' }); </script> <!-- End Facebook Pixel Code -->
あまり日本では注目されていないが、この新機能は特に日本において非常に有用だと思う。これにより、他の代理店とコミュニケーションして埋め込まれているすべての Facebook Pixel のコードを trackSingle / trackSingleCustom
に更新してもらう必要はあるものの、ピクセル共有せずに競合の問題を完全にクリアすることができる。
実際にやってみて
この機能、実際に某社で導入してみたが、それまでイベント発火が少なくなっていた問題が解決した。ネイティブアプリにシフトが進んでいる Web サービスの場合はネイティブアプリ側で App Events に対応させないと根本的な解決にはならないものの、Facebook Pixel の設置は広告配信までにつまづくあるあるポイントなので、トラブルを減らす意味でも今後 Facebook Pixel を設置する場合は track
/ trackCustom
ではなく track
/ trackCustom
で書いていった方がいいだろう。
追記
2017/01/25 追記
すべてのピクセルがほぼ同時に移行しなかった場合には移行しなかったピクセルのみ改善して移行したピクセルは改善が見られないため、代理店主導で移行しづらいケースがあることに気づいた。詳細は別記事。