【Tag Manager】計測する要素を一元管理して効率よくアクティブ表示回数と時間を計測をする

前の記事では、Google Tag Manager(GTM)を使用して、CSSクラスまたはIDをもとに要素の表示回数を取得する方法を解説しました。

この計測方法では、対象要素のわずか1%でも画面に表示されると表示回数としてカウントされるため、ユーザーが実際にそのエリアを視認したかどうかは不明確です。

そこで本記事では、Google AdSenseの基準に基づき、エリアの50%以上が1秒以上画面に表示された場合を「アクティブ表示回数」として計測します。

アクティブ ビューは広告の視認性を測定する Google のソリューションであり、AdSense が配信する広告の視認性をトラッキングするために使用します。視認性を測定すると、ユーザーが実際に広告を見た可能性を把握することができます。広告は、全体の 50% 以上が 1 秒以上画面に表示された場合に「視認可能」と見なされます(Interactive Advertising Bureau(IAB)規格に基づく最低限の基準です)。画面の視認可能領域に表示される広告の面積の割合と、表示される時間がポイントとなります。

https://support.google.com/adsense/answer/3481946?sjid=2400602541293284140-AP

この記事では、計測する要素を一元管理するためのユーザー定義変数を活用し、効率的に要素のアクティブ表示回数とアクティブ表示時間を計測する手順を解説します。

スポンサーリンク

事前準備

この設定を行う前に、前回の記事で紹介した管理変数を作成しておく必要があります。
まだ作成していない場合は以下の記事を参考にして作成してください。

Google Tag Managerの設定

見出し

タグやトリガーなどの名前は自由に設定できますが、変更するとコードの修正が必要になる場合があります。
この記事で使用する名称をそのまま使うことを推奨します。

最小視認範囲の設定

チェック

別記事でconstant-actImp-minAreaという変数をすでに作成している場合は飛ばしてください。

アクティブ表示とみなす最小視認範囲を変数で設定します。

  • STEP 1-1

    「変数 > 新規」を選択。

  • STEP 1-2

    変数名を「constant-actImp-minArea」とします。

  • STEP 1-3

    「変数の設定 > 定数」を選択。

  • STEP 1-4

    「変数の設定 > 値」「50」と入力。

補足
ここで設定した値(%)以上でアクティブ表示の表示割合を満たすとみなされます。
値は0をこえ、100以下となる値で設定しましょう。

最小表示時間の設定

チェック

別記事でconstant-actImp-minMsecという変数をすでに作成している場合は飛ばしてください。

アクティブ表示とみなす最小表示時間を変数で設定します。

  • STEP 2-1

    「変数 > 新規」を選択。

  • STEP 2-2

    変数名を「constant-actImp-minMsec」とします。

  • STEP 2-3

    「変数の設定 > 定数」を選択。

  • STEP 2-4

    「変数の設定 > 値」「1000」と入力。

補足
ここで設定した値(ミリ秒)以上、エリアの50%が連続して表示されるとアクティブ表示とみなされます。
値は0をこえる値で設定しましょう。

アクティブ表示回数と時間を取得するイベントの作成

計測する要素のアクティブ表示回数をまとめて取得するため、GTMデフォルトのトリガーではなくカスタムイベントを使用します。

  • STEP 3-1

    「タグ > 新規」を選択。

  • STEP 3-2

    タグ名を「event-endImp-element」とします。

  • STEP 3-3

    「タグの設定 > タグの種類 > カスタムHTML」を選択。

  • STEP 3-4

    「HTML」エリアに以下のコードを記載。

    <script>
    (function() {
      var minArea = {{constant-actImp-minArea}} / 100;
      var minDur = {{constant-actImp-minMsec}};
      var firedElements = new Set(); // push済み要素を記録する
      var timeData = new Map();
      
      var selector = Object.keys({{constant-elem-selList}})
        .filter(function(key) {
          return !/[\u3040-\u30FF\u4E00-\u9FFF\uFF66-\uFF9F]/.test(key); // 日本語を含むキーを除外
        })
        .join(',');
      
      window.dataLayer = window.dataLayer || [];
      
      // イベントのpush
      function pushToDataLayer(element, startTime) {
        var duration = Math.round(performance.now() - startTime);
        if (duration >= minDur) {
          var selectorString = element.tagName.toLowerCase();
          if (element.id) {
            selectorString += '#' + element.id;
          }
          if (element.classList.length > 0) {
            selectorString += '.' + Array.from(element.classList).join('.');
          }
          window.dataLayer.push({
            'event': 'event-endImp-element',
            'variable-elem-impDur': duration,
            'gtm.element': selectorString
          });
          firedElements.add(element); // push済み要素として記録
          observer.unobserve(element);
        }
      }
    
      // 状態変化ごとに監視
      function startObserving(entries) {
        entries.forEach(function(entry) {
          var element = entry.target;
    
          if (entry.intersectionRatio >= minArea && !timeData.has(element)) {
            timeData.set(element, performance.now());
          } else if (entry.intersectionRatio < minArea && timeData.has(element)) {
            if (!firedElements.has(element)) {
              pushToDataLayer(element, timeData.get(element));
              timeData.delete(element);
            }
          }
        });
      }
    
      // visibilitychange
      function handleVisibilityChange() {
        if (document.visibilityState === 'hidden') {
          performCleanup();
        }
      }
    
      // beforeunload pagehide
      function performCleanup() {
        timeData.forEach(function(startTime, element) {
          pushToDataLayer(element, startTime);
        });
        timeData.clear();
      }
    
      // IntersectionObserverのインスタンスを作成
      var observer = new IntersectionObserver(startObserving, {
        threshold: [minArea]
      });
    
      // 監視対象の要素を設定
      document.querySelectorAll(selector).forEach(function(element) {
        if (!firedElements.has(element)) {
          observer.observe(element);
        }
      });
    
      // イベントリスナーを追加
      document.addEventListener("visibilitychange", handleVisibilityChange);
      window.addEventListener("beforeunload", performCleanup);
      window.addEventListener("pagehide", performCleanup);
    })();
    </script>
    Code language: HTML, XML (xml)
  • STEP 3-5

    「詳細設定 > タグ呼び出しオプション > 1ページにつき1度」を選択。

  • STEP 3-6

    「トリガー > All Pages」を選択。

