フォーム計測の仕組みをつくる2(Confactform7)

2025.11.21 09:00
2025.10.22 11:01
フォーム計測の仕組みをつくる2(Confactform7)

前回(フォーム計測の仕組みをつくる)で、
フォームの「開始・完了・エラー」を計測できると色々見えてくる、という話を書きました。

今回はそれを WordPressのContact Form 7(CF7)で実際にやってみた 記録です。
結論から言うと、CF7はGTMと相性が抜群でした。
公式でJavaScriptイベントを発火してくれるので、コードを書く量がかなり少ないです。

Contact Form 7 が発火してくれるイベント

CF7はフォームの状態に応じて、以下のイベントを自動で出してくれるようですね。

イベント名タイミング使い道
wpcf7mailsent送信完了時form_submit
wpcf7invalid入力エラーform_error
wpcf7failedサーバー送信失敗form_error

これをGTMが拾えるように、dataLayer.push()を使ってデータを送るだけです。

実際にやった設定

1. 入力開始(form_start)

ここはCF7に専用イベントがないので、
GTMで「要素のフォーカス」トリガーを設定。

セレクタでフォームの最初のフィールドを指定します。

#contact-form input:first-child

イベント名は form_start

これで「フォームを開いて実際に入力を始めた人」がカウントできます。

2. 送信完了(form_submit)

ここがCF7の真骨頂。
以下のようにJavaScriptを1行追加するだけでOKです。

<script>
document.addEventListener('wpcf7mailsent', function(event) {
  dataLayer.push({
    'event': 'form_submit',
    'formId': event.detail.contactFormId
  });
}, false);
</script>

これでフォーム送信が完了すると、
form_submit イベントがGTMに飛び、GA4でも記録されます。

3. エラー発生(form_error)

入力エラー(バリデーションNG)や送信失敗も取れます。
どちらも form_error として扱いました。

<script>
document.addEventListener('wpcf7invalid', function() {
  dataLayer.push({'event': 'form_error'});
}, false);

document.addEventListener('wpcf7failed', function() {
  dataLayer.push({'event': 'form_error'});
}, false);
</script>

GA4での確認

GTMでこれらのイベントを受け取ったら、
GA4の「イベント一覧」に form_start, form_submit, form_error が並びます。

その中で、form_submit を「コンバージョンイベント」に指定。
ファネル探索を使うと、前回と同じように「開始 → 送信 → エラー」の流れを可視化できます。

やってみて気づいたこと

1. 送信成功の検知がめちゃくちゃ安定してる

普通のAjaxフォームだと、「成功メッセージが出た瞬間を監視」みたいにちょっと不安定なんですが、
CF7の wpcf7mailsent は確実に1回だけ発火してくれます。
これだけでも導入する価値あり。

2. エラーが思ったより多かった

wpcf7invalid を入れてみたら、
意外と「電話番号フォーマット」「メールアドレス必須」で止まっている人が多かったです。
確認してみたら、入力補助(プレースホルダや入力例)がなかった…。
こういう発見ができるのが面白い。

3. formIdを入れておくと後々便利

event.detail.contactFormId を一緒に送っておくと、
複数のフォームを使っている場合でも、どのフォームが送られたか識別できます。
後で分析する時に助かります。

まとめ

CF7 × GTM × GA4 の組み合わせは、設定がとてもシンプル。
しかも、公式のイベントが使えるのでミスも少ないです。

入れてみて思ったのは、
「送信された」だけじゃなく「送れなかった人」まで見えるようになった こと。
フォーム改善の方向が見えやすくなりました。

次は、自作フォーム(Laravel)で同じような計測を仕込んでみます。
CF7のようなイベントがない場合、どうやって検知するか?を試してみようと思います。

今回は以上です!