Contact Form 7の送信をGTMでGA4計測する手順|二重計測も防ぐ
この記事の要点
- クリックではなくwpcf7mailsentを起点に計測。コピペ用コードを掲載
- 二重計測の原因は6つ。DebugViewで1送信1回かを確認
- GA4の件数が受信メールより多ければ、重複を疑う
Contact Form 7の送信をGA4で正しく数えるには、送信ボタンのクリックではなく、メールを送れたときにだけ発生する「wpcf7mailsent」というイベントを起点にします。GTMにこのイベントを待ち受けるタグを1つ入れ、GA4には generate_lead というイベント名で送り、キーイベントに登録すれば設定は完了です。二重計測は、この設定とは別の経路(Site Kit、GA4の拡張計測、サンクスページなど)が同じ送信を数えているときに起きます。
WordPressでContact Form 7を使っていて、GA4の問い合わせ件数が0件のまま、または実際より多い方に向けた記事です。読み終わる頃には、コピペ用のコードで設定を済ませ、1回の送信が1件として記録されているかをご自身で確認できる状態を目指します。
GTMにGA4の基本タグ(Googleタグ)をまだ入れていない場合は、先にGA4タグをGTMで設定する手順と公開前チェックを済ませてから進めてください。
Contents / 目次
Contact Form 7の計測はwpcf7mailsentが起点
Contact Form 7の送信は、wpcf7mailsentを合図にして計測するのが正解です。Contact Form 7はAjax送信といって、ページを移動せずに裏側でデータを送ります。そのため、GTMの標準のクリックトリガーやフォーム送信トリガーでは「メールが実際に送れたか」を判定できません。
wpcf7mailsentとは、Contact Form 7が入力内容の検証とメール送信に成功したときに、ページの中で発生させる合図(DOMイベント)のことです。似た名前の合図がほかにもあり、それぞれ次の条件で発生します。各イベントの発生条件と、event.detail.contactFormId でフォームの番号を受け取れることは、Contact Form 7公式のDOMイベント解説に載っています。
- wpcf7invalid:入力内容に不備があり、メールを送らなかったとき
- wpcf7spam:スパムの疑いがあると判定され、メールを送らなかったとき
- wpcf7mailfailed:メールの送信に失敗したとき
結果にかかわらず毎回発生するwpcf7submitを使うと、エラーの回まで数えてしまいます。
計測方法ごとの違いは次のとおりです。
| 計測方法 | 何を数えるか | 入力エラーの回 | 判断 |
|---|---|---|---|
| 送信ボタンのクリック | ボタンが押された回数 | 数える(二度押しも数える) | 使わない |
| GTMのフォーム送信トリガー | ブラウザの送信動作 | メール送信の成否は判定条件に含まれない | 使わない |
| GA4拡張計測のform_submit | ブラウザの送信動作 | メール送信の成否は判定条件に含まれない | キーイベントにしない |
| サンクスページの表示 | 完了ページの表示回数 | 数えない(再読み込み・URL直打ちは数える) | 使えるが併用しない |
| wpcf7mailsent | メール送信に成功した回数 | 数えない | これを使う |
GTMのフォーム送信トリガーとGA4拡張計測のform_submitは、どちらもブラウザ上でフォームが送信されたことを合図にする仕組みです(Googleの公式ヘルプ「フォーム送信トリガー」「拡張計測機能イベント」)。Contact Form 7がメールを送れたかどうかは、判定の材料に入っていません。
検索すると出てくる、on_sent_ok という設定欄に計測コードを書く方法は、Contact Form 7の古い仕組みです。Contact Form 7公式の告知で非推奨とされ、その後のContact Form 7 5.0で削除されました。代わりに使うよう案内されているのが、ここで紹介するDOMイベントです。
設定に使う部品は、次の3つです。
- wpcf7mailsentを待ち受けて、GTMに合図を渡すタグ(カスタムHTML)
- その合図を受け取るトリガー(カスタムイベント)
- GA4へ送るイベントタグと、GA4側のキーイベント登録
設定の作業は5ステップですが、GTMのコンテナに前任者や以前の制作会社が入れたタグが残っていて、どれが動いているか分からない場合は、先にタグの洗い出しが必要です。社内で判断がつかないときは、マーケティング伴走支援「マーケの右腕」で、GA4などの数字を毎月確認し、施策の判断から実施までコレットラボが担当する方法もあります。
この章の結論。計測の起点はwpcf7mailsentの1つに絞ります。クリック・拡張計測・サンクスページをキーイベントにしている場合は、次の手順で入れ替えます。
GTMとGA4の設定手順5ステップ
設定は、GTMで3つ、GA4で1つ、確認を1つの計5ステップです。GTMやGA4のメニュー名は画面の更新で変わることがあるため、見つからないときは各サービスの公式ヘルプで最新の場所を確認してください。
ステップ1。wpcf7mailsentを待ち受けるカスタムHTMLタグを作る
GTMでタグを新規作成し、タグの種類に「カスタムHTML」を選んで、次のコードを貼り付けます。トリガーは「All Pages」(すべてのページビュー)を1つだけ付けます。
<script>
// 前提:GTMのカスタムHTMLタグに貼り付ける。トリガーは「All Pages」1つだけ
// Contact Form 7 のバージョン5系以降を想定(on_sent_ok は使わない)
(function () {
// 同じタグが2回読み込まれても、待ち受けは1つだけにする(二重計測の防止)
if (window.__cf7GtmListener) { return; }
window.__cf7GtmListener = true;
window.dataLayer = window.dataLayer || [];
// メール送信に成功したとき(これをGA4のキーイベントにする)
document.addEventListener('wpcf7mailsent', function (event) {
window.dataLayer.push({
event: 'cf7_mail_sent',
cf7_form_id: event.detail.contactFormId
});
}, false);
// サーバー側でメール送信に失敗したとき(キーイベントにはしない。障害に気づくため)
document.addEventListener('wpcf7mailfailed', function (event) {
window.dataLayer.push({
event: 'cf7_mail_failed',
cf7_form_id: event.detail.contactFormId
});
}, false);
})();
</script>
コードは、GTMで古いブラウザでも動く書き方(ES5)にしてあります。冒頭の2行が、タグの二重読み込みで待ち受けが2つになるのを防ぐ部分です。
ステップ2。データレイヤー変数とカスタムイベントトリガーを作る
GTMの「変数」でユーザー定義変数を新規作成し、種類に「データレイヤーの変数」を選びます。データレイヤーの変数名に cf7_form_id と入力し、変数の名前は「DLV – cf7_form_id」とします。
次に「トリガー」を新規作成し、種類に「カスタムイベント」を選んで、イベント名に cf7_mail_sent と入力します。大文字・小文字やアンダースコアが1文字でも違うと発火しないため、コードからコピーして貼り付けてください。
ステップ3。GA4イベントタグを作る
タグの種類に「Google アナリティクス: GA4 イベント」を選び、次の値を入れます。
| 項目 | 設定値 |
|---|---|
| 測定ID | G-から始まる、GoogleタグとおなじID |
| イベント名 | generate_lead(GA4の推奨イベント名) |
| イベントパラメータ | form_id = {{DLV – cf7_form_id}} |
| トリガー | ステップ2で作ったカスタムイベント cf7_mail_sent |
ステップ4。プレビューとDebugViewで確認して公開する
GTMのプレビューを起動し、GA4の管理画面のDebugViewも開いた状態で、次の順に確認します。
- 必須項目を空にして送信し、cf7_mail_sent が発生せず、GA4のタグも発火しないことを確認する
- 正しく入力して送信し、cf7_mail_sent が1回だけ発生し、GA4イベントタグが1回だけ発火することを確認する
- DebugViewで generate_lead が1回だけ届き、form_id に番号が入っていることを確認する
- 確認が済んだら、GTMのコンテナを「公開」する
コードをAIに書かせる場合は、出力にon_sent_okやクリックトリガーが含まれていないか、待ち受けているイベント名がwpcf7mailsentになっているかを必ず確認してください。古い解説記事を学習したAIは、動かない書き方を返すことがあります。
ステップ5。GA4でキーイベントとカスタムディメンションを登録する
GA4の[管理]→[データの表示]→[イベント]で、generate_lead にキーイベントとしてマークを付けます。まだ一度も届いていないイベントは、[+ イベントを作成]で名前を入れ、[キーイベントとしてマークを付ける]をオンにしておけます。標準レポートに表示されるまでには、最大24時間かかります。手順はGA4の公式ヘルプ「イベントにキーイベントとしてマークを付ける」に載っています。
フォームごとの件数を見たい場合は、カスタム定義からカスタムディメンションを作成し、スコープを「イベント」、パラメータ名を form_id にします。標準レポートにはすぐには反映されないため、設定した当日はDebugViewで確認します。
この章の結論。エラー送信で何も起きず、正しい送信で1回だけ発火すれば設定は完成です。この2つを確かめる前に公開しないでください。
二重計測の原因6つと確認方法
二重計測の多くは、今回の設定とは別の経路が同じ送信を数えていることが原因です。1回の送信でDebugViewに何が届いたかを数えれば、どれが原因かを特定できます。
| 原因 | 起きる条件 | DebugViewでの見え方 | 対処 |
|---|---|---|---|
| GA4タグが2つ入っている | テーマやプラグインでもGA4を設定し、GTMでも設定している | 1回の表示でpage_viewが2回届く | どちらか一方だけ残す |
| 計測プラグインの自動送信 | GA4と連携するWordPressのプラグインでも、フォーム送信の計測を有効にしている | 送信時に、generate_leadとは別名のイベントも届く | プラグイン側の計測を止めるか、キーイベントをどちらか一方にする |
| 拡張計測のform_submit | 拡張計測の「フォームの操作」がオン | 送信時に、generate_leadとは別にform_submitも届く | form_submitをキーイベントにしない |
| サンクスページの表示 | 完了ページのpage_viewもキーイベントにしている | generate_leadと完了ページのpage_viewが両方 | どちらか一方を成果にする |
| 待ち受けの二重登録 | ガードの無いコードに、All PagesとDOM Readyの2つのトリガーが付いている | generate_leadが1回の送信で2回届く | ステップ1のコードを使い、トリガーは1つにする |
| 別の場所にも計測コードがある | テーマのfunctions.phpやフッターにも同じ待ち受けコードがある | generate_leadや別名のイベントが重複 | ページのソースでwpcf7mailsentを検索し、1か所にする |
GA4のキーイベントには、「イベントごとに1回」と「セッションごとに1回」の2つの数え方があります(GA4の公式ヘルプ「キーイベントのカウント方法を変更する」)。現在の数え方の確認と変更の手順は、同じヘルプに載っています。
wpcf7mailsentで数える場合は、「イベントごとに1回」を選びます。同じ人が続けて2回送信した場合は、問い合わせメールも2通届くため、GA4でも2件と数えておくと、次の章で受信メールの件数と比べるときに数字がそろいます。
この章の結論。テスト送信を1回だけ行い、DebugViewに成果として数えるイベントが1つだけ届いているかを見れば、二重計測かどうかを判断できます。
計測できない・件数がずれるときの確認ポイント
設定どおりなのに件数が合わないときは、Contact Form 7固有の3つの条件を確認します。
ショートコードのidとイベントのフォーム番号が一致しない
Contact Form 7のバージョン5.8から、フォームを見分ける仕組みにSHA-1ハッシュが加わり、ショートコードのidに「a1b2c3d」のような英数字が入るようになりました(Contact Form 7公式の告知「Contact Form 7 5.8」)。それまでの投稿番号のidも、引き続き使えます。一方、wpcf7mailsentで届く番号(contactFormId)は、フォームの投稿番号という別の数字です。公式のDOMイベント解説でも、数字の番号で判定する例が載っています。
ショートコードの英数字のidでトリガーの条件を作ると、どのフォームも一致せず0件になります。投稿番号は、管理画面でフォームを編集するときのURLの「post=」の後ろの数字で確認し、その数字を条件に使ってください。
メール送信に失敗した回は数えられない
サーバーのメール設定に問題があると、送信者の画面にはエラーが出て、wpcf7mailsentは発生しません。つまり、問い合わせが届かないうえに、GA4の件数も0のままになります。
ステップ1のコードで記録しているcf7_mail_failedを、GA4に別のイベントとして送っておくと、GA4の件数が急に減ったときに、計測の問題かメールの問題かを切り分けられます。設定は次のとおりです。
- ステップ2と同じ手順でトリガーを新規作成し、種類に「カスタムイベント」を選んで、イベント名に
cf7_mail_failedと入力する - ステップ3と同じ種類のGA4イベントタグを作り、イベント名を cf7_mail_failed、イベントパラメータを form_id = {{DLV – cf7_form_id}} にして、1のトリガーを付ける
- GTMのコンテナを公開する。GA4ではキーイベントに登録しない(成果ではなく、障害に気づくための記録のため)
同意バナーで拒否された回の扱いは同意モードの設定で変わる
Cookieの同意管理ツールを入れていて、訪問者が計測を拒否した場合、GA4へ何が送られるかは同意モードの実装方法で変わります。基本的な実装では、同意が得られるまでGoogleタグがブロックされるため、拒否した訪問者の送信はGA4に届きません。高度な実装では、拒否した場合もCookieを使わない通知(Cookieのないping)が送られ、GA4の行動モデリングやコンバージョンモデリングで欠けたデータが補われることがあります(GA4の公式ヘルプ「ウェブサイトとモバイルアプリの同意モード」)。
同意管理ツールを入れているサイトでは、同意した状態と拒否した状態の両方でテスト送信を行い、同意した状態ではgenerate_leadが届くことを確認してください。
この章の結論。0件ならフォーム番号とメール送信、件数が一部だけ少ないなら同意の設定を先に確認します。
GA4の件数と受信メールの件数の突き合わせ方
設定が正しくても、GA4の件数と実際に届いた問い合わせメールの件数は完全には一致しません。月に1回、両方を並べて差の出方で判断します。
| 比べた結果 | 考えられる理由 | 行うこと |
|---|---|---|
| GA4がメールより少し少ない | 同意の拒否、広告ブロッカー、ブラウザの追跡防止 | 正常。前月と比べて差が急に広がっていないかだけ見る |
| GA4が0件で、メールは届いている | コンテナの公開忘れ、トリガー名の不一致、フォーム番号の誤り | ステップ4の確認をやり直す |
| GA4がメールより多い | 二重計測、または営業メールも問い合わせとして数えている | 前章の6つの原因を順に確認する |
| GA4もメールも急に減った | メール送信の障害、フォームの表示エラー | cf7_mail_failedの件数とフォームの表示を確認する |
差の大きさはサイトを訪れる人の環境で変わるため、何%までなら正常という決まった基準はありません。自社サイトの前月・前年同月との比較で判断します。
突き合わせは、次の順で進めます。
- GA4で前月1か月分のgenerate_leadの件数をform_id別に出す
- 受信メール(またはContact Form 7の送信内容を保存するプラグインFlamingoの記録)から、同じ期間の件数をフォーム別に数える
- 営業メールやテスト送信を除いた件数と比べ、先ほどの表のどれに当たるかを記録する
件数がそろえば、次はどのページから問い合わせにつながったかを見られるようになります。アクセスはあるのに問い合わせが増えない場合の原因の探し方は、アクセスはあるのにCVが増えないときの診断5ステップで解説しています。
この章の結論。GA4が少し少ないのは正常で、多いときだけ重複を疑います。月1回の突き合わせで、計測が壊れたことに早く気づけます。
Contact Form 7のGA4計測でよくある質問
お問い合わせと資料請求のフォームを、GA4で分けて数えられますか?
分けられます。ステップ3でform_idを送っていれば、カスタムディメンションに登録したあと、フォームの投稿番号ごとに件数を出せます。資料請求だけを別の成果にしたい場合は、次の2つをセットで行ってください。
- カスタムイベント cf7_mail_sent のトリガーに「DLV – cf7_form_id が資料請求フォームの投稿番号に等しい」という条件を付けて新しく作り、イベント名を分けたGA4イベントタグをもう1つ作って付けます。
- 元の generate_lead タグのトリガーに「DLV – cf7_form_id が資料請求フォームの投稿番号に等しくない」という条件を付けます。
2つ目を忘れると、資料請求の送信1回で generate_lead と新しいイベントの両方が届き、両方をキーイベントにしている場合は2件と数えられます。
設定後は、資料請求フォームのテスト送信でDebugViewに新しいイベントだけが1回届くことを確認してください。
Contact Form 7の送信後にサンクスページへ移動させる場合、計測はどちらにすればいいですか?
wpcf7mailsentでの計測をおすすめします。サンクスページの表示は、再読み込みやURLの直接入力でも数えてしまうためです。移動は広告の計測や離脱防止のために残し、GA4の成果としてはgenerate_leadだけを登録すると、二重計測を防げます。
GTMのプレビューでは発火するのに、GA4のレポートに件数が出てきません
まずGTMのコンテナを公開したかを確認してください。公開済みでも、標準レポートにはすぐには反映されません。社内のIPアドレスを除外する内部トラフィックのデータフィルタを「有効」にしている場合、社内からのテスト送信は処理の対象から外れ、GA4では確認できません(GA4の公式ヘルプ「データフィルタ」)。社内から確かめるときは、社外の回線(スマートフォンのモバイル通信など)からテスト送信してください。
この設定をGoogle広告のコンバージョン計測にも使えますか?
使えます。方法は2つあります。1つは、GTMでGoogle広告のコンバージョンタグを作り、同じトリガーcf7_mail_sentを付ける方法です(タグマネージャーの公式ヘルプ「Google 広告コンバージョン」)。もう1つは、GA4のキーイベント generate_lead をGoogle広告にインポートする方法です(Google広告の公式ヘルプ「Google 広告で Google アナリティクスのイベントからコンバージョンを作成する」)。同じ送信を両方の方法で計測し、どちらもGoogle広告のコンバージョンとして数える設定にすると、1回の送信が2件と数えられます。使う方法はどちらか1つに決めてください。
まずは今日、自社のフォームで必須項目を空にしたテスト送信と、正しいテスト送信を1回ずつ行い、GA4のDebugViewに何が届くかを確認してください。GA4の見る指標をまだ決めていない場合は、GA4の初期設定と見る指標の絞り方を次に読むと、問い合わせの件数をどう使うかまで決められます。
問い合わせを正しく数えられるようになっても、その数字から次に何をするかを毎月決めるのは簡単ではありません。計測の見直しから施策の実装まで社内だけで進めるのが難しいと感じた方は、マーケティング伴走支援「マーケの右腕」について、まずは現状をお聞かせください。
個別のご相談
サービスの選び方やご依頼について、ご相談いただけます。
相談する