問い合わせフォームの送信は、小さな会社のサイトでいちばん大事な数字です。ところが「GA4を入れたのに申込件数が合わない」「広告の管理画面と数が違う」という相談の多くは、フォームの数え方が作りに合っていないことが原因です。この記事では、Googleタグマネージャー(GTM)でフォーム送信をGoogleアナリティクス4(GA4)に送る方法を、フォームの作りごとに分けて書きます。読み終わると、自分の会社のフォームがどの型か見分けて、GTMのトリガーを選び、GA4でキーイベント(旧コンバージョン)として数えるところまでできます。GTMのコンテナがサイトに入っていて、GA4のGoogleタグが動いていることを前提にします。
例は、スタッフ6名ほどの予約制の料理教室「サンプル料理教室」のサイト sample-cooking.example(WordPress)です。体験レッスン申込フォームはWordPressのプラグインで作られていて、送信が終わるとサンクスページ /thanks/ に移ります。月謝の決済と通常レッスンの予約は外部の予約システム reserve.example です。
先に決めること
「1件」をどこで数えるか
フォームの計測で最初に決めるのは、どの瞬間を1件とするかです。送信ボタンが押された瞬間と、送信が成功して教室にメールが届いた瞬間は別物です。入力漏れのまま押されたボタンや、迷惑メール判定で弾かれた送信まで数えると、GA4の件数は実際の申込より多くなります。数えるのは「送信が成功した瞬間」に決めます。この記事の方法はすべて、この基準で選んでいます。
フォームの作りを見分ける
次に、自分の会社のフォームがどの作りかを確かめます。見分け方は簡単で、実際に1回送信してみてブラウザのアドレス欄を見ます。
- 送信後にURLが変わり、/thanks/ のような完了ページが出る → サンクスページ型
- URLが変わらず、同じページに「送信しました」の文字が出る → 同じページで完了表示する型
- フォームの部分だけ別のサービス(Googleフォーム・予約システム)の画面が埋め込まれている → 埋め込み型
確認画面があるフォームは、入力→確認→完了の3画面のうち、完了画面のURLが変わるかどうかで見分けます。
イベント名とパラメータを先に決める
GA4に送るイベント名は、フォームの数え方を変えても同じ名前を使います。サンクスページ型から送信イベント型に切り替えたときに名前が変わると、月をまたいだ比較ができなくなるからです。サンプル料理教室では、GA4の推奨イベントにある generate_lead(見込み客の獲得を表すイベント)を使い、どのフォームかを form_name というパラメータで分けます。体験レッスン申込は trial_lesson、ほかに問い合わせフォームを足すなら contact にします。
拡張計測機能の「フォームの操作」をどう扱うか
GA4には、データストリームの拡張計測機能に「フォームの操作」があり、オンにするとGTMを触らなくても form_start と form_submit が自動で送られます。手軽ですが、実際に運用していると、ブログの検索窓やメルマガ登録欄の送信まで同じ form_submit で入り、送信が成功したかどうかも区別できません。申込の件数はこの記事の方法で別に数え、form_submit はキーイベントにしません。「入力を始めた人のうち何人が送信したか」をざっくり見る用途なら、オンのままでかまいません。
フォームの作りごとの数え方
| フォームの作り | 送信後の見え方 | 数え方 | GTMのトリガー | 確実さ |
|---|---|---|---|---|
| 送信後にサンクスページへ移る | URLが /thanks/ に変わる | サンクスページの表示を数える | ページビュー(ページパスが一致) | 高い。二重計上の対策は要る |
| 同じページで完了表示(制作会社が手を入れられる) | URLは変わらず完了の文字が出る | 送信成功時に dataLayer.push してもらう | カスタム イベント | いちばん高い |
| 同じページで完了表示(Contact Form 7) | 同上 | プラグインの送信完了イベントを拾う | カスタムHTML+カスタム イベント | 高い |
| 同じページで完了表示(手を入れられない) | 同上 | 完了の文字が出たことを拾う | 要素の表示 | 中くらい。サイトの改修で壊れやすい |
| 普通のHTMLフォームで画面が切り替わる | ページが読み込み直される | 送信の瞬間を拾う | フォームの送信 | 低い。送信エラーも数える |
| Googleフォームを埋め込み | 枠の中だけ完了表示 | GTMでは数えられない | なし | 代わりの手が要る |
| 外部の予約システムを埋め込み・リンク | 別ドメインの画面 | 予約システム側の計測か、移動のクリック | クリック、またはクロスドメイン | 予約システムしだい |
迷ったときの順番は、サンクスページがあればサンクスページ型、なければ dataLayer.push、それもできなければプラグインのイベント、最後に要素の表示です。GTMの「フォームの送信」トリガーは、名前から最初に選ばれがちですが、順位は低くなります。理由は後で書きます。
手順
サンクスページ型:ページパスで数える
サンプル料理教室の体験レッスン申込は、送信が成功すると /thanks/ に移ります。このときは、サンクスページが表示されたことをそのまま申込1件として数えます。
- GTMの「ワークスペース」で「トリガー」を開き、「新規」をクリックします。
- 「トリガーの設定」をクリックし、トリガーのタイプで「ページビュー」を選びます。
- 「このトリガーの発生場所」で「一部のページビュー」を選びます。
- 条件を
Page Path等しい/thanks/にします。 - トリガー名を「PV – サンクスページ」にして保存します。

