GTMで取得したGA4イベントをSlack通知する方法
- 「コンバージョンが出たか気になって、1日に何度もGA4を開いてしまう」
- 「リアルタイムレポートをつい見張ってしまう」
- 「GA4の権限を渡していないメンバーには、CVが出るたびにチャットで伝えている」
上記のような方は、Googleタグマネージャーで発生したGA4イベントをSlackなどのチャットツールに通知する仕組みを作ると便利かもしれません。
本記事では、Googleタグマネージャーに設定しているコンバージョンイベントが起きた瞬間に、Slackへ通知を飛ばす仕組みの作り方を紹介します。使うのはGTM・Google Apps Script(GAS)・Slackの3つだけ。サーバーの契約も有料ツールもいりません。
初めて取り組む方でも。10〜20分ほどの作業で実装できるはずですので試してみてください。
- GTMに発生したコンバージョンを数秒でSlackに1件ずつ通知するフローの作り方
この記事の著者

Kaoru Yakabi
ボーダーヘイズ・ジャパン代表
/ ウェブ解析士 / Udemy講師
上場企業のインハウスマーケターとして営業リード・採用獲得のWeb戦略に従事したのち独立。「Webマーケティングの民主化」をミッションに、中小企業への計測環境構築やAI活用支援を行う。Udemyでは受講生8,000名超、ベストセラーコース多数。
本記事を実践するための前提条件
この手順を通すには、次の3つが必要です。足りないものがあれば、先に用意してから読み進めてください。
- すでにGTMが導入されているWebサイト:この記事はGTM導入済みが前提です。まだの方は、先にGTMの導入を済ませてください
- 通知を受け取るSlackワークスペース:自分のテスト用チャンネルで構いません
- Googleアカウント:中継役のGoogle Apps Script(GAS)を作るのに使います
今回は、フォーム送信の完了ページ(サンクスページ)で発火するコンバージョンイベントをもとに解説します。同イベントを計測する方法は、以下の記事で詳しく解説しています。まだCVを取れていない方は、先にこちらを済ませておくとスムーズです。
コンバージョン通知が届く仕組み
先に全体像を押さえておくと、手順で迷いません。ここでは「何が、どの順番で動いて、Slackに通知が届くのか」を説明します。
今回作る仕組みは、以下のような流れになっています。

- サイトでコンバージョンが起きる(例:資料請求フォームの送信が完了し、完了ページが表示される)
- GTMがそれを合図に、コンバージョンの情報を中継役へ送る
- GAS(中継役)が情報を受け取り、Slackへ投げる
- Slackに通知が1件届く
なぜGASを挟むのかというと、1つはSlackへ通知を送り込むためのURL(後述するIncoming Webhook)を、ブラウザ側のコードに直接書かずに済ませるためです。このURLは第三者に知られると誰でも通知を送れてしまうので、外から見えないGASの中に隠します。もう1つは、ブラウザから直接Slackへ送ると通信がブロックされやすいためです。これをGASを経由することで防ぎます。
Googleが提供する、JavaScriptに近いプログラムの実行環境です。Googleアカウントさえあれば無料で使え、サーバーを自分で借りる必要がありません。今回は「GTMから届いた情報を受け取ってSlackへ渡すだけ」の短い中継役として使います。プログラミングの経験がなくても、コードはAIに書いてもらうことが可能です。本記事では、丸ごとコピーして貼るだけで動く完成品を配布しています。
なお、GA4のデータを取得するAPIを定期的に叩いて確認する方法もあります。ただ、取得までに時差があり「起きた瞬間」には届きません。定期的にレポートを作るならAPI取得が向いていますが、今回はリアルタイムでCVに気づきたいので、ブラウザ側で発火した瞬間に送るこの方式を選びました。
コンバージョンをSlackに通知する設定手順(7ステップ)
ここからは実装の手順を解説していきます。Slackの受け口を作り、中継役のGASを用意し、GTMから合図を送る、という順番で進めます。SlackとGASの連携をする部分は、初回はやや戸惑いやすいのですが、落ち着いて対応していきましょう。
Slackの「Incoming Webhook」を発行する
Slackに通知を送り込むための「受け口URL」を1本作ります。
- ブラウザでSlackにログインした状態でhttps://api.slack.com/appsにアクセスします。
- 右上の緑のボタン 「Create New App」(新しいアプリを作る、という英語のボタンです)をクリック
- 「From scratch」(ゼロから作る)を選ぶ
- App Name に好きな名前、Workspace に自分のワークスペースを選び、「Create App」ボタンを押す