補足
このイベントはエリアの50%以上が1秒以上継続して表示されたあと、50%以下の表示になった場合に測定されます。

アクティブ表示時間取得変数の作成

  • STEP 4-1

    「変数 > 新規」を選択。

  • STEP 4-2

    変数名を「variable-elem-impDur」とします。

  • STEP 4-3

    「変数の設定 > 変数のタイプ > データレイヤーの変数」を選択。

  • STEP 4-4

    「データレイヤーの変数名」「variable-elem-impDur」と記載。

補足
このトリガーは先ほど作成したアクティブ表示時間取得イベントによって得られた表示時間(ミリ秒)を変数として取得します。

アクティブ表示を計測するトリガーの作成

  • STEP 5-1

    「トリガー > 新規」を選択。

  • STEP 5-2

    トリガー名を「trigger-endImp-element」とします。

  • STEP 5-3

    「トリガーの設定 > トリガーのタイプ > カスタムイベント」を選択。

  • STEP 5-4

    「イベント名」「event-endImp-element」と記載。

補足
このトリガーは先ほど作成したアクティブ表示時間取得イベントが起こる度に動作します。

配信タグの作成

  • STEP 6-1

    「タグ > 新規」を選択。

  • STEP 6-2

    タグ名を「tag-endImp-element」とします。

  • STEP 6-3

    「タグの設定 > タグの種類 > Googleアナリティクス > Googleアナリティクス:GA4イベント」を選択。

  • STEP 6-4

    「測定ID」「送信先Google Analyticsの測定ID」を記載。

    見出し

    測定IDは以下の手順で確認できます。

    「Google Analytics > 管理 > データの収集と修正 > データストリーム > (ストリーム名)」

    管理上の観点からGTM側で変数にしておくことをおすすめします。

  • STEP 6-5

    「イベント名」「tag-endImp-element」と記載。

  • STEP 6-6

    「イベントパラメータ」で以下を設定。

    イベントパラメータ
    GTM_element_selector{{variable-elem-selector}}
    GTM_endImp_element_duration{{variable-elem-impDur}}
    GTM_endImp_element_count1
  • STEP 6-7

    「トリガー > 配信トリガー > trigger-endImp-element」を選択。

Google Analyticsの設定

カスタムディメンションの作成

チェック

別記事で「GTM_element_selector」というカスタムディメンションをすでに作成している場合は飛ばしてください。

  • STEP 7-1

    「管理 > データの表示 > カスタム定義」を選択。

  • STEP 7-2

    「カスタム定義 > カスタムディメンション > カスタムディメンションを作成」を選択。

  • STEP 7-3

    以下の情報を入力します。

    ディメンション名GTM_element_selector
    イベントパラメータGTM_element_selector

補足
このディメンションでは要素の管理変数で定義された返却パラメータが表示されます。

カスタム指標の作成

  • STEP 8-1

    「管理 > データの表示 > カスタム定義」を選択。

  • STEP 8-2

    「カスタム定義 > カスタム指標 > カスタム指標を作成」を選択。

  • STEP 8-3

    以下の情報を入力します。

    指標名GTM_endImp_element_duration
    イベントパラメータGTM_endImp_element_duration
    測定単位ミリ秒

補足
この指標では要素のアクティブ表示時間が表示されます。

  • STEP 9-1

    「管理 > データの表示 > カスタム定義」を選択。

  • STEP 9-2

    「カスタム定義 > カスタム指標 > カスタム指標を作成」を選択。

  • STEP 9-3

    以下の情報を入力します。

    指標名GTM_endImp_element_count
    イベントパラメータGTM_endImp_element_count
    測定単位標準

補足
この指標では要素のアクティブ表示回数が表示されます。

設定完了

これで、計測する要素のアクティブ表示時間をGoogle Analyticsで確認できるようになりました。
また、Analyticsを別サービスと連携すれば、もちろんそのサービスでも確認が可能です。

他の計測イベントの設定方法を以下の記事の最後にまとめていますので確認してみてください。

コメント

タイトルとURLをコピーしました