続けて、このトリガーで動くGA4のイベントタグを作ります。
- 「タグ」を開き、「新規」をクリックします。
- 「タグの設定」で「Google アナリティクス: GA4 イベント」を選びます。
- 「測定 ID」に
G-XXXXXXXXXXを入れます。 - 「イベント名」に
generate_leadを入れます。 - 「イベント パラメータ」に、パラメータ名
form_name、値trial_lessonを足します。 - 「トリガー」で「PV – サンクスページ」を選び、タグ名を「GA4 – 申込完了 – 体験レッスン」にして保存します。

条件を「含む」にすると、ブログに /thanks/ を含む記事(「thanks-party」など)ができたときに誤って数えます。サンクスページのURLが決まっているなら「等しい」で書きます。WordPressでは末尾のスラッシュの有無でパスが変わることがあるので、プレビューで実際の Page Path の値を見てから決めます。
同じことはGTMを使わずGA4の管理画面だけでもできます。「管理」→「データの表示」→「イベント」で「+ イベントを作成」を押し、最初に開くキーイベント作成の画面から、既存のイベントと条件で新しいイベントを作る画面へ進みます。そこで page_view のうち page_location に /thanks/ を含むものから generate_lead を作る方法です。ただしGA4側で作ったイベントは作成後のデータにしか効かず、反映まで1時間以上かかります。GTMで送る方法と両方作ると二重に数えるので、どちらか一方にします。GTMの中を触れるなら、条件をあとから直しやすいGTM側にまとめるほうが管理が楽です。
送信イベント型①:GTMの「フォームの送信」トリガー
URLが変わらないフォームで最初に試したくなるのが、GTMの「フォームの送信」トリガーです。設定は次のとおりです。
- 「トリガー」→「新規」→「トリガーの設定」で「フォームの送信」を選びます。
- 「タグの配信を待つ」と「妥当性をチェック」の2つのチェックが出ます。
- 「このトリガーの発生場所」で「一部のフォーム」を選び、
Page Path等しい/lesson/trial/のように、フォームがあるページに絞ります。 - 組み込み変数の
Form IDやForm Classesを使って、どのフォームかをさらに絞ります。

