node.js/expressのサーバーからGoogle AnalysticsのGA4(gtag)にアクセスデータを送信する方法

環境

フレームワーク:express.js (node.js)
node: v16

背景

node.js では、universal-analystics という有名なGoogle Analystics用のパッケージがあり、今まではUAから始まるIDを指定することでアクセスデータをGoogle Analysticsで解析できていました。

しかし、UAは2023年7月に終了する予定となっており、GA4に移行しなければいけない状況です。

そこでGA4に移行したいのですが、GA4に対応したnodeのパッケージが存在しません。
現在存在するパッケージのほとんどはフロントエンド用で、バックエンド用(サーバー用)のパッケージが存在しないのです。

手順

自身で作成する必要があります。
サーバーからGA4を使用してアクセスデータを送信する方法は、Googleが提供している「Measurement Protocol 」を使用します。要するにAPIです。

公式のリファレンスはこちらなのですが、どうやらここに掲載されていない実装があるようで少々厄介です。

Measurement Protocol のリファレンス  |  Google アナリティクス  |  Google for Developers

API Secretを生成

まず、API KEYを作成します。
Google Analystics → 管理 → データストリーム → ウェブ → ウェブ ストリームの詳細 → Measurement Protocol API Secrets からAPIを作成します。

公式のマニュアルは以下です。

[GA4] Generate API secrets for Measurement Protocol - Analytics Help
You need the Editor role for the property in order to generate API secrets. An API secret is one of the required URL par...

コーディング

次にコードを書きます。
エンドポイントに指定されたフォーマットのJSONをPOSTする構成とする必要があります。

私は、app.jsに次のようなコードを追加しました。
measurement_id は G- から始まるGA4のタグです。
api_secret には取得したAPI KEYを入力します。

const fetch = require('node-fetch');
const crypto = require('crypto');
app.use(async function (req, res, next) {
  const measurement_id = "G-AAAAAAAAA"
  const api_secret = "BBBBBBBBBBBBBBB"
  const reqip = req.headers['x-real-ip'] || req.socket.remoteAddress
  const iphash = crypto.createHash('md5').update(reqip).digest('hex')
  console.log(req.path)
  const reqjson = {
    client_id: 'myserver',
    user_id: iphash ,
    non_personalized_ads: false,
    events: [
      {
        name: 'page_view',
        params: {
          event_source: 'server',
          page_title: req.path,
          page_location: 'https://your-domain' + req.path,
          page_path: req.path,
          engagement_time_msec: 100,
          session_id: 123,
        },
      }
    ]
  }

  fetch("https://www.google-analytics.com/mp/collect?measurement_id=" + measurement_id + "&api_secret=" + api_secret, {
    method: 'POST',
    body: JSON.stringify(reqjson),
    headers: { 'Content-Type': 'application/json' }
  })
  next()
});

このコードでは、IPアドレスをハッシュ化してuser_idとして送信しています。
※ nginxの裏にあるサーバーのため、x-real-ip を取得しようとします。

なお、page_viewイベントや、page_title、page_location、page_pathなどのパラメーターは公式のマニュアルには存在しないのですが、海外フォーラムによると動くそうで、実際に動きます。

サポートされていないのか、マニュアル不備なのか、私の調査不足かは分からないので、この点は無保証だと思ってください。gtag.jsの方にはpage_viewイベントあるんですけどね。

まとめ

この件で想像以上に詰まったので、後の誰かの参考になれば幸いです。

とはいえ、GA4はアクセス記録に向いたサービスではないので他の方法を模索した方が良いかもしれませんが。

参考

Google Analytics 4 のイベントをサーバー側から送信する方法を調べてみた - Qiita
はじめにGoogle Analytics 4 のページビューやイベントを仕込む際は、クライアント側(View)に仕込むのが多いとは思いますが、サーバー側からイベントを送る必要が出てきたため、その方…
Send Event to GTM server container from a back-end
We are using a GTM container server. We want to send different events from the back-end of our web application directly ...
Setting debug_mode with Measurement Protocol (GA4)
Can't find a way to set the debug_mode parameter using Measurement Protocol 4. Tried to put it everywhere (and naming it...
How to send User Properties to Measurement Protocol (Google Analytics 4)?
With the Measurement Protocol for Google Analytics 4 we can send custom events (source). With the gtag.js Google Analyti...

コメント

タイトルとURLをコピーしました