MetaピクセルとコンバージョンAPI:計測の設定と確かめ方

公開 書いた人 大林 諒

Meta広告で問い合わせを取るには、ホームページで誰が問い合わせたかをMetaに知らせる仕組みが要ります。それがMetaピクセルとコンバージョンAPIです。ピクセルはブラウザから、コンバージョンAPIは自社のサーバーから、同じ問い合わせをMetaに送ります。この記事では、2つの違いと両方入れる理由、重複して数えないための設定、GTMとWordPressでのピクセルの入れ方、コンバージョンAPIの入れ方の選び方、イベントマネージャでの確かめ方、ハッシュ化と同意の扱いまでを、見積り依頼を数える「サンプル住まいサービス」の例で通します。前提として、ホームページにGoogleタグマネージャー(GTM)が入っていて、Meta広告のビジネスポートフォリオと広告アカウントがあるものとします。

この記事の内容
  1. 先に決めること
  2. Metaピクセルとコンバージョン APIの違い
  3. 一覧:送るイベント
  4. ピクセルの入れ方
  5. コンバージョンAPIの入れ方の選び方
  6. イベントマネージャでの確かめ方
  7. 集約イベント測定とドメイン認証
  8. 個人情報と同意の扱い
  9. 応用
  10. できないことと、その代わり
  11. よく詰まるところ
  12. 次にやること

先に決めること

ピクセルを入れる前に、何を数えるかを決めておきます。ここが曖昧なまま入れると、あとで広告の最適化の対象を変えるたびに設定をやり直すことになります。

決めることサンプル住まいサービスの答え理由
1件と数える行動見積り依頼フォームの送信を「Lead」として送る広告セットの成果イベントにする本命
そのほかに送る行動電話番号のタップを「Contact」、LINEの友だち追加ボタンのクリックを「Contact」の別名で送る本命ではないが、件数の傾向を見る
いつ送るかフォームの送信が完了したとき(完了ページの表示か送信成功のイベント)ボタンのクリックで送ると、入力エラーの分まで数える
どこから送るかピクセル(ブラウザ)とコンバージョンAPI(サーバー)の両方ブラウザだけだと取りこぼす
誰が管理するか会社のビジネスポートフォリオがピクセル(データセット)を持つ代理店が持つと、契約が終わったときに計測ごと失う

計測の全体の設計、つまりGoogle広告・LINEヤフー広告 検索広告(旧Yahoo!広告)・Meta広告で同じ問い合わせをどう数え分けるかは「広告のコンバージョン計測の設計:問い合わせ・電話・LINEを媒体ごとに数える」に書きました。この記事はそのうちMetaの部分です。

Metaピクセルとコンバージョン APIの違い

比べるところMetaピクセルコンバージョンAPI
どこから送るか見ている人のブラウザ(JavaScript)自社のサーバーや、つないだサービス
入れ方タグを貼る(GTM・WordPressのプラグイン)パートナー連携・サーバーのGTM・自作
取りこぼし広告ブロック・ブラウザのトラッキング防止・通信の失敗で落ちるブラウザの影響を受けない
送れる情報ブラウザで分かること(ページ・クリック・Cookie)フォームの入力内容(ハッシュ化したメール・電話番号)、成約など後から分かること
手間小さい中〜大。サーバーかつなぐ仕組みが要る

Metaの開発者向け資料では、ピクセルに加えてコンバージョンAPIも入れる「冗長な構成」を勧めています。ピクセルだけだと、ブラウザの設定で落ちた問い合わせをMetaが知らないまま配信を続けることになり、学習に使える件数が減ります。コンバージョンAPIを足すと、落ちた分をサーバーから補えます。

両方から同じ問い合わせを送ると、何もしなければ2件と数えられます。これを防ぐのが重複の除外です。

重複の除き方

Metaは、ピクセルから届いたイベントとコンバージョンAPIから届いたイベントで、次の2つが一致したものを同じ1件とみなします。

  1. イベント名が同じ(ピクセルの Lead と、コンバージョンAPIの event_name の Lead)
  2. イベントIDが同じ(ピクセルの eventID と、コンバージョンAPIの event_id)

開発者向け資料では、同じイベントIDの最初のイベントを受け取ってから48時間以内に届いたものが重複の除外の対象です。ピクセルが先に届き、あとからサーバーのイベントが届く形を前提にしています。ピクセルだけ、またはサーバーだけから同じ内容を何度送っても、重複としては除かれません。