- 左メニューの 「Incoming Webhooks」 をクリックし、右上のスイッチ 「Activate Incoming Webhooks」 を On にする
- ページ下部の 「Add New Webhook」 をクリックし、通知したいチャンネルを選んで 「許可する(Allow)」
- ページ下の方に表示される「https://hooks.slack.com/services/…」というURLをコピーする

外部から特定のSlackチャンネルへメッセージを投稿するための「受け口URL」です。このURLに向けてメッセージを送ると、そのままチャンネルに投稿されます。
このURLは、パスワードと同じ扱いです。人に見せない、公開する場所に書かない、AIの入力欄にも貼らないでください。次のSTEP 2でGASの中に貼ると、外からは見えなくなります。
「Add New Webhook」を押すと、「◯◯ にはインストールするボットユーザーがありません」 と出て、何度やっても同じ画面に戻される(堂々巡りになる)ことがあります。私もここで一番つまずきました。
原因は、「From scratch(ゼロから)」で作ったアプリには、Slackの中に住む「ボットユーザー」という土台が最初は用意されていない場合があるためです。
対処は、App Manifest(アプリの設計図)で土台を宣言して作ることです。
- 左メニュー下の方の 「App Manifest」 をクリック
- エディタ(JSONタブのままでOK)の中身を全選択して削除し、下をまるごと貼り付ける
{
"display_information": {
"name": "CV通知テスト"
},
"features": {
"bot_user": {
"display_name": "cv-notify-test",
"always_online": false
}
},
"oauth_config": {
"scopes": {
"bot": ["incoming-webhook"]
}
},
"settings": {
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": false
}
}
- 「Save Changes」 をクリック(これでボットユーザーの土台ができます)
- 左メニュー 「Incoming Webhooks」 に戻り 「Add New Webhook」 を押すと、今度はチャンネル選択が出ます。選んで 「許可する」
ボットの表示名「display_name」は、必ず半角英数字にしてください。ここを日本語にしてしまうと保存できません。アプリ名(display_information.name)の方は日本語で構いません。
GAS(中継スクリプト)を作る
Slackの通知先URLを隠して受け渡す「中継役」を、Google Apps Scriptで作ります。
- ブラウザでhttps://script.google.comを開き、「新しいプロジェクト」を作成
- 最初から入っている「function myFunction() {}」を全部消す
- 下のコードをすべてコピーして貼り付ける
// ▼ここだけ書き換える ---------------------------------------------
var SLACK_WEBHOOK_URL = 'ここにSlackのIncoming Webhook URLを貼る';
var SHARED_TOKEN = 'ここに好きなランダム文字列(GTM側と一致させる)';
// ----------------------------------------------------------------
function doPost(e) {
try {
var data = {};
if (e && e.postData && e.postData.contents) {
data = JSON.parse(e.postData.contents);
}
// 簡易的ないたずら防止(合言葉が合わなければ無視)
if (data.token !== SHARED_TOKEN) {
return ContentService.createTextOutput('ng');
}
var formType = data.form_type || '(不明)';
var page = data.page || '';
var ref = data.ref || '';
// 日本時間の「時刻」を作る
var jst = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm');
var lines = [
'*コンバージョン発生*',
'種類: ' + formType,
'ページ: ' + page,
'時刻: ' + jst + '(JST)'
];
if (ref) { lines.push('流入元: ' + ref); }
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ text: lines.join('\n') }),
muteHttpExceptions: true
});
return ContentService.createTextOutput('ok');
} catch (err) {
return ContentService.createTextOutput('error');
}
}
// 動作確認用(エディタ上で実行すると、テスト通知が1本飛ぶ)
function testPing() {
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ text: '中継スクリプトのテスト通知です' }),
muteHttpExceptions: true
});
}
- 冒頭の2箇所を書き換えます
- 「SLACK_WEBHOOK_URL」:STEP 1でコピーしたURLを貼る
- 「SHARED_TOKEN」:好きなランダム文字列にする(パスワード生成ツールなどで作成するのがおすすめ)。この値はあとでGTM側にも同じものを入れますのでメモしておきましょう。
- 上部の保存アイコン(フロッピー)で保存
「SHARED_TOKEN」は、GTMとGASの間だけで通じる「合言葉」です。関係のない第三者がGASのURLを見つけて通知を送りつけても、合言葉が違えばGASが無視します。
動作テスト(testPing)
コードを貼ったら、Slackまで届くか先に確かめます。
- エディタ上部の関数選択プルダウンで「testPing」を選び、「実行」ボタンを押す
- 初回だけ承認画面が出ます。少し戸惑うところなので順番に書きます
・「承認が必要です」から「権限を確認」を押し、自分のGoogleアカウントを選ぶ
・「このアプリはGoogleで確認されていません」 と警告が出たら、左下の 「詳細」 から 「(プロジェクト名)に移動(安全ではないページ)」
・「次の許可を求めています」で 「許可」 - Slackにテスト通知が届けば成功です

