同意統合 - カスタムCMP統合
この記事では、Tealium iQ Consent Integrationsでカスタム同意管理プラットフォームを設定する方法について説明します。
動作原理
Tealium Consent Integrationsは、2つのパートで構成されています。
- Tealium iQの同意強制フレームワーク(
utcm_frameworkテンプレート)。 - Tealium iQの同意強制フレームワークを活用するCMP固有の統合テンプレート。これらの統合テンプレートは、できるだけ軽量に設計されています。
 
当社の事前構築済みの統合は、さまざまな同意管理プラットフォーム(CMP)との統合をサポートしています。ただし、次の場合にはカスタム統合が推奨されます。
- 事前構築済みの統合がないCMPを使用する場合。
 - 同意をキャプチャするための内部ツールを使用する場合。
 - 標準の統合を破壊する大幅なカスタマイズが施されたサポートされているCMPを使用する場合。
 
このような場合、カスタム統合を使用できます。JavaScript関数を使用することで、どの同意キャプチャツールでも強制フレームワークを活用できます。
新しいカスタム統合を追加するには、既存の統合と提供されたテンプレートをガイドとして使用します。
以下は、カスタム統合を作成するための基本的なワークフローの説明です。
- Tealium iQの外部(CMPが実装されているウェブサイト)で統合を開発およびデバッグします。
 - Tealium iQで新しいカスタム同意統合と目的グループを追加します。詳細については、同意統合と目的グループの管理を参照してください。
 - Tealium iQと適切なタグを目的グループ内の目的に割り当てます。
 - テンプレートを作成するために、プロファイルを保存します。
 - 新しく作成したテンプレートを編集します。詳細については、テンプレートの管理を参照してください。
 - テンプレートを開発環境またはテスト環境に公開して、すべてが予想どおりに動作することを確認し、通常のテストおよび公開フローに従います。
 
カスタム統合の開発、デバッグ、検証
カスタムCMP統合を作成するには、以下の手順を完了します。
公開前の開発とデバッグ
開発中にデバッグするには、次の手順を実行します。
- カスタムテンプレートの末尾にあるデバッグブロックのコメントを解除します。
 - テンプレートを、サポートするCMPが実行されているウェブサイトのコンソールに貼り付けます。
 - デバッグコードブロックが同意の決定を出力します。
 - 決定をカスタマイズし、テンプレートを再度貼り付けて新しく解釈された同意の決定を確認します。
 - テンプレートに満足したら、テンプレートをTealium iQに貼り付けて公開する前に、再度デバッグブロックのコメントを解除します。
 
また、プロファイルを保存し、テンプレートを編集することで、デバッグスニペットを見つけることもできます。
公開後の検証
公開後のテンプレートのデバッグと検証には、デバッグモードまたはwindow.tealiumCmpOutputオブジェクトを使用する方法があります。
デバッグモードの使用
デバッグモードを使用するには、次の手順を実行します。
- コンソールで
document.cookie = "utagdb=true"と入力して、utagdbクッキーをtrueに設定します。 - コンソールのフィルタを設定して、関連する出力のみ表示します(デバッグ出力には推奨されるフィルタが含まれています)。
 - 予想どおりに動作するかを確認するために、さまざまなオプションをテストします。
 
window.tealiumCmpOutputオブジェクトの使用
window.tealiumCmpOutputオブジェクトを使用するには、次の手順を実行します。
- テンプレートの末尾にコメントアウトされたデバッグコードブロックをコンソールに貼り付けて、決定と関連する出力のみを表示します。
 - 必要に応じて、テンプレート内の関数を個別に呼び出すか、このオブジェクトの他の有用なプロパティにアクセスすることもできます。
 