つまり、問い合わせ1件ごとに1つの決まったIDを作り、ピクセルとコンバージョンAPIの両方に同じIDを渡すことが要になります。サンプル住まいサービスでは、フォームの送信時にブラウザでIDを作り、隠し項目に入れてサーバーにも渡しています。

一覧:送るイベント

ピクセルで送るイベントには、Metaが名前を決めている「標準イベント」と、自分で名前を付ける「カスタムイベント」があります。広告の最適化に使うなら、標準イベントを使います。

標準イベント意味サンプル住まいサービスでの使い方
PageViewページの表示ピクセルの基本コードで全ページに自動で送る
ViewContent大事なページの表示3つのLPの表示
Lead見込み客の情報の送信見積り依頼フォームの送信完了。本命
Contact電話・メール・チャットなどでの連絡電話番号のタップ、LINEの友だち追加ボタンのクリック
Schedule予約現地調査の日程予約を受けるなら
CompleteRegistration登録の完了メールマガジンや会員登録がある場合
SubmitApplication申込み採用の応募フォームに使う場合

電話とLINEを両方Contactで送ると見分けがつかなくなるので、パラメータの content_name に tel と line を入れて区別します。広告の成果イベントにするのはLeadだけにし、Contactは傾向を見るのにとどめます。電話のタップは、実際に電話がつながったかまでは分からないからです。

ピクセルの入れ方

ピクセル(データセット)を作る

  1. Meta Business Suiteの「すべてのツール」から「イベントマネージャ」を開く
  2. 左の「データソースをリンク」(または「接続」)を押し、「ウェブ」を選ぶ
  3. 名前を「サンプル住まいサービス_web」のように入れて作る
  4. 作ったデータセット(ピクセル)を、会社の広告アカウントに割り当てる
  5. 表示されたIDを控える。GTMとコンバージョンAPIで使う
イベントマネージャの左のメニューで「データソース」を開き、作ったデータセットのIDが表示されているところ
イベントマネージャの左のメニューで「データソース」を開き、作ったデータセットのIDが表示されているところ

GTMで入れる

GTMでは、ピクセルの基本コードを「カスタムHTML」のタグで全ページに入れ、イベントは別のタグで送ります。

  1. GTMで「タグ」→「新規」を押し、タグの種類で「カスタムHTML」を選ぶ
  2. 次の基本コードを貼る(xxxxxxxx は控えたデータセットのID)
  3. トリガーを「All Pages」(全ページのページビュー)にして保存する
<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', 'xxxxxxxx');
fbq('track', 'PageView');
</script>
  1. 見積り依頼の送信を送るタグを、もう1つ「カスタムHTML」で作る。イベントIDは、フォームの送信時にデータレイヤーへ入れた値をGTMの変数(例: {{DLV - event_id}})で受け取る
<script>
fbq('track', 'Lead', {content_name: 'estimate_form'}, {eventID: '{{DLV - event_id}}'});
</script>
  1. このタグのトリガーを、フォームの送信成功(完了ページの表示、またはフォームのプラグインが出す送信成功のイベント)にする
  2. タグの「詳細設定」で、基本コードのタグが先に動くように「タグの順序付け」を設定する
  3. GTMの「プレビュー」で、完了ページに進んだときに2つのタグが動くことを確かめてから公開する

フォームの送信時にイベントIDを作ってデータレイヤーに入れる部分は、フォームのページに次のように書きます。同じIDをフォームの隠し項目にも入れておくと、サーバー側のコンバージョンAPIにも同じIDを渡せます。

<script>
document.addEventListener('submit', function (e) {
  var id = 'lead-' + Date.now() + '-' + Math.random().toString(36).slice(2, 10);
  var hidden = e.target.querySelector('input[name="event_id"]');
  if (hidden) { hidden.value = id; }
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({ event: 'estimate_submit', event_id: id });
}, true);
</script>
GTMのタグ一覧で、Metaピクセルの基本コードと「Lead」のタグが並び、トリガーがそれぞれ「All Pages」と送信成功になっているところ
GTMのタグ一覧で、Metaピクセルの基本コードと「Lead」のタグが並び、トリガーがそれぞれ「All Pages」と送信成功になっているところ

WordPressで入れる

GTMを使っていないWordPressのサイトでは、Metaのプラグインや、フォームのプラグインのピクセル連携で入れる方法もあります。ただ、GTMとプラグインの両方でピクセルを入れると、PageViewが2回ずつ送られます。サンプル住まいサービスのようにGTMが入っているなら、ピクセルはGTMだけで入れ、WordPress側のピクセルのプラグインは止めます。どこで入っているか分からないときは、ブラウザの拡張機能「Meta Pixel Helper」で、ページを開いたときに同じIDのピクセルが何回動いているかを見ます。