「タグの配信を待つ」は、GA4のタグが送り終わるまで(または指定した待ち時間が過ぎるまで)フォームの送信を遅らせる設定です。オフにすると、次のページの読み込みが先に始まってタグが間に合わないことがあります。「妥当性をチェック」は、フォームが正しく送信された場合だけ動かす設定で、オフにすると送信を試みただけで動きます。
このトリガーが効くのは、ブラウザの標準の送信(<form> の submit)でページが切り替わるフォームです。最近のフォームの多くは、送信ボタンを押すとJavaScriptが標準の送信を止め、裏でサーバーにデータを送り、同じページに完了の文字を出します。この作りだと、次のどれかが起きます。
- 標準の送信が止められているので、「妥当性をチェック」をオンにするとトリガーがまったく動かない
- 「妥当性をチェック」をオフにすると、ボタンを押した瞬間に動くので、入力エラーで弾かれた送信も1件になる
- そもそも
<form>要素を使っておらず、ボタンとJavaScriptだけで送っているので何も拾えない
さらに、ここで言う「正しく送信された」はブラウザの側の話です。サーバー側でメール送信に失敗した、迷惑メールとして弾いた、といった結果はGTMには見えません。公式のヘルプでも、フォームの標準の動作が書き換えられているときはカスタム イベント トリガーを使うよう案内しています。「フォームの送信」トリガーは、昔ながらの作りのフォームで、ほかに手がないときの最後の手段と考えます。
送信イベント型②:dataLayer.push で送信を知らせてもらう
同じページで完了表示するフォームでいちばん確実なのは、フォームを作った側に「送信が成功したら、この1行を実行してください」と頼む方法です。フォームのプログラムは、送信が成功したかどうかを自分で知っています。その瞬間にGTMへ合図を出してもらえば、入力エラー・送信エラー・迷惑メール判定をすべて除いた件数になります。合図の受け渡しに使うのがデータレイヤー(dataLayer)です。
制作会社に頼む文面の例です。そのまま送れる形にしてあります。
件名:体験レッスン申込フォームの送信完了時に、GTM向けのコードを1つ追加してほしい
sample-cooking.example の体験レッスン申込フォームについて、
送信が成功した時点(教室宛てのメール送信まで成功した時点)で、
次のコードを1回だけ実行するようにしていただけますか。
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'trial_form_complete',
form_name: 'trial_lesson'
});
・入力エラー、送信エラー、迷惑メール判定のときは実行しないでください
・名前、メールアドレス、電話番号など入力内容は dataLayer に入れないでください
・ページに入っているGTMのコード(GTM-XXXXXXX)はそのまま残してください
・反映前にテスト環境のURLがあれば教えてください。GTMのプレビューで確認します
dataLayer は大文字・小文字を区別するので、datalayer.push と書くと動きません。window.dataLayer = window.dataLayer || []; の1行は、すでに dataLayer があれば残し、なければ作る書き方で、GTMのコードより前でも後でも壊れません。
制作会社の改修が終わったら、GTM側を作ります。
- 「変数」→「ユーザー定義変数」の「新規」で、変数のタイプ「データレイヤーの変数」を選び、データレイヤーの変数名に
form_nameを入れて「DLV – form_name」の名前で保存します。 - 「トリガー」→「新規」で「カスタム イベント」を選び、イベント名に
trial_form_completeを入れて「CE – 申込完了」の名前で保存します。 - GA4 イベントタグを新規作成し、イベント名
generate_lead、パラメータform_nameの値に{{DLV - form_name}}を入れ、トリガーに「CE – 申込完了」を選びます。

カスタム イベントのイベント名は正規表現でも書けますが、.* のように広く書くと、GTMやGoogleタグが自動で出すイベントすべてで動いてしまいます。イベント名は正規表現を使わず、そのまま書くのが安全です。
申込フォームが2つ以上あるなら、イベント名は trial_form_complete のまま共通にして、form_name だけ変えてもらいます。トリガーとタグを増やさずに済み、GA4ではパラメータでフォームを分けて見られます。
WordPressのフォームプラグインでの数え方
WordPressのサイトは、フォームをプラグインで作っていることがほとんどです。プラグインによって、送信の合図の出し方や完了画面の作りが違います。
| プラグイン | 完了の見え方 | 数え方 |
|---|---|---|
| Contact Form 7 | 既定は同じページに完了の文字 | 送信完了のDOMイベント wpcf7mailsent を拾う。サンクスページへ移る設定がされていればページパスで数える |
| WPForms | 確認の種類を「Message」「Show Page」「Go to URL (Redirect)」から選べる。既定は「Message」 | 「Show Page」か「Go to URL (Redirect)」にしてサンクスページ型で数えるのが簡単 |
| MW WP Form | 入力・確認・完了を同じURLでも別URLでも作れる | 完了画面を別URLにしてもらい、サンクスページ型で数える |
Contact Form 7は、送信の結果ごとにブラウザ上でイベントを出します。メール送信まで成功したときが wpcf7mailsent、入力エラーが wpcf7invalid、迷惑メール判定が wpcf7spam、メール送信の失敗が wpcf7mailfailed、結果にかかわらず送信の処理が終わったときが wpcf7submit です。数えるのは wpcf7mailsent だけです。wpcf7submit を使うと、入力エラーも1件になります。
GTMで拾うには、カスタムHTMLタグでこのイベントを待ち受け、届いたら dataLayer.push に置き換えます。
<script>
document.addEventListener('wpcf7mailsent', function (event) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'trial_form_complete',
form_name: 'trial_lesson',
cf7_form_id: event.detail.contactFormId
});
}, false);
</script>
- 「タグ」→「新規」→「タグの設定」で「カスタム HTML」を選び、上のコードを貼ります。
- トリガーは、フォームがあるページの「DOM Ready」にします(
Page Path等しい/lesson/trial/)。 - あとは「送信イベント型②」と同じカスタム イベント トリガーとGA4 イベントタグを使います。

