SPAのページをGAで計測？従来のWEBと同じで余裕でしょ！と思い込んでた話

# SPAをGA4、UAの両方で計測できるようにしたい！
WEB計測で利用されている超有名なツールといえば「Google Analytics」。（以下、GA）
計測タグを読み込ませるだけで、PV数やユーザー数、セッションなど多くの指標を計測できるこの便利なツールをGoogleは無料で提供しています。Googleさん、太っ腹！

普段、私が数値集計に使っているGAはUniversal Analytics（以下、UA）形式ですが、Google公式から[「2023年7月からGA4に完全移行するよ。今後、UAは使えなくなるよ」と告知された](https://support.google.com/analytics/answer/11583528)ので、GA4とUAの画面を見比べたりUAで計測できている数値をGA4で確認する方法を探したりと、手探りで移行準備を進めています。

GA4に早く慣れないとなぁと考えながら普段の業務をこなしているところに、Nuxt.js、Node.jsを使ったSPA（シングルページアプリケーション）のWEB構築案件が開始されました。
この案件で計測まわりの設定を任されたため「従来のWEBと同様に設定すれば大丈夫だろ！余裕余裕！」とタカを括ってたら、かなり初歩的なところなで躓いてしまったので、自戒を込めて、詰まってしまった箇所と対応した内容をご紹介します。

:::note info
SPA（シングルページアプリケーション）
従来のWEBページではページ内のコンテンツを更新・切り替える際にページ遷移やリロードを挟むが、SPAはJavaScriptでページ内の一部コンテンツを差し替えるため、ページ遷移やリロードがなくてもコンテンツを切り替えることが可能。
:::

# SPAを使ったWEB構築環境と計測環境
* フレームワーク：Nuxt.js、Node.js
* 計測に使用したツール：GA（GA4、UA）、GTM

ページを計測するためにはまず計測用のタグを読み込ませることが必要です。
今後、計測タグの追加・修正・削除が発生することを考慮して、タグ管理がしやすいGoogleタグマネージャー（以下、GTM）を全ページに読み込ませ、GTM経由でGA4とUAの計測タグを配信する方法を取りました。

:::note info
Googleタグマネージャー
Google公式が無料で提供しているタグ管理ツール。ページ内に計測タグを直接書き込んでいた場合、タグが不要になったり修正が必要になった際にページ自体を修正する必要があります。でもGTMなら管理画面からタグだけを追加・修正・削除することができるので、とっても便利！
:::

## 計測設定の追加手順
GTM経由でGAの計測タグを配信するにあたり、私が取った手順は以下の通りです。

1. GTMをインストール
2. GTMにUAとGA4の計測タグを追加し、配信
3. Google Tag Assistantでタグが配信されているか確認
4. GAのリアルタイム計測から数値が計測されているか確認

# 手順1：GTMをインストール
Nuxt.jsでGTMモジュールをインストールするため、以下のnpmコマンドを入力。
`npm install @nuxtjs/gtm`
![03-GTMモジュールインストール中-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/29f9141a-442d-a64d-9b4c-aa6a5a87731d.png)
インストールが完了したら「nuxt.config.js」のmodulesにGTMの内容を追記。

```
  // Modules: https://go.nuxtjs.dev/config-modules
  modules: [
    '@nuxt/http',
    '@nuxtjs/gtm' //modulesにgtmを追加
  ],
  gtm: {
    id: 'GTM-（計測ID）',　//GTMアカウントから確認できる計測IDを追記
    pageTracking: true　//PV数を計測するオプションを指定
  },
```

# 手順2： GTMにUAとGA4の計測タグを追加し、配信
次はGTMでGA4とUAの計測タグを追加・配信する必要があります。

▼GA4の計測タグを追加：新規タグを作成し、タグの種類「Google アナリティクス：GA4設定」を選択。測定IDにGA4のIDを指定して、トリガーにAll Pagesを指定するだけ。簡単！
![05-GTM-GA4計測タグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/571eb2d6-9eb1-5ec7-690e-f78b1adefa96.png)

▼UAの計測タグを追加①：こちらは新規変数の作成から、変数のタイプ「Google アナリティクス設定」を選択。トラッキングIDにUAの計測IDを指定。Cookieドメインはデフォルトの「auto」でOK。
![05-GTM-UAID設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/872a8f6c-efae-361f-4768-594c83285291.png)
▼UAの計測タグを追加②：新規タグを作成し、タグの種類「Google アナリティクス：ユニバーサルアナリティクス」を選択。測定IDは①で作っておいた変数を参照するだけでOK。トリガーにAll Pagesを指定して完了。
![05-GTM-UA計測タグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/ca3da838-84db-d545-7776-7c54fe1ea724.png)
あとはGTMの設定を公開するだけで、ページに計測タグが配信される想定でした。

# 手順3：Google Tag Assistantでタグが配信されているか確認
次はChromeの拡張アドオン「[Google Tag Assistant](https://chrome.google.com/webstore/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk)」を使ってSPAページ内に存在するタグを確認してみました。すると・・・

▼タグが反映されてない！
![07-tagアシスタント-before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/4a6828e4-b175-da8f-67c5-5634accaefd8.png)
なんで？？？？？？

## どこで間違えた？まずはNuxt側の設定ファイルを確認
GTMのインストールに失敗したかと思い、nuxt.config.jsと合わせて、インストールした際に更新された以下ファイルの中身を確認します。
* package.json・・・npmコマンド実行時に作成・更新されるファイル。パッケージ、バージョン情報が羅列されている。
* package-lock.json・・・同上

▼package.json
```
"dependencies": {
    （中略）
    "@nuxtjs/gtm": "^2.4.0",
    （中略）
  },
```
▼package-lock.json
```
   （中略）
 "@nuxtjs/gtm": {
    "version": "2.4.0",
    "resolved": "https://registry.npmjs.org/@nuxtjs/gtm/-/gtm-2.4.0.tgz",
    "integrity": "sha512-Of5KuBBFwRjyJ6AuRrIQsh8J6ksIN2UegJDE8nBiTAanbwQBsAJ0hZibV9SjhKdGvGvWpbShQ4yR2bmQgY6XKA==",
    "requires": {
      "chalk": "^4.1.0",
      "semver": "^7.3.2"
    }
  },
},
   （中略）
```
どちらにもGTMモジュールが追加されているのを確認。
インストールに失敗している様子はなく、かといって他に設定・修正するべき箇所がみつけられない状態で右往左往すること1時間余・・・。
インストールはされているけど有効になっていない（=OFFになっている）と仮定して、GTMを有効化させる方法を調べることにしました。

## GTMをオプションで明示的に有効化
困ったときのGoogle検索。「Nuxt.js GTM 有効化」の単語で探してみると、明示的に有効化できるオプション「enabled: true」を見つけたので、「nuxt.config.js」のmodulesに追記。
```
  // Modules: https://go.nuxtjs.dev/config-modules
  modules: [
    '@nuxt/http',
    '@nuxtjs/gtm'
  ],
  gtm: {
    id: 'GTM-（計測ID）',
    enabled: true,　//GTMを明示的に有効化
    pageTracking: true
  },
```
明示的に有効化したあと、SPAページに戻ってGoogle Tag Assistantでタグを確認。
![07-tagアシスタント-after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/9a11be0d-39b6-b895-6ed8-c209c282078a.png)
ようやく、GTMとGTM経由で配信したGA4とUAの計測タグを確認できました。

# 手順4：GAのリアルタイム計測から数値を確認（1回目）
計測タグを反映できたら次はGAで正常に計測されるかどうかを、リアルタイム計測から確認。
あらかじめ作っておいた「テストページ-1」をブラウザで表示して計測されればOK！

▼GA4
![GA4-リアルタイム計測-確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/a6f6a100-fb44-55bc-91b7-44cdeae92c2d.png)

▼UA
![99-テストページ-1-計測確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/43612adc-330c-713c-6c53-a8d9af87b214.png)
GA4、UAともに計測されてる！
・
・
・
と喜んでいたのですが、複数のテストページにアクセスして検証した結果、UAのみ<font color="Red">「リンクからページに遷移して表示」した場合は計測されていない</font>ことがわかりました。

|検証内容|GA4|UA|
|:-|:-:|:-:|
|URLに直接アクセスして表示|〇|〇|
|ページをリロード|〇|〇|
|<font color="Red">リンクからページに遷移して表示</font>|〇|<font color="Red">✖</font>

ページ遷移時にのみ計測できない不具合なんて、従来のWEB計測設定では経験がなかった。。。

## SPAをUAで計測する場合、計測トリガーの「All Pages」が効かない？！
リンク遷移した際にページが計測されないとなると、サイトに訪れたユーザーがどれだけ回遊したのかわからない状態になってしまうので非常にマズいです。
改めて調べてみると、<font color="Red">SPAはGTMで設定したトリガー「All Pages」が正常に効かない</font>らしい。

[参考サイト：【Nuxt×GTM】NuxtでGoogleタグマネージャー（gtm）を設定して確認する | offlo.in（オフロイン）](https://offlo.in/blog/nuxt-gtm.html)

SPAはページ遷移時にイベント「nuxtRoute」が発火するらしいので、GTMで「nuxtRoute」をトリガーにしてPVを計測するよう設定。

▼GTMで新規のトリガーを作成し、トリガーのタイプに「カスタムイベント」を選択。イベント名はページ遷移時に発火する「nuxtRoute」を指定して、トリガーの発生場所は「すべてのカスタムイベント」を選択。
![GTM-nuxtroute追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/fa599afb-2f47-27c0-0bb0-b966d295ec4f.png)

▼UAの計測タグのトリガーにしていた「All pages」を削除し、カスタムイベント-nuxtRouteを指定。
※All Pagesがなくても、modulesに追記したオプション「pageTracking: true」で、遷移時以外の計測は可能。
![GTM-nuxtroute設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/7b6c5fb7-25de-a54a-7acc-e6eb5756590f.png)

# 手順4：GAのリアルタイム計測から数値を確認（2回目）
テストページ1 → 2 → 3とリンクを使って遷移し、計測されるかを確認します。

▼GA4（nuxtRouteのトリガーを使わなくても計測されている）
![GA4-テストページ1-3計測確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/13e4ca34-accc-4475-285f-20538474e9f2.png)

▼UA
![テストページ1-3計測確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705342/ec0864bd-353a-2bb9-f913-271af5267b5f.png)
遷移したあとのページがちゃんと計測されてる！これで、今度こそ大丈夫！

SPAではない従来のWEBページ計測には、遷移時のイベントを検知する設定は必要なかったので、SPAをUAで計測する際は「nuxtRoute」を設定する必要があることを、今回初めて知りました。
「計測設定はGA、GTMのタグを読み込ませるだけだからSPAでも余裕！！」と思い込んでたのは良くなかったな、と反省。

# まとめ：Nuxt.jsのSPAページを、GTMを使って計測するための手順
1. GTMモジュールをインストール
2. 追加されたGTMモジュールを有効化
3. GTMがページに反映されているか確認（確認が取れない場合は、1～2をやり直し）
4. GTMでGA4、UAの計測タグを追加・配信
5. GA4、UAの計測タグが配信されているか確認（確認が取れない場合は、4をやり直し）
6. GAのリアルタイム計測で、PV数が"正しく"計測されているか確認（正常に計測できていない場合、4～5を見直す）