Googleアナリティクス/GTMの高度でおすすめのデフォルト設定

GTMとGoogleアナリティクスの高度な実装。
パーソナライズやエンゲージメント分析をする際には必須になるものを紹介する。
主にGoogleアナリティクス360でBigQueryを使って分析する際に役立つ。

必須のcustomTask

customTaskはGoogleアナリティクスのスクリプトがデータ収集サーバにデータを送る(メジャメントプロトコル)ときに任意の処理を指定して実行するオプションである。

GTMを使ってGoogleアナリティクスとさまざまなツールを連携する際、customTaskにはデフォルトでこれを設定するといい。

function() {
  return function(model) {
    // ページ読み込み開始時刻を取得
    var time_dl = performance.timing.domLoading;
    // クライアントIDをカスタムディメンションにセット
    model.set('dimension1', model.get('clientId'));
    // ヒットタイプがページビューの時にのみ以下を実行
    if (model.get('hitType') == 'pageview') {
      dataLayer.push({
        'event': 'ga_synced',
        'time': new Date().getTime() - time_dl,
        'ga_cid': model.get('clientId'),
      });
      var originalSendTask = model.get('sendHitTask');
      model.set('sendHitTask', function(sendModel){
        originalSendTask(sendModel);
        setTimeout(function(){
          dataLayer.push({
            'event': 'ga_loaded',
            'time': new Date().getTime() - time_dl,
          });
        } ,1);
      });
    }
  }
}

これを変数/カスタムJavaScriptとして登録し、それをGoogleアナリティクスタグ設定のフィールド/customTaskとして設定する。そしてトリガーのカスタムイベントでga_syncedga_loadedを登録する。

dimension1の部分は自環境のクライアントID格納スロット番号に書き換える。現状APIやBigQueryではクライアントIDが取得できるので設定する必要性は下がったが、データポータルを使う場合はカスタムディメンションで設定しておかないと見ることができない。

処理の内容は

  1. クライアントIDをカスタムディメンションにセット
  2. 1の直後のタイミングでヒットタイプがページビューの時にのみ(1ページビューにつき1回)
    1. データレイヤーイベント「ga_synced」を発生させる
    2. クライアントIDをデータレイヤー変数「ga_cid」にセットする。
  3. ページビューヒットを送った直後にデータレイヤーイベント「ga_loaded」を発生させる

つまりページビュー計測の時(つまり1ページビューにつき1回)だけ、

  • クライアントIDを取得できたタイミングでトリガーを発生
  • ページビューヒットを送った直後で別のトリガーを発生

させる。これによってクライアントIDが発生した最速のタイミングでそれを他ツールに送る実装ができる。そしてページビューヒットの直後に特定のタグを実行することができる。これが有用になるのはイベント計測ヒットをページビューヒットの後に送りたい時である。イベント計測ヒットはページビューヒットの先に送られると集計上不都合なことがあり、それを防げる(それでもごくまれに順番が制御できないことはあるが、その場合はTimeoutのdelayを長くすればいい)。

このコードの中ではGoogleアナリティクスの設定フィールドsendHitTaskを使っている。GTMのGoogleアナリティクスタグ設定のフィールド名でsendHitTaskを指定することもできるが、originalSendTask(sendModel)をやる場合(本来のsendHitTaskも実行したい場合=純粋に処理を追加したい場合)はそれだと正しく動作しない。customTaskの中でsetする、上記のように実装する必要がある。

データレイヤーイベントのおすすめ設定

あとデータレイヤーにイベント送るときは時刻も入れておくと検証しやすいのでお勧め(普段から)。
分かりにくいUnix timeを出すのではなくdomLoadingからの経過ミリ秒だとわかりやすくていい。

dataLayer.push({
  'event': 'イベント名',
  'time': new Date().getTime() - performance.timing.domLoading,
});

performance.timing.domLoadingは変数/JavaScript変数として登録しておいても便利。

「もしもイベントが発生していなかったら」という条件(トリガー)

トリガーで「イベントが発生したら・・・」という条件は設定できる。
そして「あるイベントAが発生した時、イベントBが発生していたら・・・」はトリガーグループの機能を使えばいい。
では「イベントAが発生したとき、イベントBが発生していなかったら・・・」という条件はどうやって実現するのか?

そこでデータレイヤーイベントを使う。

dataLayer.filter(function (x) { return x.event === 'イベント名' }).length === 0

これがtrueであればそのイベントは発生していない。

イベントBが発生していなければイベントCを発生させるコードが以下になる。
これをトリガーAによって呼び出されるカスタムHTMLタグとして設定し、トリガーにデータレイヤーイベント「イベントC」を設定すればいい。

dataLayer.filter(function (x) { return x.event === 'イベントB' }).length === 0 && dataLayer.push({'event': 'イベントC'})

カスタムディメンション

ページビューIDをカスタムディメンションに設定する

ログ分析を進めていくと、どのイベントがどのページビューにおいて発生したものなのか知りたくなることがある。たとえばスクロールや動画再生などは典型的。イベントのレコードでページパスは記録されている(どこのページかはわかる)が、いつのページビューかは実はわからない。

これらは単純にログを上から見ていけばわかるというものではない。たとえば最初にタブをまとめて開いておいて、後でページ閲覧するケース。この場合ページビューヒットとイベントヒットの順番がわからなくなる。

これを解決するためにページビューに対してIDを割り振るといい。同一ページビューに対するすべてのヒット(ページビュー、イベント、トランザクション)はすべて同じIDが割り振られる。つまりページビューに紐づけることができるようになる。

Googleアナリティクスでは訪問者(ブラウザ)とセッションに対してはIDが割り振られているが、ページビューのIDはない。

以下を変数/カスタムJavaScriptに設定する

function(){
  if (!window._pv_id) {
    window._pv_id = [Math.round(2147483647 * Math.random()).toString(36), (+new Date()).toString(36)].join('-')
  }
  return window._pv_id
}

この変数をGoogleアナリティクスのカスタムディメンション/ヒットスコープとして設定しておく。

Google の記事一覧