フォームが複数あるときは、event.detail.contactFormId でフォームごとのIDが取れるので、そのIDを見て form_name を書き分けます。注意点が2つあります。1つは、これらのイベントはContact Form 7が裏で送信する(Ajax)ときだけ出ることです。テーマやほかのプラグインの影響でAjaxでの送信が止まっていると、どのイベントも出ません。もう1つは、昔の書き方の on_sent_ok はContact Form 7 5.0で廃止されていることです。制作会社が古い記事を見て設定していると、サンクスページへの移動も計測も動いていないことがあります。
MW WP Formは、WordPress.orgのプラグインページで「必要最低限のメンテナンスリリースのみ」と案内されていて、最新のWordPressでのテストもされていません(2026年10月時点)。いま使っているなら計測はサンクスページ型で問題ありませんが、新しく作るフォームには選ばないほうが無難です。
サンプル料理教室の設定
サンプル料理教室のフォームはContact Form 7で作られていて、制作会社が wpcf7mailsent を待ち受けて /thanks/ へ移るコードを入れています。この場合、wpcf7mailsent を拾う方法とサンクスページを数える方法のどちらでも数えられますが、両方入れると1回の申込が2件になります。サンプル料理教室では、サンクスページ型を選びました。サンクスページに移る処理と計測のタグが同じ瞬間に動くと、ページの移動が先に始まってタグが送り切れないことがあり、移動したあとのページで数えるほうが取りこぼしが少ないからです。
サンプル料理教室のGTMに置くものは次の3つです。
| 種類 | 名前 | 中身 |
|---|---|---|
| トリガー | PV – サンクスページ | ページビュー、Page Path 等しい /thanks/ |
| タグ | GA4 – 申込完了 – 体験レッスン | GA4 イベント、generate_lead、form_name = trial_lesson |
| GA4の設定 | キーイベント | generate_lead をキーイベントとしてマーク |
プレビューで確かめてから公開する
- GTMの「ワークスペース」右上の「プレビュー」をクリックし、Tag Assistant で sample-cooking.example に接続します。
- 体験レッスン申込フォームに、テスト用と分かる名前とメールアドレスを入れて送信します。
- Tag Assistant の左の一覧で /thanks/ の読み込みを選び、「GA4 – 申込完了 – 体験レッスン」が「Tags Fired」に入っていることを確かめます。
- GA4の「管理」→「データの表示」→「DebugView」で、
generate_leadがform_name付きで届いていることを確かめます。 - 問題がなければ、GTMのワークスペース右上の「公開」をクリックし、送信設定で「バージョンの公開と作成」を選んで公開します。


テストの送信は教室の受付にもメールで届きます。受付に「件名に『テスト』と入ったものは計測の確認です」と先に伝えておくと、受付が折り返しの電話をかけずに済みます。
GA4でキーイベントにする
- GA4の「管理」→「データの表示」→「イベント」を開きます。
- 「最近のイベント」タブで
generate_leadが一覧に出たら、イベント名の横のスターを選びます。スターが付いたイベントがキーイベントになります。

