カスタム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の要件を満たすようにします。カスタムテンプレートのコメントには、動作する例が記載されています。
公開前の開発とデバッグ
開発中にデバッグするための以下の手順を完了します:
- カスタムテンプレートの最後にあるデバッグブロックのコメントを解除します。
- テンプレートを、サポートしたいCMPを実行しているウェブサイトのコンソールに貼り付けます。
- デバッグコードブロックが同意決定を出力します。
- あなたの決定をカスタマイズし、テンプレートを再度貼り付けて新しく解釈された同意決定を確認します。
- テンプレートに満足したら、再度デバッグブロックのコメントを解除して、Tealium iQに貼り付けて公開します。
プロファイルを保存してテンプレートを編集することで、デバッグスニペットを見つけることもできます。
公開後の検証
公開後にテンプレートをデバッグし、検証する方法は2つあります:デバッグモードを使用するか、window.tealiumCmpOutput
オブジェクトを使用するかです。
デバッグモードの使用
デバッグモードを使用するには:
- コンソールで
document.cookie = "utagdb=true"
を使用してutagdb
クッキーをtrue
に構成します。 - コンソールフィルタを構成して、関連する出力のみを表示します(提案されるフィルタはデバッグ出力にあります)。
- 期待通りに動作することを確認するために、異なるオプションをテストします。
window.tealiumCmpOutput
オブジェクトの使用
window.tealiumCmpOutput
オブジェクトを使用するには:
- テンプレートの最後にあるコメントを解除したデバッグコードブロックをコンソールに貼り付けて、あなたの決定と関連する出力のみを出力します。
- 必要に応じて、テンプレートの関数を個別に呼び出すか、このオブジェクトの他の有用なプロパティにアクセスすることもできます。
事前構築された統合とカスタム統合の詳細なデバッグのヒントについては、同意統合の検証とデバッグを参照してください。
統合関数
統合のCMP特有のコンポーネントは、window.tealiumCmpIntegration
オブジェクトを使用して定義されます。
window.tealiumCmpIntegration
オブジェクトは、名前.cmpName
、バージョン.cmpIntegrationVersion
、および以下の関数で構成されています:
動作モードの決定
.cmpCheckIfOptInModel
- 統合がopt-in
モデルまたはopt-out
モデルで動作するべきかを決定します。ブール値を返します。
決定の取得
.cmpFetchCurrentConsentDecision
- 同意決定の現在の生バージョンを取得します(CMPからの生バージョン)。結果はオブジェクトでなければならず、すべての後続の関数に引数として渡されます。
決定の検証と標準化
-
.cmpCheckForWellFormedDecision
- 同意決定の生バージョンが整形されていて理解できるかどうかを確認します。ブール値を返します。 -
.cmpCheckForTiqConsent
- 生の同意決定がTealium iQによるデータ処理の許可を含んでいるかどうかを決定します。偽の場合、何も実行されません。ブール値を返します。 -
.cmpCheckForExplicitConsentDecision
- 生の同意決定がexplicit
(明示的)かimplicit
(暗黙的)かを決定します。ブール値を返します。 -
.cmpConvertResponseToGroupList
- 生の決定を、下流の強制のための許可された目的キーの単純な配列に変換します。同意された目的キーの配列を返します。
カスタム統合テンプレート
以下は、独自のカスタム統合を始めるのに役立つ空白のテンプレートです。テンプレートには、同意統合をデバッグし、検証するために使用できるデバッグスニペットがテンプレートの最後に含まれています。
;(function myCustomConsentIntegration (window) {
/**
* このテンプレートは編集するためのもので、カスタムCMP / キャプチャツールのサポートを自分で構築するためのものです。
*
* 例示コード(コメントアウトされている)は、オプトアウトクッキーをチェックし、2つの決定のいずれかを返す統合から取られています:
* - ['no-selling'](任意の値を持つオプトアウトクッキーが見つかった) - 常に明示的な決定(オプトアウトクッキーが構成されています)
* - ['no-selling', 'yes-selling'](オプトアウトクッキーが見つからない) - 常に暗黙的な決定(クッキーが構成されていません)
*
* オプトアウトクッキーの(大文字と小文字を区別する)名前は、UIの'Vendor 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 = 'Custom Example'
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の単一の関連する統合の'Vendor ID'フィールドに入力されたものを引っ張ってきます
var optOutCookieName = (window.tealiumCmpIntegration && window.tealiumCmpIntegration.map && Object.keys(window.tealiumCmpIntegration.map)[0]) || 'error-no-map-found-so-no-cookie-name-available'
*/
// CMPが'Opt-in'モデル(GDPRスタイル)を実行しているかどうかを真偽値で返すべきです
// このオプトアウトクッキーの例はオプトアウトモデル(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構成を持っていることを確認するのに役立つ文字列を返すべきです(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() ? 'Opt-in' : 'Opt-out'} Model
Checks:
- 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年October月11日