Google Tag Manager からAnalyticsの拡張Eコマースを利用する

##  GTMを使って拡張Eコマース
Google Analyticsは使ったことががありましたが、Google Tag Manager(GTM)は使ったことがないという状態の時に、GTM経由で拡張Eコマースを利用したいという要望がありました。

こないだgtag関数使ってAnalytics呼出やったばっかりの素人の私が調べながら実装した方法です。もっと良い方法があるとご存知の方がおられましたらコメントいただけますと助かります。

GTMとAnalyticsのPageViewの連携は簡単にできました。単純にTracking idをタグに設定すれば良いだけです。
<img width="737" alt="gtm_003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/7da4c06d-c99e-1074-3639-1bab57ca9442.png">
<img width="735" alt="gtm_004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/529c1e92-69af-1d27-9d19-e780543e4ffd.png">

これでサイト側のHeadとBodyのタグをつけてしまえば、GAでのPageView関係のデータはサーバに送信されています。
&lt;head&gt;

```html
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');</script>
<!-- End Google Tag Manager -->
```

&lt;body&gt;の開始直後

```html
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
```

拡張Eコマースの実装はGoogleがRecommended(推奨)と言っているdataLayerを使って実装することにしました。下記のリンクにあるページのサンプルですね。
https://developers.google.com/tag-manager/enhanced-ecommerce


## 動作確認のために必要なものを準備
### GTMのPreviewモード - まずはPreviewモードを起動してみる
Google Tag Managerのプレビューを実行するとブラウザの下側にGTMの実行状態が表示されます。

* Previewをクリック
<img width="500" alt="gtm_001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/4644de7c-5438-50eb-395b-cc10b296dba0.png">


* こんなメッセージが表示される。<img width="400" alt="gtm_002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/841da81d-6b3f-c4dc-ee3b-95bd45b3ebb6.png">

* ブラウザの下側に情報が表示されるようになります
<img width="468" alt="gtm_008.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/35b42465-1679-c281-7d65-df80a05429a9.png">


### Google Analytics Debugger - デバッカも入れましょう
https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna?hl=en
Chromeのデバッカのコンソールにて送信内容の確認ができます。
<img width="920" alt="gtm_005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/0d858a2a-9529-1d77-f31e-52d202bdc239.png">


## 送信イベントとトリガ
トリガとイベントに詳しく無かったのでこの辺りに手間取ったので記述しておきます。

### データが送信されない
Googleの説明サイト通りにGTMタグを&lt;head&gt;内と&lt;body&gt;の開始地点に入れdataLayer.push(data)を呼び出してみるが、データが送信されていません。


Web上の情報から以下の方法で送信できるとあったのでやってみました。
1. HTML画面のロード時に送信したいデータをJavaScriptでdataLayer.push()する
2. Window Loadedをトリガに追加すると
<img width="839" alt="Screen Shot 2019-06-29 at 14.37.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/40f88315-bf47-99d3-6837-c548a8f58589.png">

確かにpushしたデータの送信に成功しています。
<img width="749" alt="gtm_007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/911d82a9-eb2a-a435-e674-521a7e8ca7f0.png">


### イベントのタイミングで送信されているのではないか？
<img width="706" alt="gtm_006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/f73b6d89-91ef-2aec-1d5f-50e6ee89d04a.png">
この画像の左側に発生しているイベントが1から4でありますが、MessageのイベントがdataLayer.pushを呼び出した時に発生するイベントの様です。
この時はWindow Loadedがトリガになっていますので、dataLayer.pushの後にデータを送信するトリガが実行されると、そこに積まれていたデータを送信するという動きに見えます。

### 自分でタイミングを指定したい
Window Loaded等の既存のイベントを利用した方法では、ページがロードされるタイミングでdataLayer.pushしたデータは送信できますが、ユーザ操作のイベントでdataLayer.push(data)した情報は送信できないです。

* impression, detail 等の画面表示時にjavascriptが実行されるものは送信される
* click, add（カート追加） といったユーザ操作時のデータは送信できない。

上手い方法があるはずなので、それを探さなければいけません。

### ボタンやリンクのクリックをイベントとしてGoogle Tag Mangerのトリガに登録する？
GTMにはトリガ作成時にCustom Eventを指定して、クリックや値の入力等のイベントから情報を送信することが出来ます。これで上手く行けそうな気がしたのですが、javascript側を書いている現時点でHTMLのフォーマットが明確でなく、この定義を作ってしまうとHTML側に変更があった時に、GTMの設定も変更になってしまいそう。面倒くさそうです。。。

### 勝手にイベント定義してトリガ作ったら上手く動いた
マニュアルにあるようにdataLayer.pushするデータ配列にはeventを定義できます。
https://developers.google.com/tag-manager/enhanced-ecommerce#product-impressions

```javascript
function(productObj) {
  dataLayer.push({
    'event': 'productClick',
    'ecommerce': {
      'click': {
        'actionField': {'list': 'Search Results'},      // Optional list property.
        'products': [{
          'name': productObj.name,                      // Name or ID 
      -----略----------------
    });
}
</script>
```

このイベントをこちらでGTM上で勝手に定義してトリガにしてしまいます。
Tag ManagerのTriggerに新規で以下の様なトリガを作成。
<img width="790" alt="Screen Shot 2019-06-29 at 14.43.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/3d388a81-7a72-78e2-30c0-9e00c2cbc479.png">

これをGoogle Analyticsのタグに登録します。
<img width="849" alt="gtm_009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/cde82665-acd8-03c6-0fff-e52dd51b35f7.png">

Javascriptで商品名やカートの数量変更がクリックされたら、eventをつけてpushします。
<img width="420" alt="Screen Shot 2019-06-29 at 14.50.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/cee4c751-8b35-b506-c18b-e64504fa7eb0.png">


クリックするたびに送信されてくれました。
<img width="1259" alt="gtm_010.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/5ab4f01f-d00f-15dc-9111-428551b3874b.png">

## データが集計されていることを確認
<img width="1157" alt="gtm_011.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375776/02113b06-9c52-aa72-3e6f-855526089438.png">


### 本当のマーケティングを考えるならGAのイベントを用いるべき？
今回、この実装でプログラミング的にはGoogle Analyticsでの定義するイベントを使わなくても、dataLayer.pushからGAサーバへの送信をトリガ出来るということが確認できました。元々マーケティングをガリガリやっているわけではない人たちがGTMと拡張Eコマースを導入するためには、この辺りから始めれば良いのではないかと思われます。
これはGoogleが最終的に意図している使い方かは分かりませんので、最終的にはGAでイベントのセッテイングをしてトリガに紐づけるという方向に持っていけば良いと思います。多くのECサイト開発がそれほど工期と予算に恵まれていることが無いということを考えると一旦拡張Eコマースの集計をお客様に見せて、そこから細かな定義にお話を進めて行くのもありかなぁ。