イベントが一覧に出るのは、実際に1回届いてからです。テスト送信の直後は出ていないことがあります。キーイベントの細かい設定は「キーイベントの設定:問い合わせ完了をGA4で数える」に書いています。
応用
フォームごとに分けて見る
form_name をGA4のレポートで見るには、カスタムディメンションとして登録します。「管理」→「データの表示」→「カスタム定義」で、イベントスコープのディメンションとして form_name を登録すると、探索レポートで体験レッスン申込と問い合わせを分けて数えられます。登録した日より前のデータには付かないので、計測を始めた日に一緒に登録しておきます。
同じページで完了表示し、制作会社にも頼めないとき
制作会社と契約が切れていて、フォームのプログラムに手を入れられないこともあります。そのときは、GTMの「要素の表示」トリガーで、完了の文字が画面に出たことを拾います。
- ブラウザで1回送信し、完了の文字の部分を右クリック→「検証」で、その部分の
idかclassを調べます。 - 「トリガー」→「新規」で「要素の表示」を選び、選択方法を「ID」か「CSS セレクタ」にして、調べた値を入れます。
- 「このトリガーを発動するタイミング」は「1 ページにつき 1 度」にします。
- 完了の文字が送信後に足される作りなら、「DOM の変化をモニタリング」にチェックを入れます。
この方法は、完了の文字の部分がエラーの文字と同じ枠で、中身だけ入れ替わる作りだと、エラーでも動いてしまいます。完了のときだけ出る id や class があるかを確かめてから使います。サイトのデザインを直したときに class 名が変わると、何も言われずに数えられなくなるのもこの方法の弱点です。月に1回、GA4の件数と受付が受けた申込の件数を突き合わせます。
広告の成果として使う
generate_lead をキーイベントにしたら、Google広告のコンバージョンとして読み込めます。GA4のキーイベントを元にGoogle広告のコンバージョンを取り込めるので、広告用に別のタグを用意しなくて済みます。ただしアトリビューションの考え方が違うため、GA4とGoogle広告の件数はぴったりとは合わないのがふつうです。手順は「GA4とGoogle広告を連携する:問い合わせを広告のコンバージョンにする」に書いています。Meta広告のピクセルにも同じ瞬間を送りたいときは、ここで作ったトリガーをMeta広告のタグにも付けます。トリガーを共通にしておくと、GA4と広告で「1件」の定義がずれません。
外部の予約システムに移るフォーム
サンプル料理教室の通常レッスンの予約は reserve.example で完了します。予約システムの完了画面にGTMやGoogleタグを入れられるなら、クロスドメイン計測をしたうえで、予約システム側の完了画面を数えます。入れられないなら、サイトから reserve.example へ移るリンクのクリックを数え、実際の予約件数は予約システムの管理画面で見ます。詳しくは「クロスドメイン計測:予約システムや決済ページへ移るサイト」と「GTMでボタンのクリックを計測する:電話・LINE追加・資料請求」に書いています。
できないことと、その代わり
埋め込みのGoogleフォームは数えられない
Googleフォームをサイトに埋め込むと、フォームの部分は docs.google.com の画面が枠(iframeという仕組み。ヘルプには「HTML を埋め込む」とだけあります)の中に表示されます。サイトに入れたGTMが見られるのは sample-cooking.example のページだけで、枠の中の別ドメインの画面で何が押されたかは分かりません。Googleフォームの側にも、自分のGTMやGoogleタグを入れる欄はありません。そのため、埋め込みのGoogleフォームの送信は、GTMでもGA4でも数えられません。
代わりの手は次のとおりです。
| 代わりの手 | できること | 弱いところ |
|---|---|---|
| WordPressのフォームに作り替える | この記事の方法でそのまま数えられる | 作り替えの手間。制作会社に頼むなら費用 |
| フォームのあるページの表示数と、Googleフォームの回答数を並べる | 入口の数と送信の数が月単位で分かる | どの広告・検索から来た人が送ったかは分からない |
| Googleフォームの確認メッセージに /thanks/ へのリンクを書く | リンクを押した人だけは数えられる | 押さない人が多く、実際より少なく出る |
| Apps Script と Measurement Protocol でGA4に送る | 送信の件数はGA4に入る | 誰がどの流入から来たかが結び付かない。作る手間が大きい |
体験レッスンの申込のように、広告やブログからの成果を知りたいフォームなら、WordPressのフォームに作り替えるのがいちばんの近道です。アンケートのように流入元が要らないフォームなら、Googleフォームの回答数で足ります。Measurement Protocol は、GoogleタグやGTMによる計測を補うための仕組みで、置き換えるものではありません。サイトに来た人のブラウザと結び付ける情報がないまま送ると、件数は入っても「どこから来たか」が分からず、この記事の目的には合いません。
そのほかのできないこと
- GTMは、送信されたあとにサーバーでメールが届いたかは分かりません。メールの不達まで含めた正確な件数は、フォームの管理画面や受信したメールの件数で見ます。
- 送信した人の名前やメールアドレスをGA4に入れて、誰が申し込んだかを見ることはできません。GA4に個人を特定できる情報を送ってはいけない決まりがあるためです。誰がどこから来たかを1件ずつ見たいなら、フォームの隠し項目に流入元を入れて申込メールに載せる、顧客管理の仕組みで管理する、といった別の道を選びます。
- GA4の件数と受付の手元の件数は、完全には一致しません。広告ブロッカーやCookieの同意の状況で計測されない人がいるからです。差が1〜2割を超えるときは、この記事の「よく詰まるところ」を順に見ます。
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| サンクスページを再読み込みすると件数が増える | ページビューのたびに数えている。キーイベントのカウント方法が「イベントごとに 1 回」 | 再読み込み・戻るボタンで増える分は避けられない。気になるならキーイベントのカウント方法を「セッションごとに 1 回」にする。変更前のデータは変わらない |
| フォームを通らずにサンクスページに来た人も数えている | /thanks/ が検索結果に出ている、ブックマークされている | 制作会社にサンクスページを検索結果に出さない設定(noindex)を頼む。トリガーに Referrer が申込フォームのURLを含む条件を足す |
| 確認画面があるフォームで、確認画面で数えてしまう | 確認画面と完了画面が同じURL、または確認画面のURLを条件にしている | 完了画面だけのURLを条件にする。同じURLなら完了画面だけ別URLにしてもらうか、dataLayer.push を頼む |
| 入力エラーで弾かれた送信まで数えている | 「フォームの送信」トリガーを「妥当性をチェック」なしで使っている。Contact Form 7で wpcf7submit を使っている | 送信完了の合図(dataLayer.push、wpcf7mailsent、サンクスページ)で数える |
| 「フォームの送信」トリガーが1回も動かない | フォームがJavaScriptで送信していて、標準の送信が止められている | カスタム イベント トリガーに切り替え、制作会社に dataLayer.push を頼む |
| 1回の申込が2件になる | サンクスページ型と送信イベント型を両方入れている。GA4の「イベントを作成」とGTMの両方で作っている | 数え方を1つに決め、もう一方のタグかGA4のイベント作成を消す |
| Contact Form 7のイベントを拾えない | Ajaxでの送信が止まっている。待ち受けのタグがフォームのページで動いていない | プレビューで待ち受けのタグが動いているかを見る。止まっていれば制作会社にAjax送信を確かめてもらう |
| サンクスページに移るフォームで、GA4に届かないことがある | 送信の瞬間に送るタグが、ページの移動に間に合っていない | サンクスページ側で数える。どうしても送信の瞬間に送るなら「タグの配信を待つ」をオンにする |
| 自分たちのテスト送信が件数に入る | 教室や自宅からのアクセスを除外していない | 内部トラフィックの除外を設定する。テストはプレビューとDebugViewで行う |
拡張計測の form_submit と件数が合わない | form_submit は検索窓などほかのフォームや送信の失敗も含む | 申込の件数は generate_lead で見る。form_submit はキーイベントにしない |
| GTMで公開したのにGA4に何も出ない | GTMのワークスペースで保存しただけで公開していない | ワークスペース右上の「公開」から「バージョンの公開と作成」まで進める |

次にやること
フォームの件数が取れたら、GA4でキーイベントとして数える設定と、フォーム以外の申込の入口を足します。
- キーイベントの設定:問い合わせ完了をGA4で数える
- GTMでボタンのクリックを計測する:電話・LINE追加・資料請求
- GTMのトリガーと変数:組み込み変数とデータレイヤーの使い分け
- クロスドメイン計測:予約システムや決済ページへ移るサイト