タグマネージャーツール設置方法まとめ【2019年更新】

タグマネジメントツール(タグマネージャー)まとめ。
GTM、Yahooタグマネージャー(YTM)、DTMについて、それぞれの特徴と設置方法、設置位置について解説。

タグマネジメントそのものについては以下を参照
→ https://www.innovation.co.jp/b2blog/tag-management/

#タグマネジメントツール紹介

##Google Tag Manager（GTM）
Google社が提供しているタグマネジメントツール。
「技術系の人向け」と言われることが多いが、スクロールイベントやページ滞在時間によるタグ発火制御など、イベントドリブンな[タグ発火制御を予め用意されている機能により容易に実現](https://support.google.com/tagmanager/answer/6106961?hl=ja)できるので、**ちょっとでも複雑なことをしたいなら**非技術系の人にこそオススメ。
https://www.google.com/intl/ja/analytics/tag-manager/

Google系プロダクトとの連携が強力でGoogleアナリティクスの複雑な設定を超簡単に行ったり、[Google広告のITP対応を数クリックで完了させる](https://anagrams.jp/blog/new-conversion-tracking-method-of-google-adwords-in-2017/)ことができる。
特にGoogleアナリティクスのタグは後々のメンテナンスコストを考えるとGoogle Tag Manager経由でサイトに設置することを強く推奨したい。

###タグ発行の方法
コンテナ開いてすぐ表示される、右上のID部分をクリックすることでGTMタグを確認することができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/02ae3a34-3a6d-66d7-7e25-cb1e9fe2e79e.png)

↓赤枠部分をクリックでGTMタグを表示

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/89b7f2a5-7bad-b9bd-3432-0d7ee0ab5f14.png)


