Google Tag Manager でコンバージョンに至るまでの経過時間を Google Analytics にイベント送信する方法

## はじめに

Google Analytics のコンバージョン設定をしている方はいると思います。 **コンバージョンに至るまでのファネル内でどの程度時間がかかったか** という指標もコンバージョン率やユーザー体験に影響があるため、経過時間を知りたいというニーズはあると思います。

Google Tag Manager (GTM) を使うと、ソースコードを逐一いじらずに色んな解析ができます。今回 Google Tag Manager を使って Google Analytics に経過時間をイベント送信してみたので、備忘録としてまとめておきます。

## 集計イメージ

以下のように Google Analytics 上でコンバージョンに至るまでの秒数が記録されます。期間指定で施策前後の平均値を比べたり、セカンダリディメンジョンで詳細な分析をしたりできます。

![スクリーンショット 2019-07-19 13.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/889243e9-54ec-0cc2-16b4-f1c8bd3a23ef.png)

## 方針

今回、ソースコードは変更せず、全て Google Tag Manager で完結させたかったので、ユーザー行動に沿って以下のように設定しました。

1. 時間計測を開始したいタイミングで GTM のカスタム変数に現在時刻を記録
2. コンバージョン時にカスタム JavaScript を使って、現在時刻と 1 で設定した時刻との差分をイベント送信

## 設定方法

タグとトリガーと変数をそれぞれ 2 個ずつ作成します。まず変数から説明します。

### 変数の設定

![スクリーンショット 2019-07-19 14.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/1d2c8884-7a06-8a87-6ee8-0b220c2b63bf.png)

Order Start Timestamp と Order Duration という変数を設定しています（今回申込画面にかかる時間を測定したので Order 系の文字列があるのは気にしないでください）。

![スクリーンショット 2019-07-19 13.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/05017e4e-49c9-f588-bdf9-51a83fe83e45.png)

Order Start Timestamp は [データレイヤー変数](https://support.google.com/tagmanager/answer/7683362#data_layer) にしてデフォルト値を 0 としておきます。この値に時間を代入するのはトリガーで行います（後述します）。

![スクリーンショット 2019-07-19 14.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/f0ab0d84-be82-2cf4-9e1e-76334ff4cb6c.png)

Order Duration は [カスタム JavaScript](https://support.google.com/tagmanager/answer/7683362#data_layer) にして Order Start Timestamp との差分を計算して返します。秒変換するために 1000 で割りました。

```JavaScript
function () {
  var now = new Date().getTime();
  var diff = parseInt((now - {{Order Start Timestamp}}) / 1000);
  return diff;
}
```

Order Duration をイベント送信時にセットします。

### トリガーの設定

次にトリガーの設定について説明します。

![スクリーンショット 2019-07-19 13.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/974c98d5-b251-afab-474b-ba3eeb935905.png)

トリガーには時間計測開始のタイミングと、コンバージョンのタイミングの 2 つを設定します。これはサービスによって異なる設定になるはずなので詳細は説明しません。

![スクリーンショット 2019-07-19 14.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/41f0919b-89a1-bd9a-f0fb-f1023fa49486.png)

ちなみに SPA で特定のページアクセスをトリガーとしたい場合には、トリガータイプにページビュー系のものを選ばずに **履歴の変更** を選ぶ必要があるようです。

### タグの設定

最後にタグの設定について説明します。

![スクリーンショット 2019-07-19 13.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/409a2fd3-4a4e-4248-9fce-d875efcff751.png)
時間の計測を開始するタイミングとコンバージョンのタイミングの 2 つにタグを設定します。

![スクリーンショット 2019-07-19 13.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/c2ccccda-0f88-b368-9d92-bc33dd3cf12c.png)
時間の計測を開始するタイミングのタグ設定を設定します。 タグの種類を **カスタム HTML** にして script タグ内で dataLayer 変数に値を設定しています。変数は上の手順で作った Order Start Timestamp を使います。トリガーは上の手順で作った時間計測開始のトリガーを選択します。

```HTML
<script>
/**
 * New Order Timestamp 変数に新規申し込みページにアクセスしたタイムスタンプを記録
 * 申込み完了時にこのタイムスタンプとの差分を送信するために利用
**/
dataLayer.push({'Order Start Timestamp': new Date().getTime() });
</script>
```

![スクリーンショット 2019-07-19 14.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/0f163e79-533f-3179-c152-d8af1fe54fa4.png)

コンバージョンのタイミングのタグを設定します。 Google アナリティクスのイベントを選択し、値に上の手順で作った **Order Duration** を選択します。

以上で設定完了です。プレビューで状態確認して問題なければ公開しましょう。

## まとめ

カスタム HTML やカスタム変数、カスタム JavaScript などをうまく使うことで、GTM だけで管理できる変数を定義して、特定のタイミングで作成・更新・取得などができることが分かりました。一見コードで書かないと難しそうな処理も、一度 GTM でできるか検討してみると良さそうです。