コンバージョンAPIの入れ方の選び方

コンバージョンAPIの入れ方は、大きく3つです。

入れ方中身手間と費用向く会社
パートナー連携イベントマネージャの「パートナー連携」から、使っているサービス(WordPress・Shopify・GTMなど)を選んで画面の手順でつなぐ小さい。追加の費用はサービスによるまず試したい。サイトが対応サービスで作られている
サーバーのGTM・Conversions API Gatewayサーバー用のGTMのコンテナか、Metaの「Conversions API Gateway」をクラウドで動かし、ブラウザのイベントをサーバーから送り直す中。動かすクラウドの利用料が別に掛かるGTMを使い慣れていて、複数の媒体をサーバーから送りたい
自作(API直接)フォームの送信を受け取ったサーバーやn8nから、MetaのAPIにイベントを送る中〜大。作る人が要るフォームの中身(メール・電話番号)を送りたい。kintoneの成約も送りたい

小さな会社なら、まずパートナー連携で入れられるかを見ます。サンプル住まいサービスは、見積り依頼フォームの送信をn8nで受けてkintoneに入れているので、同じn8nのワークフローからコンバージョンAPIに送る自作の形にしました。フォームの入力内容をハッシュ化して送れるので、Metaが送り主のアカウントと照合しやすくなります。

イベントマネージャのデータセットの「設定」で、「コンバージョンAPI」の「パートナー連携」と「手動で設定」が並んでいるところ
イベントマネージャのデータセットの「設定」で、「コンバージョンAPI」の「パートナー連携」と「手動で設定」が並んでいるところ

自作で送るときの形

開発者向け資料では、アクセストークンはイベントマネージャのデータセットの「設定」タブ、「コンバージョンAPI」の「手動で設定」にある「アクセストークンを生成」から作ります。このリンクは、ビジネスの開発者の権限がある人にしか表示されません。トークンは1Passwordなどに保管し、n8nの認証情報に入れて使います。

送り先と中身は次の形です。xxxxxxxx はデータセットのIDとトークンで、em(メール)と ph(電話番号)は正規化してからSHA256でハッシュ化した値を入れます。

POST https://graph.facebook.com/v26.0/xxxxxxxx/events?access_token=xxxxxxxx
Content-Type: application/json

{
  "data": [
    {
      "event_name": "Lead",
      "event_time": 1793500000,
      "event_id": "lead-1793500000000-ab12cd34",
      "action_source": "website",
      "event_source_url": "https://sample-sumai.example/lp/bath/",
      "user_data": {
        "em": ["(メールアドレスを正規化してSHA256にした値)"],
        "ph": ["(電話番号を正規化してSHA256にした値)"],
        "client_ip_address": "203.0.113.10",
        "client_user_agent": "Mozilla/5.0 ...",
        "fbp": "fb.1.1793400000000.1234567890",
        "fbc": "fb.1.1793400000000.xxxxxxxx"
      },
      "custom_data": {
        "content_name": "estimate_form"
      }
    }
  ]
}

決まりで気をつけるところは次のとおりです。

項目決まり(開発者向け資料)よくある間違い
event_idピクセルの eventID と同じ値サーバーで別のIDを作ってしまい、2件と数えられる
event_time発生した時刻のUNIX秒。送る時点から最大7日前まで7日より古いものが1件でも混ざると、まとめて送った全部がエラーになる
1回に送れる件数data に最大1,000件夜にまとめて送る。発生したらすぐ、できれば1時間以内に送るのが推奨
em・ph正規化してSHA256でハッシュ化する電話番号を 090-1234-5678 のままハッシュ化する
client_ip_address・client_user_agent・fbp・fbcハッシュ化しない全部ハッシュ化してしまい、照合に使えなくなる
action_sourceホームページでの行動なら website正しく入れることに同意する項目なので、実態と違う値を入れない

電話番号は、記号と先頭の0を取り、国番号を付けてからハッシュ化します。開発者向け資料には日本の例はありませんが、決まりに沿えば 090-1234-5678 は 819012345678 にしてからハッシュ化します。メールアドレスは前後の空白を取り、すべて小文字にしてからハッシュ化します。fbp と fbc は、ブラウザのCookie(_fbp と _fbc)の値で、フォームの隠し項目に入れてサーバーに渡します。

