GTMで取得したGA4イベントをSlack通知する方法

Web担当者のための「GA4×AI」実践ガイド配布中
→詳しく見る

  • 「コンバージョンが出たか気になって、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に通知が届くのか」を説明します。

今回作る仕組みは、以下のような流れになっています。

フォーム完了からSlack通知が届くまでの流れ。コンバージョン完了、GTM、GAS中継、Slack通知の3段構成を示した図
コンバージョン発生からSlack通知までの流れ(GTM→GAS中継→Slack)
  1. サイトでコンバージョンが起きる(例:資料請求フォームの送信が完了し、完了ページが表示される)
  2. GTMがそれを合図に、コンバージョンの情報を中継役へ送る
  3. GAS(中継役)が情報を受け取り、Slackへ投げる
  4. Slackに通知が1件届く

なぜGASを挟むのかというと、1つはSlackへ通知を送り込むためのURL(後述するIncoming Webhook)を、ブラウザ側のコードに直接書かずに済ませるためです。このURLは第三者に知られると誰でも通知を送れてしまうので、外から見えないGASの中に隠します。もう1つは、ブラウザから直接Slackへ送ると通信がブロックされやすいためです。これをGASを経由することで防ぎます。

GAS(Google Apps Script)とは

Googleが提供する、JavaScriptに近いプログラムの実行環境です。Googleアカウントさえあれば無料で使え、サーバーを自分で借りる必要がありません。今回は「GTMから届いた情報を受け取ってSlackへ渡すだけ」の短い中継役として使います。プログラミングの経験がなくても、コードはAIに書いてもらうことが可能です。本記事では、丸ごとコピーして貼るだけで動く完成品を配布しています。

なお、GA4のデータを取得するAPIを定期的に叩いて確認する方法もあります。ただ、取得までに時差があり「起きた瞬間」には届きません。定期的にレポートを作るならAPI取得が向いていますが、今回はリアルタイムでCVに気づきたいので、ブラウザ側で発火した瞬間に送るこの方式を選びました。

コンバージョンをSlackに通知する設定手順(7ステップ)

ここからは実装の手順を解説していきます。Slackの受け口を作り、中継役のGASを用意し、GTMから合図を送る、という順番で進めます。SlackとGASの連携をする部分は、初回はやや戸惑いやすいのですが、落ち着いて対応していきましょう。

STEP

Slackの「Incoming Webhook」を発行する

Slackに通知を送り込むための「受け口URL」を1本作ります。

  1. ブラウザでSlackにログインした状態でhttps://api.slack.com/appsにアクセスします。
  2. 右上の緑のボタン 「Create New App」(新しいアプリを作る、という英語のボタンです)をクリック
  3. 「From scratch」(ゼロから作る)を選ぶ
  4. App Name に好きな名前、Workspace に自分のワークスペースを選び、「Create App」ボタンを押す
Slack API Your Apps画面のCreate New Appボタンをクリックする様子
Slack APIの Your Apps 画面から「Create New App」でアプリ名とワークスペースを設定する
  1. 左メニューの 「Incoming Webhooks」 をクリックし、右上のスイッチ 「Activate Incoming Webhooks」On にする
  2. ページ下部の 「Add New Webhook」 をクリックし、通知したいチャンネルを選んで 「許可する(Allow)」
  3. ページ下の方に表示される「https://hooks.slack.com/services/…」というURLをコピーする
Incoming Webhooks画面にhooks.slack.comのURLが1件表示された画面
Incoming Webhookが1件発行された状態。右のコピーボタンでURLを取る
Incoming Webhookとは

外部から特定のSlackチャンネルへメッセージを投稿するための「受け口URL」です。このURLに向けてメッセージを送ると、そのままチャンネルに投稿されます。

このURLは、パスワードと同じ扱いです。人に見せない、公開する場所に書かない、AIの入力欄にも貼らないでください。次のSTEP 2でGASの中に貼ると、外からは見えなくなります。

「ボットユーザーがありません」で先に進めないとき

「Add New Webhook」を押すと、「◯◯ にはインストールするボットユーザーがありません」 と出て、何度やっても同じ画面に戻される(堂々巡りになる)ことがあります。私もここで一番つまずきました。

原因は、「From scratch(ゼロから)」で作ったアプリには、Slackの中に住む「ボットユーザー」という土台が最初は用意されていない場合があるためです。

対処は、App Manifest(アプリの設計図)で土台を宣言して作ることです。

  1. 左メニュー下の方の 「App Manifest」 をクリック
  2. エディタ(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
  }
}
SlackアプリのApp Manifest編集画面にJSONで設計図を貼り付けた状態
App Manifest(JSONタブ)に設計図を貼り付けた状態。この後 Save Changes を押す
  1. 「Save Changes」 をクリック(これでボットユーザーの土台ができます)
  2. 左メニュー 「Incoming Webhooks」 に戻り 「Add New Webhook」 を押すと、今度はチャンネル選択が出ます。選んで 「許可する」

