この機能の概要
Google Ad Managerとの連携により、Piano Audience で作成したセグメントをGoogle Ad Manager でターゲティング条件として利用できるようになります。
前提
-
Piano Insightのセットアップが完了していること(サイトグループIDがこの設定には必要となります)
-
ユーザーはこの連携を使用するための設定が必要です(後述 「Google Ad Manager側の手順」でご案内しています)
-
最新情報は https://docs.piano.io/google-ad-manager-integration/ や https://docs.piano.io/configuring-google-ad-manager/ をご参照下さい。
設定の流れ
-
Google Ad Managerの設定を行います
-
Piano Audienceの設定を行います。
-
Google Ad Manager広告タグの修正を行います。
Google Ad Manager上でのセグメント利用開始可能時期について
Google Ad Manager 上での広告配信について、連携したセグメントが使用可能になるまで少なくとも数日から数週間を要す模様です。残念ながら、ここでかかる時間については Google Ad Manager での処理、仕様に依存するため、いつ反映されるかは弊社では知る術がなく、この処理を早めるような手段もありません(Google社との調整もできません)。
Audience画面での設定により定期的にGoogle Ad Manager に Piano Audience で作成したセグメントID、セグメント情報が連携されます。一方、下記でご案内する連携タグを設定することで Google Ad Manager 側にどのユーザーがどのセグメントIDに属するかの情報が連携されます。したがって該当するユーザーがページにアクセスして初めて、セグメントに属するメンバー情報が Google Ad Manager にて蓄積されます。一方、Google Ad Manager には一定数のユーザーが蓄積されなければ広告配信にそのセグメントが利用できない制約がある模様で、セグメントによってそこに要する時間が異なるようです。
新規に作成されたセグメントを販売してすぐに広告配信に使用されたいという場合、それが利用可能になるまでに前述の数日から数週間程度のリードタイムが必要となりますのでご注意ください。
Google Ad Manager側の手順
-
Google Ad Managerを開きます。
-
「管理者」タブをクリックします。
-
「ネットワーク設定」メニューをクリックします。
-
「全てのネットワーク設定」のサブメニューをクリックします。
-
「API アクセス」 設定のステータスを確認します。チェックマーク アイコン
が表示されていれば、API アクセスは既に有効です。
-
赤い円形
が表示されている場合は、そのアイコンをクリックします。
以下のようなポップアップが表示されますので、「同意する」を選択して設定を「保存」して下さい。
”サービスアカウントユーザを追加”ボタンをクリックし、Piano Audience用のユーザーとして以下を設定します。
-
-
名前: Cxense DMP
-
Email: cxense-dfp-api@cxense-dmp-252818.iam.gserviceaccount.com
-
役割: 管理者
-
-
「保存」ボタンをクリックして下さい。
-
この後の手順で必要としますのでGoogle Ad NetworkのネットワークIDを忘れないようメモしておいて下さい。
Piano Audience側の手順
-
Piano Audience (https://audience.piano.io/ ) を開きます
-
「他サービスとの接続」をクリックし、「設定」タブを選択します。
-
右上のメニューから設定を行うサイトグループを選択してください。
-
各種接続先メニューから「Google Ad Manager」を選び「設定」をクリックします。
-
「接続情報設定」にてプロジェクト名(任意)、ネットワークコード(ネットワークID)、
同期モード(「統合(追加と更新(消去なし))」/「置き換え(全消去後に追加)」)、ターゲティングキー名(任意)を入力してください。
ターゲットキー名はデフォルトで CxSegments としていますが、
以降の 「Google Ad Manager 広告タグの修正」で指定する名称となります。
入力後に「接続テスト」をクリックして、テストに成功すると右上の「アクセスを要求」ボタンが有効化されます。 -
「セグメントの選択」 をクリックすると、セグメントの選択画面が開きます(「接続テスト」に成功すると確認可能です)。
「すべてのセグメント/セグメントを手動で選択」で連携するセグメントを設定します。
上記設定で有効化された「アクセスを要求」をクリックしてアクセス要求が承認されると、
「エクスポート実行」ボタンが有効化されます。有効化されたらボタンをクリックし、設定したセグメントをエクスポートします。
-
「有効化」をクリックすると、「接続を有効化」ボタンが確認できます。ここまでで問題なければ、クリックして有効化します。
-
設定が完了し有効化された設定は「接続」タブより確認できます。同期設定がいつ実行されたかはこちらから確認できます。
-
設定を変更したい場合は設定したプロジェクト名にマウスオーバーすると「•••」マークが表示されますので、
これをクリックすることで上記で設定した接続情報の変更や選択したセグメントの変更、セグメント情報の即時エクスポート、接続の無効化
を設定することができます。設定した情報そのものを削除したい場合にはサポートまでご連絡ください。
同期モードの設定にはご注意ください。一つのGoogle Ad Managerのネットワークに複数のサイトグループから同期を行う場合、同期を行う全てのサイトグループで必ず「統合(追加と更新(消去なし))」を選択しなければなりません。「置き換え(全消去後に追加)」を選択した場合、最後に同期したサイトグループで同期するセグメントのみがGoogle Ad Managerに同期された状態となり、他のサイトグループから同期したセグメントはAd Manager側から消えてしまいます。
-
入力したネットワークIDへのアクセス権限がない場合にはエラーメッセージが表示されます。エラーメッセージは以下の通りです。
"wrong argument: Can't connect to dfp network id: <Network ID>" -
弊社R&Dのオペレーションにホワイトリストを作成するよう依頼する必要があるため、担当のPianoアカウントマネージャまたはPianoサポートに
以下と合わせてご連絡ください。
- 設定を行なっているサイトグループ名/サイトグループID
- 今回の設定に使われたGoogle Ad ManagerのネットワークID -
同じまたは異なる Google Ad Manager ネットワークID で複数の設定を作成することができます。この場合はそれぞれにユニークなプロジェクト名を設定して区別できるようにしてください。
連携するセグメントの設定
-
次のステップではセグメントリストの設定を行います。特定のサイトグループにおける全てのセグメントを同期するには 「すべてのセグメント」を選択します。
-
リストから選択したセグメントのみを同期にするには「セグメントを手動で選択」を選び、
表示された「利用可能なアイテム」からセグメントを選択し、「追加 →」をクリックして「選択されたアイテム」に追加します。 -
全てのセグメントを追加するには「追加 全ての →」をクリックします。
-
セグメントを同期対象から外すには、「選択されたアイテム」からセグメントを選択し、「← 削除」をクリックし、
全てのセグメントを外すには「← 全てのを削除」ボタンをクリック) -
設定が完了したら「エクスポート実行」をクリックします。
-
全ての設定が完了したら画面右上にある「保存」ボタンをクリックして設定を保存します。
同期の開始:
-
設定完了後から同期は開始されています。
-
すぐにセグメントを同期するには「今すぐエクスポート」ボタンをクリックします。
同期の停止:
-
「接続を無効化」をクリックします。
「テスト接続」または「今すぐエクスポート」でのエラー:
(参照元 https://developers.google.com/doubleclick-publishers/docs/troubleshooting)
「テスト接続」または「今すぐエクスポート」の段階でエラーメッセージを受け取った場合、この問題を解決するために以下をご確認ください。
-
NETWORK_NOT_FOUND - 誤った NetworkId(ネットワークコード)を設定しています。ネットワークコードはページURLなどから確認できます(以下のスクリーンショットでは76366422)。管理者>全般設定>ネットワーク設定>ネットワーク コード のフィールドでも確認できます。
-
NO_NETWORKS_TO_ACCESS - 設定されているアカウントでAPIアクセスが有効になっていません。管理者>全般設定>ネットワーク設定>APIアクセス のフィールドで有効にすることができます。
-
NOT_WHITELISTED_FOR_API_ACCESS - 追加したアカウントがホワイトリスト化されていません。管理者>全般設定>ネットワーク設定>"サービス アカウント ユーザを追加" をクリックしてホワイトリスト化を行なってください。
-
"Please contact to support@cxense.com to resolve this conflict." - 指定された networkID(ネットワークコード) が既に他のサイトグループ に接続されています。この競合を解決するには support@piano.io にご連絡ください。
Google Ad Manager 広告タグの修正
Piano Audienceから現在のユーザーの属するセグメントを読み取り、Google Ad Managerタグにターゲットとして、これらのセグメントを転送します。
-
現在のユーザーのPiano AudienceのセグメントIDを取得するには、ヘルパー関数 cX.getUserSegmentIds(..)を使用します。
-
GoogleのAd Managerのターゲティングを設定するには、Ad Managerのヘルパー関数 Ad Manager setTargeting(..)を使用します。
2015/02/05:非同期の競合を避ける為に "googletag.display()"をラップする "cX.callQueue.push()"のアップデートを行いましたので以前のバージョンをお使いの場合は最新版にアップデートをお願い致します。
2016/05/11:サンプルコードをGoogle tagの「スロットレベル」のターゲティングに変更しました(Google Publisher Tag Reference 参照)
2019/06/19:setTargeting("CxSegments",...) がPiano Audience セグメントの取得後に呼び出されるよう、コードを更新しました。
一般的なGoogle Ad Managerのタグ:
(...Googleの広告スクリプトをロードする部分は省略してあります...)
<head>
<script type='text/javascript'>
googletag.cmd.push(function() {
googletag.defineSlot('/42072717/TestUnit', [400, 150], 'div-gpt-ad-10').addService(googletag.pubads()).setTargeting("pos","topright");
googletag.enableServices();
});
</script>
</head>
<body>
<!-- the code that places the ad -->
<div id='div-gpt-ad-10'>
<script type='text/javascript'>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-10'); });
</script>
</div>
</body>
変更後のタグ
persistedQueryIdの値は /wiki/spaces/CPJ/pages/3323707050のStep1で取得したIDをご利用ください。
オプション1
この実装方法では広告タグの呼び出しは Piano Audience からセグメントIDを取得するのに要する時間の影響を受けません。しかし、クライアント側でキャッシュされているセグメントIDを広告タグに渡すため、まだセグメントIDがキャッシュされていないケース(セッションの1PVめ)ではターゲティングされません。
(...Googleの広告スクリプトをロードする部分は省略してあります...)
<head>
<script type='text/javascript'>
var cX = cX || {};cX.callQueue = cX.callQueue || [];
cX.callQueue.push(['invoke',function(){
googletag.cmd.push(function() {
// ここでは "CxSegment" のターゲティングを「スロットレベル」に適用しています
googletag.defineSlot('/42072717/TestUnit', [400, 150], 'div-gpt-ad-10')
.addService(googletag.pubads())
.setTargeting("pos","topright")
.setTargeting("CxSegments",cX.getUserSegmentIds({persistedQueryId:'1234567890'}));
// 複数のスロットがある場合には、以下のように"CxSegments" のターゲティングを「ページレベル」に適用する方法もあります
// googletag.pubads().setTargeting("CxSegments", cX.getUserSegmentIds({persistedQueryId:'1234567890'}));
googletag.enableServices();
});
}]);
//Async load of cx.js
(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
e.src='http'+('https:'===location.protocol?'s://s':'://')+'cdn.cxense.com/cx.js';
t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
</script>
</head>
<body>
<!-- the code that places the ad -->
<div id='div-gpt-ad-10'>
<script type='text/javascript'>
cX.callQueue.push(['invoke',function(){
googletag.cmd.push(function() { googletag.display('div-gpt-ad-10'); });
}]);
</script>
</div>
</body>
オプション2
この実装方法では Piano Audience からセグメントIDを取得してから広告タグを呼び出すため、セッションの1PVめもターゲティングされます。しかし Piano Audience からセグメントIDを取得してから広告タグを呼び出すため、広告の表示が若干遅延します。
(...Googleの広告スクリプトをロードする部分は省略してあります...)
<head>
<script type='text/javascript'>
var cX = cX || {};cX.callQueue = cX.callQueue || [];
cX.callQueue.push(['invoke', function() {
var segmentIds = cX.getUserSegmentIds({persistedQueryId:'1234567890', callback:googleAdSetup});
setTimeout(function() { googleAdSetup(segmentIds); }, 1000); // 1000msのタイムアウト値
}]);
function googleAdSetup(cXsegmentIds) {
googletag.cmd.push(function() {
// ここでは "CxSegment" のターゲティングを「スロットレベル」に適用しています
googletag.defineSlot('/42072717/TestUnit', [400, 150], 'div-gpt-ad-10')
.addService(googletag.pubads())
.setTargeting("pos","topright")
.setTargeting("CxSegments",cXsegmentIds);
// 複数のスロットがある場合には、以下のように"CxSegments" のターゲティングを「ページレベル」に適用する方法もあります
// googletag.pubads().setTargeting("CxSegments", cXsegmentIds);
googletag.enableServices();
});
}
//Async load of cx.js
(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
e.src='http'+('https:'===location.protocol?'s://s':'://')+'cdn.cxense.com/cx.js';
t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
</script>
</head>
<body>
<!-- the code that places the ad -->
<div id='div-gpt-ad-10'>
<script type='text/javascript'>
cX.callQueue.push(['invoke',function(){
googletag.cmd.push(function() { googletag.display('div-gpt-ad-10'); });
}]);
</script>
</div>
</body>
モバイルの例
上の設定はネイティブモバイルアプリでも同じように設定できます。 Android の例は こちら にあります。
複数のPiano AudienceセグメントをGoogle Ad Managerの広告ターゲットに使用する場合
上述のセットアップとエクスポートの設定後に、Google Ad Manager側で利用可能になります。
管理者権限以外での実行方法
通常は管理者権限で利用する事をお勧めしております。管理者権限で実行する事でイベントレポート機能等の拡張機能の利用が可能になります。
しかし、管理者権限以外の権限で実行する事も可能です。以下の例では管理者権限だった"Piano Audience GW"に対し下位の権限を割り当てて、連携する方法を解説します。
※Add a service account userにて、事前にPiano Audience ユーザーというサービスアカウントユーザーを作成頂く必要があります。
-
「管理者」(Admin)タブをクリックします。
-
左側のメニューの「権限」(Roles)をクリックします。
-
「新しい権限」(New role)をクリックします。
4.新しく作成する権限の名称を入力します。例)"Piano Audience Role"
5.最低限以下のロールのチェックボックスを選択して下さい。
参考:https://docs.piano.io/configuring-google-ad-manager/
-
-
View all orders and line items
-
View creatives クリエイティブを表示
-
View ad units, placements, key-values, and labels 広告ユニット、プレースメント、Key-Value、ラベルを表示
-
View my orders and line items
-
View mobile apps
-
View companies and contacts
-
Create and view reports レポートの作成と表示
-
Edit ad units, placements, and key-values 広告ユニットとプレースメント、Key-Value の編集
-
Edit key-values values Key-Value 値の編集
-
6.「保存」(Save)をクリックします。
7.左側のメニューの「ユーザー」(Users)をクリックします。
8."Piano Audience GW" ユーザーをクリックします。
9.このユーザーの権限を「管理者」から「Piano Audience Role」(下記例では Cxense DMP Role)へ変更して下さい。
10.「保存」をクリックします。
タグ実装の代替手段
persistedQueryIdの値は /wiki/spaces/CPJ/pages/3323707050のStep1で取得したIDをご利用ください。
cx.jsがロードされていることに依存しないタグ
(... Google広告スクリプトを読み込むコードは省略してあります ...)
<head>
<script type='text/javascript'>
var cX = cX || {}; cX.callQueue = cX.callQueue || [];
cX.callQueue.push(['getUserSegmentIds', {persistedQueryId: "1234567890", callback: function(segments) {
if(typeof window.localStorage === 'object' && typeof window.localStorage.getItem === 'function') {
localStorage.setItem("cxSegments", segments.join(","));
}
}}]);
function getUserSegmentIdsLocal() {
var segments = [];
if(typeof window.localStorage === 'object' && typeof window.localStorage.getItem === 'function' && localStorage.getItem("cxSegments") !== null && localStorage.getItem("cxSegments").length>0) {
segments = localStorage.getItem("cxSegments").split(',');
}
return segments;
}
googletag.cmd.push(function() {
// ここでは "CxSegment" ターゲティングは "slot-level" に適用されます
googletag.defineSlot('/42072717/TestUnit', [400, 150], 'div-gpt-ad-10')
.addService(googletag.pubads())
.setTargeting("pos","topright")
.setTargeting("CxSegments",getUserSegmentIdsLocal());
// オプション: 複数のスロットが定義されている場合、"page-level" ツールで "CxSegments" を定義できます
// googletag.pubads().setTargeting("CxSegments", getUserSegmentIdsLocal());
googletag.enableServices();
});
// Async load of cx.js
(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
e.src='http'+('https:'===location.protocol?'s://s':'://')+'cdn.cxense.com/cx.js';
t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
</script>
</head>
ご参考:https://support.google.com/dfp_sb/answer/181071