イベントマネージャでの確かめ方

入れたら、必ず実際に送って確かめます。管理画面に「有効」と出ているだけでは、重複の除外がうまくいっているかまでは分かりません。

テストイベントで確かめる

  1. イベントマネージャで会社のデータセットを開き、「テストイベント」を開く
  2. ブラウザのイベントを確かめるなら、ホームページのURLを入れて開き、見積り依頼のテスト送信をする
  3. 画面に「PageView」「ViewContent」「Lead」が届くかを見る
  4. サーバーのイベントを確かめるなら、「テストイベント」の画面に表示されるテストコードを控え、コンバージョンAPIのリクエストに "test_event_code": "TESTxxxxx" を足して送る
  5. 同じ見積り依頼で、ブラウザとサーバーの両方の「Lead」が届き、「重複を除外」の表示が出ているかを見る
  6. 確かめ終わったら、本番の送信から test_event_code を外す

開発者向け資料では、テストコードを付けて送ったイベントも捨てられるわけではなく、そのまま届いて広告の測定に使われます。テスト送信は、社内の人だと分かる名前と会社のメールアドレスで行い、kintoneにも「テスト」と分かる形で入れて、成約の集計から外します。

イベントマネージャの「テストイベント」で、ブラウザとサーバーの「Lead」が並び、重複が除外された表示が出ているところ
イベントマネージャの「テストイベント」で、ブラウザとサーバーの「Lead」が並び、重複が除外された表示が出ているところ

概要で確かめる

テストが通ったら、数日たってからデータセットの「概要」で次の3つを見ます。開発者向け資料では、送ってから20分ほどで受信を確かめられるとされています。

見るところ何が分かるか目安
イベントの受信数と接続方法ブラウザとサーバーのどちらから何件届いたかLeadがブラウザとサーバーの両方から届いている
重複の除外(イベントの詳細)重複として除かれた率と、重複除外のキーが入っている率率が低いと警告が出る。IDの渡し方を見直す
イベントマッチ品質サーバーのイベントの顧客情報が、Metaのアカウントとどれだけ照合できるか1〜10の点数。開発者向け資料の目安は6.0以上
イベントマネージャのデータセットの「概要」で、「Lead」の受信数と接続方法、イベントマッチ品質の点数が表示されているところ
イベントマネージャのデータセットの「概要」で、「Lead」の受信数と接続方法、イベントマッチ品質の点数が表示されているところ

イベントマッチ品質が低いときは、メール・電話番号・fbp・fbc・IPアドレス・ユーザーエージェントのうち、送れていないものを足します。点数をクリックすると、何を足せば上がるかが表示されます。

集約イベント測定とドメイン認証

集約イベント測定は、iPhoneでトラッキングを許可しない人のイベントを、Metaがまとめて扱う仕組みです。以前は、ドメインごとに使うイベントを選んで優先順位を付ける設定が求められていました。ウェブ向けの扱いはアカウントによって違うので、イベントマネージャに優先順位を付ける画面が出ているかどうかで、やることが変わります。画面が出ていれば、見積り依頼の「Lead」を一番上にします。出ていなければ、設定は要りません。

ドメイン認証は、ビジネスポートフォリオの「ブランドセーフティ」の「ドメイン」で、自社のホームページのドメインを登録して行います。認証のしかたは、HTMLのメタタグを入れる、HTMLファイルを置く、DNSのTXTレコードを足す、のどれかです。サンプル住まいサービスでは、WordPressの画面を触らずに済むDNSのTXTレコードで認証しました。認証しておくと、自社のドメインの持ち主として示せます。

ビジネスポートフォリオの「ブランドセーフティ」→「ドメイン」で、sample-sumai.example が「認証済み」になっているところ
ビジネスポートフォリオの「ブランドセーフティ」→「ドメイン」で、sample-sumai.example が「認証済み」になっているところ

個人情報と同意の扱い