「このアプリはGoogleで確認されていません」という警告は、自分で作ったスクリプトなら心配いりません。Googleが、まだ審査していない自作アプリに一律で出している警告です。
テストが届かない場合は、URLの貼り間違いであることがほとんどです。STEP 1のURLを貼り直して保存し、もう一度「testPing」を実行してください。
GASを「ウェブアプリ」としてデプロイする
GTM(ブラウザ)からアクセスできるように、GASの公開URLを発行します。
- 右上の 「デプロイ」 から 「新しいデプロイ」
- 左上の歯車アイコンから 「ウェブアプリ」 を選ぶ
- 設定を次のようにします
・次のユーザーとして実行:自分
・アクセスできるユーザー:全員

- 「デプロイ」 をクリック(もう一度承認を求められたら許可)
- 発行された ウェブアプリURL(https://script.google.com/macros/s/…/exec)をコピーする。次のGTMタグに埋め込みます
「アクセスできるユーザー」を「全員」にしないと、サイトを見ている訪問者のブラウザからGASへ届きません。ここは必ず「全員」にしてください。なお、GASに届くのは合言葉つきの短いデータだけで、スクリプトの中身が誰かに見えるわけではありません。
あとでGASのコードを直したときは、「デプロイ」から「デプロイを管理」、鉛筆マーク、バージョン「新しいバージョン」、デプロイ、の順で更新できます。このときURLは変わりません。
GTMのトリガー(発火条件)を用意する
「コンバージョンが起きた瞬間」を、GTMに教えるためのトリガーを用意します。この記事を読んでいる方の多くは、すでにGA4でCVを計測するためのトリガーを作っているはずなので、そのまま流用してください。次のSTEPのタグを、そのトリガーに紐づけるだけで済みます。
トリガーの作り方はサイトの構成(完了ページのURL、フォームツール、SPAかどうかなど)によって変わるため、本記事の中では扱いません。今回のように サンクスページ到達をトリガーにする方法 は、以下の記事の「①GTMでサンクスページ到達を計測する方法」→「トリガー設定」で解説しています。まだ用意していない場合は、こちらを参考にトリガーを1つ作ってから次のSTEPに進んでください。
GTMでカスタムHTMLタグを作る
「合図が来たら、GASへ通知を送る」処理です。
- GTMの左メニュー 「タグ」 から 「新規」、タグタイプ 「カスタムHTML」
- 下のコードをコピーして貼り付ける
<script>
(function () {
var payload = JSON.stringify({
token: '__SHARED_TOKEN__',
form_type: '資料請求', // ← あなたのコンバージョンの名前に変える
page: location.pathname,
url: location.href,
ref: document.referrer || ''
});
var endpoint = '__GAS_WEBAPP_URL__';
try {
if (navigator.sendBeacon) {
// ページ遷移に強い送信方式(通信エラーも回避)
navigator.sendBeacon(endpoint, payload);
} else {
fetch(endpoint, { method: 'POST', mode: 'no-cors', body: payload });
}
} catch (e) {
fetch(endpoint, { method: 'POST', mode: 'no-cors', body: payload });
}
})();
</script>
- 貼ったコードの中の3箇所を差し替える
- 「__SHARED_TOKEN__」: STEP 2で決めた合言葉(SHARED_TOKENと同じ値)
- 「__GAS_WEBAPP_URL__」: STEP 3でコピーしたウェブアプリURL
- 「form_type: ‘資料請求’ 」:あなたのコンバージョンの名前(Slackの通知に表示されます)
- 下の 「トリガー」 で、STEP 4で用意したCVトリガー(サンクスページ到達など)を選ぶ
- 名前を付けて保存(例:コンバージョン通知_Slack)
プレビューでテストする
公開する前に、自分だけで動作確認します。プレビューは公開しない限り、一般の訪問者には影響しません。
- GTM右上の 「プレビュー」 をクリック
- Tag Assistantの画面で、あなたのサイトのURLを入力して 「Connect」(別タブでサイトが開き「Connected」と出ればOK)
- 実際にフォームを送信するなどして、完了ページに移動する
- Tag Assistantで、完了ページのところにタグ
コンバージョン通知_Slackが Fired(発火) になっているか確認する

- Slackに通知が届けば成功です

公開する
プレビューで通知が届いたら、GTM右上の 「公開」 を押して本番に反映します。これで、実際の訪問者のコンバージョンがSlackに届くようになります。

公開後にしばらく通知が来なくても、あわてなくて大丈夫です。そもそもコンバージョンが発生していないだけのこともあります。テスト用のフォーム送信を一度自分でやってみて、届くかどうかで切り分けてください。
うまくいかないときのチェック
設定は箇所が多いので、つまずいたら「どこまでは動いているか」を切り分けると早く直せます。症状ごとに見るところをまとめました。
| 症状 | 見るところ |
|---|---|
| 「Add New Webhook」で堂々巡りになる(ボットユーザーがありません) | STEP 1の App Manifest でボットユーザーを宣言する。「display_name」は半角英数字にする |
| testPing(STEP 2)が届かない | 「SLACK_WEBHOOK_URL」の貼り間違い。貼り直して保存し、再実行する |
| testPingは届くが、GTM経由で届かない | ①タグの「__GAS_WEBAPP_URL__」が正しいウェブアプリURLか ②「__SHARED_TOKEN__」とGASの「SHARED_TOKEN」が完全一致しているか(合言葉が違うとGASが無視します) |
| タグが発火しない(Firedにならない) | ①STEP 4のトリガー条件が完了ページで満たされているか ②GTMがサイトに正しく入っているか ③プレビューがConnectできているか |
| デプロイ後に届かない(403など) | STEP 3の「アクセスできるユーザー:全員」になっているか。違っていたらデプロイし直す |
この仕組みが特に効く場面
手順を実装した先で、どんなときに効いてくるのかを3つ挙げます。
1. GA4の権限を配らずに、チーム全体でCVを共有できる
これが一番大きい効果だと考えています。コンバージョンの発生をチームで共有しようとすると、これまでは全員にGA4の閲覧権限を配るか、担当者が都度チャットで伝えるか、のどちらかでした。Slack通知なら、GA4を触らないメンバー(営業・カスタマーサポート・経営層)も、チャンネルに入っているだけでCVに気づけます。権限管理を増やさずに、情報だけを共有できるということです。
GA4の権限(ロール)そのものの設計は、以下の記事にまとめています。誰にどこまで渡すかを整理したい方は、あわせて読んでみてください。
2. 対応の初速が上がる
資料請求や問い合わせは、届いてから連絡するまでの速さが成果に直結します。ダッシュボードを見に行かないと気づけない状態だと、どうしても対応が後手に回ります。発生した瞬間にSlackへ届けば、その場でリアクションを取れます。
3. 施策の効果をリアルタイムで体感できる
広告を出した直後、メルマガを配信した直後、新しいLPを公開した直後。こうした場面で通知がポンポン鳴ると、施策が効いているかどうかを肌で感じられます。数字を後から集計して振り返るのとは別の、その場の手応えが得られます。
まとめ:通知は「気づく」ため、分析はGA4で
コンバージョンをSlackにリアルタイム通知する仕組みを一度作ってしまえば、あとはコンバージョンが起きるたびに勝手に通知が届きます。ダッシュボードを見張る必要も、CV発生をメンバーに口頭で伝える必要もなくなります。
ただし、限界もあります。この仕組みはブラウザ側で発火するので、広告ブロックなどで通知が飛ばないこともあり、GA4の集計値と件数が完全に一致するわけではありません。あくまで「起きたことに気づく」ための仕組みで、正確な集計や分析はGA4で行う、という役割分担です。コンバージョンが多いサイトでは通知が鳴りすぎるので、重要なコンバージョンだけに絞るのがおすすめです。
通知で気づいたコンバージョンを、次に「どの記事・どの導線が生んだのか」まで掘り下げたい方は、以下の記事も参考にされてください。気づく仕組みと、振り返る仕組みは、セットで持っておくと強いです。



記事へのご質問・ご指摘