ボットの表示名「display_name」は、必ず半角英数字にしてください。ここを日本語にしてしまうと保存できません。アプリ名(display_information.name)の方は日本語で構いません。

STEP

GAS(中継スクリプト)を作る

Slackの通知先URLを隠して受け渡す「中継役」を、Google Apps Scriptで作ります。

  1. ブラウザでhttps://script.google.comを開き、「新しいプロジェクト」を作成
  2. 最初から入っている「function myFunction() {}」を全部消す
  3. 下のコードをすべてコピーして貼り付ける
// ▼ここだけ書き換える ---------------------------------------------
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
  });
}
Google Apps ScriptエディタにSlack中継用のdoPost関数のコードを貼り付けた画面
GASエディタに中継スクリプトを貼り付けた状態。冒頭2行の値だけ書き換える
  1. 冒頭の2箇所を書き換えます
    • 「SLACK_WEBHOOK_URL」:STEP 1でコピーしたURLを貼る
    • 「SHARED_TOKEN」:好きなランダム文字列にする(パスワード生成ツールなどで作成するのがおすすめ)。この値はあとでGTM側にも同じものを入れますのでメモしておきましょう。
  2. 上部の保存アイコン(フロッピー)で保存

「SHARED_TOKEN」は、GTMとGASの間だけで通じる「合言葉」です。関係のない第三者がGASのURLを見つけて通知を送りつけても、合言葉が違えばGASが無視します。

動作テスト(testPing)

コードを貼ったら、Slackまで届くか先に確かめます。

  1. エディタ上部の関数選択プルダウンで「testPing」を選び、「実行」ボタンを押す
  2. 初回だけ承認画面が出ます。少し戸惑うところなので順番に書きます
    ・「承認が必要です」から「権限を確認」を押し、自分のGoogleアカウントを選ぶ
    「このアプリはGoogleで確認されていません」 と警告が出たら、左下の 「詳細」 から 「(プロジェクト名)に移動(安全ではないページ)」
    ・「次の許可を求めています」で 「許可」
  3. Slackにテスト通知が届けば成功です
Google Apps ScriptでtestPing関数を実行した後の実行ログに実行開始と実行完了が並ぶ画面
testPing の実行ログ。「実行完了」が出て、Slackにテスト通知が届けばOK

「このアプリはGoogleで確認されていません」という警告は、自分で作ったスクリプトなら心配いりません。Googleが、まだ審査していない自作アプリに一律で出している警告です。

テスト送信が届かない場合

テストが届かない場合は、URLの貼り間違いであることがほとんどです。STEP 1のURLを貼り直して保存し、もう一度「testPing」を実行してください。

STEP

GASを「ウェブアプリ」としてデプロイする

GTM(ブラウザ)からアクセスできるように、GASの公開URLを発行します。

  1. 右上の 「デプロイ」 から 「新しいデプロイ」
  2. 左上の歯車アイコンから 「ウェブアプリ」 を選ぶ
  3. 設定を次のようにします
    次のユーザーとして実行:自分
    アクセスできるユーザー全員