###GTMのタグ設置位置
GTMタグはhead内に設置するJavaScriptタグとbody内に設置するnoscriptタグに分かれている。
#### JavaScriptタグ
head内直下、なるべく上に設置（但し、dataLayerなど**GTM内で使う可能性のあるJavaScript変数の宣言箇所より下**）
「head内直下でなるべく上」が公式に推奨されている設置位置ではあるものの、[GTMの公式サイト](https://www.google.com/intl/ja/analytics/tag-manager/)等のソースを見るかぎり、以下の記述より下に置くことをお勧め。

- metaタグ
- 外部CSSファイル読み込み
- GTM内で使う可能性のあるJavaScript変数宣言(dataLayerなど)
- ページ内容を変更するJavaScriptコード
- リダイレクトを行うJavaScriptコード

```html:JavaScriptタグの設置サンプル
<head>
  <meta charset="utf-8">
  <meta content="initial-scale=1, minimum-scale=1, width=device-width" name="viewport">
  <title>タイトル</title>
  <meta name="description" content="">
  <link rel="stylesheet" href="hoge.css">
  <link href="/hoge/hogehoge/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <link href="https://www.hoge.com/hoge/hoge/" rel="canonical">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <script>window.jQuery || document.write('<script src="/common/js/jquery/jquery-2.2.4.js"><\/script>')</script>

  <script>
    /*
    [[JavaScript変数の宣言(タグマネ系のコードよりも上に記述)]]
    */
  </script>
  
  <script>
    // [[dataLayerなど、Google Tag Manegerなどで使用するJavaScript変数の宣言(タグマネ系のコードよりも上に記述)]]
    dataLayer = [{
      'pageCategory': 'signup',
      'visitorType': 'high-value'
    }];
  </script>

  <!-- 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-XXXXXXX');</script>
  <!-- End Google Tag Manager -->

    /*
    ︙ その他諸々のhead内の内容
    */
</head>
```


#### noscriptタグ
body内直下、なるべく上に設置（注意事項をコードの下にも記述）
「bodyの中のdivの中にGTMタグ設置」の様にせずに、必ずbodyタグの直接の子要素としてGTMを設置すること。
サーチコンソールの所有者確認時など、何かしら後々困るシーンが発生することがある。

```html:noscriptタグのサンプル
<body>
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXXX"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->
    /*
    ︙ その他諸々のbody内の内容
    */
</body>
```

2016年9月28日にJavaScriptタグの貼り付け推奨位置がbody内からhead内に移動。
非同期読み込みやCDN技術の利用などで相当速さに自信があると見た。

~~noscriptタグはHTMLの仕様上body内にしか設置できないので注意。~~
HTML5から[noscript要素自体はhead内での使用が許可されている。](https://developer.mozilla.org/ja/docs/Web/HTML/Element/noscript)
しかし、headに設置されたnoscript内でiframeを動作させることは許可されていないので、どの道**GTMのnoscriptタグはbody内に設置しなくてはならない。**
HTML5にてheadに設置されたnoscript要素内に記述が許可されているのは link,style,metaタグのみ。


##GTMのタグを複数設置するとき
head内JavaScriptタグ、body内noscriptタグのそれぞれで上下に複数のGoogle Tag Manegerタグを並べて使用する。
出来るには出来るが、パフォーマンスの観点や、GTM内に設定したタグ同士の干渉トラブル発生のリスク、トラブル対応の工数増大を考えると**複数設置はなるべく避けたい**。
https://developers.google.com/tag-manager/devguide#multiple-containers

```html:head内JavaScriptタグ
<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-XXXXXX');
</script>

<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-YYYYYY');
</script>
```

```html:body内noscriptタグ
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-YYYYYY" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
```


###トラブルシューティング
強力なプレビューツールとChrome拡張機能「[Tag Assistant](https://chrome.google.com/webstore/detail/tag-assistant-by-google/kejbdjndbnbjgmefkgdddjlbokphdefk?hl=ja)」で問題発生時の対応も楽々。
https://support.google.com/tagmanager/answer/6103683?hl=ja

稼働を簡易確認したいときは、デベロッパーツールのConsoleで変数`google_tag_manager`の中身を確認すると手軽。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/6484dd93-641e-73d7-7ead-cf27e1af1f78.png)


仕様上の問題を疑ったときなどは[公式ユーザーフォーラム](https://productforums.google.com/forum/#!forum/tag-manager)を覗くと捗る。

##Yahoo!タグマネージャー（YTM）
Yahoo!JAPANが[Singal社(旧BrightTag)](https://www.signal.co/)の技術を用いて提供しているタグマネージャー。
広告媒体社が発行する成果測定用のタグについて、「[タグカタログ機能](https://tagmanager.yahoo.co.jp/feature/#)」により殆どのタグにテンプレートが用意されているため、広告アカウント固有のID情報などをフォームに入力するだけでタグ設置作業が完了する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/1d98f061-9b9d-3c2a-cd75-83e33b2744d2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/a459bbc9-c709-3fe0-e023-7928a4af563f.png)

**[捻ったことをしようとしないかぎり](#ytmで捻ったことをしようとして書いた記事)**は、広告代理店の非技術系の人でもHTMLやJavaScriptを1文字も触ることなくタグ設置作業を完了できて楽々。(逆に、ちょっとでも捻ったことをしようとすると途端にややこしくなる。)
使用にはYahoo!プロモーション広告の利用登録が必要。

https://tagmanager.yahoo.co.jp/

### 注意 Yahoo!タグマネージャーはITP2.0非対応（最新版は対応。追記アリ）
4月24日以前に発行されたYTMのユニバーサルを使用している場合、「サンクスページに訪問した顧客」「商品ページを訪問した顧客」といった動作条件を「ページの設定」を用いた通常のやり方でタグに設定した場合、そのタグはITP2.0が有効なSafari12以降のブラウザを利用しているサイト訪問者に対して動作しない。

YTMのページ設定機能はJavaScriptによる`location.href`ではなく、HTTPヘッダ内のHTTPリファラ情報に基づいて動作するが、ITP2.0が有効なブラウザではドメイン部分以外の情報を削った上でHTTPリファラを送信するため。

例えば、ITP2.0が有効なSafariブラウザで https://example.com/form/thanks というページに訪問しても、
YTMのページ設定機能からはhttps://example.com/ までしか見えない。

一応カスタムデータエレメントで`location.href`を取得するように設定した上でタグ実行条件側でタグが動作するページを指定すればこの問題を回避可能。

#### ITP2.0による影響の回避方法
1. データディクショナリで「ページURL」を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/ce366dec-3e14-b1d3-95ca-2b707b6eaa86.png)

2. すべてのページで発火するように設定したページ設定にてデータバインディング設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/c4cc090d-1991-a91b-81e0-259010af426f.png)

3. タグの実行条件設定にて「どんなURLでタグが発火してほしいか」設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/635280fc-5fe8-36b2-45a3-541fa7854879.png)


#### 追記：YTMのユニバーサルタグを最新版に変更することで問題の回避が可能
YTMのユニバーサルタグを新しいものに変更することでこの問題に対処可能

- [Yahoo! JAPANユニバーサルタグの書式変更について - 活用サポート- Yahoo!データビジネス](https://yahoo-databusiness.tumblr.com/post/183719396837/ytm40)
- [【スポンサードサーチ・YDN】コンバージョン測定補完機能およびYahoo!タグマネージャー タグカタログの提供開始について - Yahoo!プロモーション広告](https://promotionalads.yahoo.co.jp/support/release/659775.html)


###タグ発行の方法
①管理画面の「ウェブサイト」をクリック→②「Yahoo! JAPANユニバーサルタグ」をクリックすることでYTMタグを確認することができる。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/427dd887-68eb-e630-2a7a-4bc890b33ffa.png)


###YTMのタグ設置位置
body内直下、なるべく下に設置
※不具合の原因になるので、「bodyの中のdivの中にYTMタグ設置」の様にせずに、必ず「bodyの中に直接YTMを設置」する。

###YTMのタグを複数設置するとき
各Yahooタグマネージャーアカウントに固有のSiteID部分を`XXXXXXX,YYYYYYY,ZZZZZZZ`のようにカンマ区切りで指定することにより、同一ページを複数のYahooタグマネージャーアカウントで管理することができる。

```js:複数YTM使用時のJavaScript部分
tagjs.src = "//s.yjtag.jp/tag.js#site=XXXXXXX,YYYYYYY,ZZZZZZZ";
```

```html:複数YTM使用時のiframe部分
<iframe src="//b.yjtag.jp/iframe?c=XXXXXXX,YYYYYYY,ZZZZZZZ" width="1" height="1" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>
```

但し、これをやると[タグインスペクターツール](https://chrome.google.com/webstore/detail/%E3%82%BF%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9A%E3%82%AF%E3%82%BF%E3%83%BC/nikcdgjiijbpbbmbnhnghnpkemhhojhi)が使用できなくなる、不具合発生の恐れがある等、公式でも推奨されていない。
https://help.marketing.yahoo.co.jp/ja/?p=4698

```html:Yahooタグマネージャー複数設置
<script id="tagjs" type="text/javascript">
  (function () {
    var tagjs = document.createElement("script");
    var s = document.getElementsByTagName("script")[0];
    tagjs.async = true;
    tagjs.src = "//s.yjtag.jp/tag.js#site=XXXXXXX,YYYYYYY,ZZZZZZZ";
    s.parentNode.insertBefore(tagjs, s);
  }());
</script>
<noscript>
  <iframe src="//b.yjtag.jp/iframe?c=XXXXXXX,YYYYYYY,ZZZZZZZ" width="1" height="1" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>
</noscript>
```

###トラブルシューティング
Chrome拡張機能「[タグインスペクターツール](https://chrome.google.com/webstore/detail/%E3%82%BF%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9A%E3%82%AF%E3%82%BF%E3%83%BC/nikcdgjiijbpbbmbnhnghnpkemhhojhi)」を使ってタグが発火しているかどうか確認する。
でも[デベロッパーツール使って調べる](https://qiita.com/AQRiL_1132/items/f461a5b235a58ef8d32b)方が楽。公式ドキュメントなどの情報に乏しいため、自力で検証が基本になる。
https://tagmanager.yahoo.co.jp/download/

稼働を簡易確認したいときは、[デベロッパーツールのConsoleで変数`BrightTag.instance.site`の中身を確認する](https://qiita.com/aqril_1132/items/a0f7e81a772006847ec3)と手軽。
設置されているYTMのSiteIDを確認することができる。

イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/6adb9bbd-398d-c201-b92b-4756ef22e01b.png)

####まめちしき
#####タグインスペクター
一番最後に記述されたSiteIDに紐付いたYTMアカウントのみタグインスペクターを使用することができる。
上記の例だと、SiteIdが`ZZZZZZZ`のYTMアカウントのみタグインスペクターツールを起動できる。
ただし、途中に不正なSiteIdが記録されていると起動できない等、上手く動かないケースが複数ある様子。

#####自分のSiteIDを簡単に知りたいとき
YTM管理画面のURLにはSiteID情報が含まれている。

```
https://control.theyjtag.jp/sites/[[ここにSiteIDが入ります]]/
```

<!--
なので、`BrightTag.instance.site`から抜き出したSiteIdをURL部分に入れて管理画面のURLにアクセスしてみることで、
埋め込まれているYTMが自分が管理しているものなのかすぐ分かる。
以下のコードをConsoleで走らせるとURLを表示してくれる。

```js:
Array.prototype.forEach.call(BrightTag.instance.site.split(","),function(siteId){console.log('https://control.theyjtag.jp/sites/'+siteId)});
```
-->

#####一部タグカタログには発火順序の制御機能付き
Facebook広告用の計測タグなど、タグカタログを使って設置したタグは必要な発火順序の制御を裏でこっそりやってくれることがある。

#####各広告媒体のタグが直近で新しくなっている場合
2018年現在、AppleのSafariブラウザITP導入への対応で広告媒体が発行する計測タグが数多く更新されているが、タグカタログにより出力される計測タグが新しいタグに更新されていないケースがあるので注意。その時は[スマートカスタムタグ機能](https://help.marketing.yahoo.co.jp/ja/?p=10544)を利用する。


##Adobe Dynamic Tag Management（DTM）
Adobe社が提供するタグマネジメントツール。
とにかく高機能。柔軟なタグ発火制御ができるが、故に使いこなすまで大変、らしい。
（私は触ったことありません...）
使用にはAdobe Marketing Cloudの利用登録が必要。
https://marketing.adobe.com/resources/help/ja_JP/dtm/c_overview.html

###タグ設置位置
- head内直下、なるべく上にヘッダーコード
- body内直下、なるべく下にフッターコード

https://marketing.adobe.com/resources/help/ja_JP/dtm/t_add_header_fooder_code.html


###複数設置するとき
複数設置したらダメ。人的な理由で触れる範囲を制限したいときはユーザー管理機能や[Webプロパティ](https://marketing.adobe.com/resources/help/ja_JP/dtm/web_property.html)を利用する。
>単一ページに複数の埋め込みコードを含める使い方は、衝突の原因になるのでサポートされていません。
> https://marketing.adobe.com/resources/help/ja_JP/dtm/deployment.html

#タグマネジメントタグ設置サンプル
GTMとYTMを設置した状態のhtmlサンプル。
Googleのサイトのソースコード等を参考に作成。

```html:
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta content="initial-scale=1, minimum-scale=1, width=device-width" name="viewport">
    <title>タイトル</title>
    <meta name="description" content="">
    <link rel="stylesheet" href="hoge.css">
    <link href="/hoge/hogehoge/favicon.ico" rel="shortcut icon" type="image/x-icon">
    <link href="https://www.hoge.com/hoge/hoge/" rel="canonical">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="/common/js/jquery/jquery-2.2.4.js"><\/script>')</script>
  
    <script>
      /*
      [[JavaScript変数の宣言(タグマネ系のコードよりも上に記述)]]
      */
    </script>
  
    <script>
      // [[dataLayerなど、Google Tag Manegerなどで使用するJavaScript変数の宣言(タグマネ系のコードよりも上に記述)]]
      dataLayer = [{
        'pageCategory': 'signup',
        'visitorType': 'high-value'
      }];
    </script>
  
    <!-- Google Tag Manager:head内なるべく上 -->
    <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-XXXXXX');
    </script>
    <!-- End Google Tag Manager -->
  
    <style type="text/css">
      /* [[HTML内でのCSS宣言]] */
    </style>

    <!--
      [[headの他の内容]]
    -->
  </head>

  <body>
    <!-- Google Tag Manager (noscript):body内なるべく上 -->
    <noscript>
      <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
    </noscript>
    <!-- End Google Tag Manager (noscript) -->

    <!--
      [[bodyの他の内容]]
    -->

    <!-- Yahoo!タグマネージャー:bodyの最後 -->
    <script id="tagjs" type="text/javascript">
      (function () {
        var tagjs = document.createElement("script");
        var s = document.getElementsByTagName("script")[0];
        tagjs.async = true;
        tagjs.src = "//s.yjtag.jp/tag.js#site=XXXXXXX";
        s.parentNode.insertBefore(tagjs, s);
      }());
    </script>
    <noscript>
      <iframe src="//b.yjtag.jp/iframe?c=XXXXXXX" width="1" height="1" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>
    </noscript>
    <!-- End Yahoo!タグマネージャー -->
  </body>
</html>
```

「もっとこうした方がいいよ!」というご意見がありましたら
コメント頂けますと嬉しいです(`・ω・)ゞ

#おまけ
###タグマネに頼るなら対策した方が良い「Google Web Light」
スマホユーザーがGoogle検索経由でサイトに訪問した場合、稀にタグマネ経由で設置したタグが全部まとめて動作しなくなるケースがある。原因はGoogleによる自動サイト軽量化。
ページ読込高速化のためにYTMは勿論、自社プロダクトのGTMも容赦なく無効化してくる。.htaccessなどの設定により自動軽量化を拒否できる。

- [【メモ】Googleの低速モバイルアクセスに対する自動軽量化ページを拒否する設定 | アフィリエイト野郎！](http://afi8.com/2017/07/07/14953/)
- [検索されたモバイルページを軽量化して読み込みを高速化する - Search Console ヘルプ](https://support.google.com/webmasters/answer/6211428?hl=ja)

###GTMのおかげで楽々実現できるもの
- [シャープ記号(#)付きのURLをGoogleアナリティクスで測定する - Qiita](https://qiita.com/AQRiL_1132/items/3e9061d349dc580e4ad7)
- [【GTM】iframe内でタグを発火させないトリガー設定 - Qiita](https://qiita.com/aqril_1132/items/8f84e5fcaff8b100c2c5)
- [Googleタグマネージャへ新たに「スクロール距離」トリガーと「要素の表示」トリガーが登場 - アユダンテ](https://ayudante.jp/column/2017-10-24/13-04/)
- [GTMでYouTube動画の計測に便利なトリガーが実装 - アユダンテ](https://ayudante.jp/column/2017-09-15/17-41/)
- [【GTM】Yahoo!SS・YDNのリニューアル版タグの設置方法 - Qiita](https://qiita.com/aqril_1132/items/205a95e07637ce30bc76)

###YTMで捻ったことをしようとして書いた記事
- [Yahooタグマネージャー内で無理やりjQueryを使う方法 - Qiita](https://qiita.com/AQRiL_1132/items/49a2e4f3510fe72c6123)
- [Yahooタグマネージャーのデータバインディング機能をマニアックに使いこなす - Qiita](https://qiita.com/AQRiL_1132/items/a9714ddb9a76b5d75b2b)
- [時間経過により何かするためのJavaScriptコード - Qiita](https://qiita.com/AQRiL_1132/items/12e1547b9bc1002033de)
- [目的のスクロール量到達を検知して何かするためのJavaScriptコード](https://qiita.com/AQRiL_1132/items/4212d8ccc0abda83141d)
- [Chrome開発者ツールを使った計測タグの動作確認方法（Network編） - Qiita](https://qiita.com/AQRiL_1132/items/f461a5b235a58ef8d32b)