事前構築済みおよびカスタム統合の詳細なデバッグのヒントについては、同意統合の検証とデバッグを参照してください。
統合関数
統合のCMP固有のコンポーネントは、window.tealiumCmpIntegrationオブジェクトを使用して定義されます。
window.tealiumCmpIntegrationオブジェクトは、.cmpName、.cmpIntegrationVersionの名前とバージョン、および次の関数から構成されています。
動作モードの判定
.cmpCheckIfOptInModel- 統合がオプトインモデルまたはオプトアウトモデルで動作するかを判定します。ブール値を返します。
決定の取得
.cmpFetchCurrentConsentDecision- 同意の決定の現在の生のバージョン(CMPからの生のバージョン)を取得します。結果はオブジェクトである必要があり、すべての後続の関数に引数として渡されます。
決定の検証と標準化
- 
.cmpCheckForWellFormedDecision- 同意の決定の生のバージョンが正しく形成されて理解可能かどうかをチェックします。ブール値を返します。 - 
.cmpCheckForTiqConsent- 同意の決定にTealium iQによるデータ処理の許可が含まれているかどうかを判定します。falseの場合、何も実行されません。ブール値を返します。 - 
.cmpCheckForExplicitConsentDecision- 同意の決定が明示的または暗黙的かどうかを判定します。ブール値を返します。 - 
.cmpConvertResponseToGroupList- 生の決定を、下流の強制のための許可された目的キーの単純な配列に変換します。同意された目的キーの配列を返します。 
カスタム統合テンプレート
以下は、独自のカスタム統合を作成するための空のテンプレートです。テンプレートの末尾には、同意統合をデバッグおよび検証するために使用できるデバッグスニペットが含まれています。
;(function myCustomConsentIntegration (window) {
  /**
    * このテンプレートは編集するために作成されており、独自のカスタムCMP / キャプチャツールのサポートを構築するために使用します。
    *
    * 例のコード(コメントアウトされています)は、オプトアウトクッキーをチェックし、次の2つの決定のいずれかを返します。
    *  - ['no-selling'](任意の値を持つオプトアウトクッキーが見つかった場合) - 常に明示的な決定(オプトアウトクッキーが設定されています)
    *  - ['no-selling', 'yes-selling'](オプトアウトクッキーが見つからない場合) - 常に暗黙的な決定(クッキーが設定されていません)
    *
    * オプトアウトクッキーの(大文字と小文字を区別する)名前は、UIの「ベンダーID」フィールドから取得されます。
    *
    * 詳細については、https://docs.tealium.com/iq-tag-management/consent-integrations/supported-vendors/#opt-out-cookie--gpc を参照してください。
    * 
    * (上記の統合は、この例のために簡略化されており、GPCロジックは削除されています)
    */
  // CMP固有の機能とラベル
  window.tealiumCmpIntegration = window.tealiumCmpIntegration || {}
  window.tealiumCmpIntegration.cmpName = 'カスタム例'
  window.tealiumCmpIntegration.cmpIntegrationVersion = 'v1.0.0'
  window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision
  window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey
  window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel
  window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision
  window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision
  window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent
  window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList
  /*
  // UIで入力されたベンダーIDを取得する
  var optOutCookieName = (window.tealiumCmpIntegration && window.tealiumCmpIntegration.map && Object.keys(window.tealiumCmpIntegration.map)[0]) || 'error-no-map-found-so-no-cookie-name-available'
  */
  // CMPが「オプトイン」モデル(GDPRスタイル)で実行されている場合はtrueを返す必要があります
  // このオプトアウトクッキーの例は、オプトアウトモデル(CCPA/CPRAスタイル)のみをサポートしているため、ハードコードされたfalseを返します。
  function cmpCheckIfOptInModel () {
    /*
    return false
    */
  }
  // 必要な情報を含む、CMP固有の生のオブジェクト(オブジェクトである必要があります)を返す必要があります
  // この出力は、後続の関数のcmpRawOutput引数として使用されます
  function cmpFetchCurrentConsentDecision () {
    /*
    // ここではタグマネージャの機能を使用できないため、クッキーを読み取る関数を定義します
    var readCookie = function (name) {
      var reString = '(?:(?:^|.*;\\s*)' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'
      var re = new RegExp(reString)
      var cookieValue = document.cookie.replace(re, '$1')
      if (!cookieValue) return undefined
      return cookieValue
    }
    var cookie = readCookie(optOutCookieName) || 'opt-out-cookie-not-found'
    return { cookieState: cookie } // 統合が機能するためにはオブジェクトを返さなければならないため、他のプロパティ(例:Global Privacy Control)を追加できます
    */
  }
  // Tealium iQが正しいCMP構成を持っていることを確認するための文字列を返す必要があります
  function cmpFetchCurrentLookupKey () {
    /*
    return optOutCookieName
    */
  }
  // ブール値を返す必要があります。生の決定がCMPの期待に合致している場合はtrueです
  function cmpCheckForWellFormedDecision (cmpRawOutput) {
    /*
    return typeof cmpRawOutput === 'object' && typeof cmpRawOutput.cookieState === 'string'
    */
  }
  // ブール値を返す必要があります。同意の決定がユーザーによって明示的に行われた場合はtrueです
  function cmpCheckForExplicitConsentDecision (cmpRawOutput) {
    /*
    // この例では、決定が明示的かどうかを判断する唯一の方法は、オプトアウトクッキーが設定されているかどうかを確認することです
    if ((typeof cmpRawOutput === 'object' && typeof cmpRawOutput.cookieState === 'string' && cmpRawOutput.cookieState !== 'opt-out-cookie-not-found')) return true
    return false
    */
  }
  // 同意されたベンダー/目的の配列を返す必要があります。これらはTealium iQの目的と完全に一致する必要があります
  function cmpConvertResponseToGroupList (cmpRawOutput) {
    /*
    var consentDecision = ['no-selling'] // データを販売/共有しないタグは常に許可されます
    // セルデータを販売するタグが許可されているかどうかを判断するための非常にシンプルなオプトアウトクッキーのチェック
    if (cmpRawOutput.cookieState === 'opt-out-cookie-not-found') {
      consentDecision.push('yes-selling') // クッキーが見つからないため、データの販売/共有は問題ないと仮定する必要があります
    }
    return consentDecision
    */
  }
  // この関数やそれ以下の内容を変更する必要はありません
  function cmpCheckForTiqConsent (cmpRawOutput, tiqGroupName) {
    // 理解できないものはオプトアウトとして扱います
    if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false
    tiqGroupName = tiqGroupName || 'tiq-group-name-missing'
    var allowedGroups = cmpConvertResponseToGroupList(cmpRawOutput)
    return allowedGroups.indexOf(tiqGroupName) !== -1
  }
})(window)
/*
  // デバッグ/開発出力 - このブロックのコメントを解除し、テストページにこのテンプレート全体を貼り付け/再貼り付けします
  var outputString = `${tealiumCmpIntegration.cmpCheckIfOptInModel() ? 'オプトイン' : 'オプトアウト'} モデル
  チェック:
    - id:          ${tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
    - well-formed: ${tealiumCmpIntegration.cmpCheckForWellFormedDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
    - explicit:    ${tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
    - group list:  ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToGroupList(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()))}
  `
  console.log(outputString);
*/
最終更新日 :: 2024年April月12日