GASの新しいデプロイダイアログでアクセスできるユーザーを全員に設定した画面
「アクセスできるユーザー」を「全員」にするのがコツ。ここが「自分のみ」だとサイト訪問者から届かない
  1. 「デプロイ」 をクリック(もう一度承認を求められたら許可)
  2. 発行された ウェブアプリURL(https://script.google.com/macros/s/…/exec)をコピーする。次のGTMタグに埋め込みます

「アクセスできるユーザー」を「全員」にしないと、サイトを見ている訪問者のブラウザからGASへ届きません。ここは必ず「全員」にしてください。なお、GASに届くのは合言葉つきの短いデータだけで、スクリプトの中身が誰かに見えるわけではありません。

GASを修正した時

あとでGASのコードを直したときは、「デプロイ」から「デプロイを管理」、鉛筆マーク、バージョン「新しいバージョン」、デプロイ、の順で更新できます。このときURLは変わりません。

STEP

GTMのトリガー(発火条件)を用意する

「コンバージョンが起きた瞬間」を、GTMに教えるためのトリガーを用意します。この記事を読んでいる方の多くは、すでにGA4でCVを計測するためのトリガーを作っているはずなので、そのまま流用してください。次のSTEPのタグを、そのトリガーに紐づけるだけで済みます。

トリガーの作り方について

トリガーの作り方はサイトの構成(完了ページのURL、フォームツール、SPAかどうかなど)によって変わるため、本記事の中では扱いません。今回のように サンクスページ到達をトリガーにする方法 は、以下の記事の「①GTMでサンクスページ到達を計測する方法」→「トリガー設定」で解説しています。まだ用意していない場合は、こちらを参考にトリガーを1つ作ってから次のSTEPに進んでください。

STEP

GTMでカスタムHTMLタグを作る

「合図が来たら、GASへ通知を送る」処理です。

  1. GTMの左メニュー 「タグ」 から 「新規」、タグタイプ 「カスタムHTML」
  2. 下のコードをコピーして貼り付ける
<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>
GTMのSlack通知_問い合わせ完了タグの設定画面にカスタムHTMLでSlack通知スクリプトを貼り付けた画面
GTMのカスタムHTMLタグに、Slack通知を投げるスクリプトを貼り付けた状態
  1. 貼ったコードの中の3箇所を差し替える
    • 「__SHARED_TOKEN__」: STEP 2で決めた合言葉(SHARED_TOKENと同じ値)
    • 「__GAS_WEBAPP_URL__」: STEP 3でコピーしたウェブアプリURL
    • 「form_type: ‘資料請求’ 」:あなたのコンバージョンの名前(Slackの通知に表示されます)
  2. 下の 「トリガー」 で、STEP 4で用意したCVトリガー(サンクスページ到達など)を選ぶ
  3. 名前を付けて保存(例:コンバージョン通知_Slack)
STEP

プレビューでテストする

公開する前に、自分だけで動作確認します。プレビューは公開しない限り、一般の訪問者には影響しません。

  1. GTM右上の 「プレビュー」 をクリック
  2. Tag Assistantの画面で、あなたのサイトのURLを入力して 「Connect」(別タブでサイトが開き「Connected」と出ればOK)
  3. 実際にフォームを送信するなどして、完了ページに移動する
  4. Tag Assistantで、完了ページのところにタグ コンバージョン通知_SlackFired(発火) になっているか確認する
GTM Tag Assistantで完了ページに移動しSlack通知_問い合わせ完了タグが1回配信されましたと表示された画面
完了ページで Tag Assistant を確認。「1 回配信されました」と出ればタグ側は正常
  1. Slackに通知が届けば成功です
Slackのcv通知チャンネルにコンバージョン発生種類ページ時刻流入元の内容が投稿された画面
Slack のチャンネルに「コンバージョン発生」の通知が届いた状態。ここまで来れば成功
STEP

公開する

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

GTM変更の送信ダイアログで追加したタグとトリガーを本番公開する画面
「変更の送信」画面。追加したタグとトリガーが並んでいることを確認し、右上の「公開」で反映する

公開後にしばらく通知が来なくても、あわてなくて大丈夫です。そもそもコンバージョンが発生していないだけのこともあります。テスト用のフォーム送信を一度自分でやってみて、届くかどうかで切り分けてください。

うまくいかないときのチェック

設定は箇所が多いので、つまずいたら「どこまでは動いているか」を切り分けると早く直せます。症状ごとに見るところをまとめました。

スクロールできます
症状見るところ
「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で行う、という役割分担です。コンバージョンが多いサイトでは通知が鳴りすぎるので、重要なコンバージョンだけに絞るのがおすすめです。

通知で気づいたコンバージョンを、次に「どの記事・どの導線が生んだのか」まで掘り下げたい方は、以下の記事も参考にされてください。気づく仕組みと、振り返る仕組みは、セットで持っておくと強いです。

Web担当者のための「GA4×AI」実践ガイド配布中

GA4の基本からAIプロンプトまで、現場で「すぐ使える」知識を厳選して収録しました。

→無料のeBookをダウンロードする

※新規タブでフォームが開きます。

屋嘉比 馨
ボーダーヘイズ・ジャパン代表
ウェブ解析士協会所属・ウェブ解析士。
ラジオ局、広告代理店などに勤務ののち、大手SIerのWebマーケティング担当に。主にオウンドメディア、広告運用にて営業リード・採用応募獲得に貢献。
2022年に独立し、ボーダーヘイズ・ジャパンを設立。
これまで100サイト以上の改善・計測環境構築に貢献した経験をもとにUdemy講師としても活動中。受講8,000人以上、Udemy Business認定コースも含めベストセラーコース5本を抱える。

YouTubeチャンネル

本サイトの内容を動画でも発信中です。文章で見てもいまいちよくわからないという方はこちらもご覧ください。

ブログの内容と若干異なる場合もございます。

記事へのご質問・ご指摘

コメントする

読みたい場所にジャンプ