コンバージョンAPIでメールアドレスや電話番号を送るときは、生の値ではなくハッシュ化した値を送ります。ハッシュ化は元に戻せない形に変える処理で、Metaは同じ方法でハッシュ化した自社のデータと照合します。ハッシュ化していても、個人に結びつく情報を外部に送ることには変わりないので、次のことをしておきます。

  1. プライバシーポリシーに、MetaピクセルとコンバージョンAPIで、閲覧の情報とフォームの入力内容(ハッシュ化したもの)をMetaに送り、広告の配信と効果の測定に使うことを書く
  2. フォームの送信ボタンの近くに、プライバシーポリシーへの案内を置く
  3. Cookieの同意のバナーを使っている場合は、同意しなかった人にピクセルを動かさない。ピクセルには fbq('consent', 'revoke') と fbq('consent', 'grant') で送信を止めたり再開したりする仕組みがある
  4. コンバージョンAPIで送るのは、同意を得ている人の分だけにする。n8nのワークフローで、フォームの同意の項目を見て送るかどうかを分ける

開発者向け資料では、同意の管理などで捨てられたイベントの数も概要に表示されます。同意しなかった人の分が減るのは正しい動きです。

法令で何が求められるかは、個人情報保護委員会の案内と、自社のプライバシーポリシーを作った人に確かめます。ここに書いたのは、運用の現場で最低限揃えている形です。

応用

成約をMetaに戻す

kintoneで成約になった問い合わせを、コンバージョンAPIで別のイベント(たとえばカスタムイベントの Contract)として送ると、Metaは見積り依頼のうち成約した人の傾向を知ることができます。見積り依頼のときと同じメールアドレス・電話番号のハッシュと、external_id(kintoneのレコード番号をハッシュ化したもの)を送ります。ただし、event_time は7日前までしか送れません。現地調査から成約まで2〜3週間かかるなら、成約した日を event_time にして、その日のうちに送ります。

広告の判断はkintoneで

ピクセルとコンバージョンAPIを入れても、広告マネージャの件数とkintoneの件数は一致しません。広告マネージャはアトリビューション設定で決めた日数のあいだの、広告をクリックした人や見た人の行動を広告の成果として数え(日数は広告セットの「アトリビューション設定」で確かめます)、kintoneは問い合わせ日で数えます。運用の現場では、管理画面のコンバージョンは多いのに、kintoneで成約まで追うと受注がほぼゼロの配信先がありました。計測を入れる目的は、広告マネージャの数字を合わせることではなく、Metaに正しい学習の材料を渡すことと、kintoneで判断できるように流入元を残すことです。

できないことと、その代わり

できないこと理由代わりの手
ピクセルだけで全部の問い合わせを数える広告ブロックやブラウザのトラッキング防止で落ちるコンバージョンAPIを足す
7日より前の成約を送るevent_time は最大7日前まで成約した日にすぐ送る仕組みにする
電話がつながったかをピクセルで数えるピクセルが分かるのはタップまで通話の記録をkintoneに入れ、成約と合わせて判断する
広告マネージャの件数とkintoneを一致させる数え方と計上日が違うUTMで流入元を残し、kintoneで判断する
同意しなかった人の分を補う同意しない人の分は送らないのが正しい件数が減ることを前提に、kintoneの成約で判断する
作る人がいない状態で自作するAPIの仕様が変わったときに直せないパートナー連携から始める。作り込みが要るなら代理店や制作会社に頼む

よく詰まるところ

症状原因直し方
Leadが2倍に数えられるピクセルとコンバージョンAPIでイベントIDが違う、または入っていない同じIDを両方に渡す。概要の重複の除外で率を見る
PageViewが2回ずつ届くGTMとWordPressのプラグインの両方でピクセルが入っているMeta Pixel Helperで確かめ、片方を止める
Leadが入力エラーのときも数えられる送信ボタンのクリックでイベントを送っている送信成功(完了ページの表示)で送る
コンバージョンAPIのリクエストが全部エラー7日より古いイベントが混ざっている古いものを除き、発生したらすぐ送る
イベントマッチ品質が低いメール・電話番号・fbp・fbcを送っていない、またはハッシュ化の前の正規化が違う正規化の決まりどおりに直し、送る項目を足す
テストのイベントが成果に入ったtest_event_code を付けたまま本番で送っている本番の送信から外す。テストのレコードはkintoneの集計から外す
「アクセストークンを生成」が出ない開発者の権限がないビジネスポートフォリオで権限を付けてもらう
広告セットの成果イベントにLeadが出ない広告アカウントにデータセットが割り当てられていない、またはLeadが届いていない割り当てを確かめ、テストイベントで届くかを見る
代理店が辞めたら計測が止まったピクセルを代理店のビジネスポートフォリオで作っていた会社のビジネスポートフォリオで作り直し、代理店にはパートナーとして共有する

次にやること

計測が整ったら、Google広告の計測と揃えて、広告の判断に使います。

あわせて読む