広告クリエイティブをローテーションで表示する

共有ストレージを使用して、ユーザーにサイト間で表示するクリエイティブを決定します。

Shared Storage API は、さまざまなユースケースをサポートする、汎用のクロスサイト ストレージのためのプライバシー サンドボックスの提案です。クリエイティブのローテーションはその一例で、Chrome 104.0.5086.0 以降でテストできます。

クリエイティブのローテーションでは、クリエイティブ ID、視聴回数、ユーザー操作などのデータを保存して、ユーザーがさまざまなサイトで表示されるクリエイティブを特定できます。

共有ストレージ ワークレットを実行して、保存されたデータに基づいて指定されたリストから URL を選択し、そのクリエイティブをフェンス付きのフレームにレンダリングします。これを使用して、新しい広告やその他のコンテンツを選択できます。

クリエイティブ ローテーションを試す

共有ストレージを使用したクリエイティブのローテーションをテストするには、Chrome 104.0.5086.0 以降を使用していることを確認してください。chrome://settings/adPrivacy で、すべての広告プライバシー API を有効にします。

コマンドラインで --enable-features=PrivacySandboxAdsAPIsOverride,OverridePrivacySandboxSettingsLocalTesting,SharedStorageAPI,FencedFrames フラグを使用して共有ストレージを有効にすることもできます。

コードサンプルを試す

広告主やコンテンツ プロデューサーは、キャンペーンにさまざまな戦略を適用し、コンテンツやクリエイティブをローテーションして効果を高めたいと考えています。共有ストレージを使用すると、さまざまなサイト間で、連続ローテーションや均等分散ローテーションなど、さまざまなローテーション戦略を実行できます。

この例では、次のようになります。

  • creative-rotation.js はフレームに埋め込まれています。このスクリプトは、どの広告が最も重要であるか(重み)を設定し、ワークレットを呼び出して、どのコンテンツを表示するかを決定します。
  • creative-rotation-worklet.js は、表示するコンテンツの重み付け分布を決定し、返す共有ストレージ ワークレットです。

creative-rotation.js

// Ad config with the URL of the content, a probability weight for rotation, and the clickthrough rate.
const DEMO_CONTENT_CONFIG = [
  {
    url: 'https://your-server.example/contents/content-1.html',
    weight: 0.7,
  },
  {
    url: 'https://your-server.example/contents/content-2.html',
    weight: 0.2,
  },
  {
    url: 'https://your-server.example/contents/content-3.html',
    weight: 0.1,
  },
];

// Set the mode to sequential and set the starting index to 0.
async function seedStorage() {
  await window.sharedStorage.set('content-rotation-mode', 'sequential', {
    ignoreIfPresent: true,
  });

  await window.sharedStorage.set('content-rotation-index', 0, {
    ignoreIfPresent: true,
  });
}

async function injectAd() {
  // Load the worklet module
  await window.sharedStorage.worklet.addModule('creative-rotation-worklet.js');

  // Initially set the storage to sequential mode for the demo
  seedStorage();

  // Run the URL selection operation to determine the next content rendered.
  const urls = DEMO_CONTENT_CONFIG.map(({ url }) => ({ url }));
  const fencedFrameConfig = await window.sharedStorage.selectURL('content-rotation', urls, {
    data: DEMO_CONTENT_CONFIG,
    resolveToConfig: true
  });

  // Render the opaque URL into a fenced frame
  document.getElementById('content-slot').config = fencedFrameConfig;
}

injectAd();

creative-rotation-worklet.js

class SelectURLOperation {
  async run(urls, data) {
    // Read the rotation mode from Shared Storage
    const rotationMode = await sharedStorage.get('content-rotation-mode');

    // Generate a random number to be used for rotation
    const randomNumber = Math.random();

    let index;

    switch (rotationMode) {
      /**
       * Sequential rotation
       * - Rotates the contents in order
       * - Example: A -> B -> C -> A ...
       */
      case 'sequential':
        const currentIndex = await sharedStorage.get('creative-rotation-index');
        index = parseInt(currentIndex, 10);
        const nextIndex = (index + 1) % urls.length;

        await sharedStorage.set('content-rotation-index', nextIndex);
        break;

      /**
       * Weighted rotation
       * - Rotates the contentswith weighted probability
       * - Example: A=70% / B=20% / C=10%
       */
      case 'weighted-distribution':
        
        // Sum the weights cumulatively, and find the first URL where the
        // sum exceeds the random number. The array is sorted in
        // descending order first.
        let weightSum = 0;
        const { url } = data
          .sort((a, b) => b.weight - a.weight)
          .find(({ weight }) => {
            weightSum += weight;
            return weightSum > randomNumber;
          });

        index = urls.indexOf(url);
        break;

      default:
        index = 0;
    }
    return index;
  }
}

register('content-rotation', SelectURLOperation);

ユースケース

これらは、共有ストレージのユースケースのほんの一部です。フィードバックを受け取ったり、新しいユースケースを発見したりするにつれて、例は引き続き追加されます。

コンテンツの選択

共有ストレージで収集された情報に基づいて、さまざまなウェブサイトのさまざまなコンテンツをフェンスド フレームで選択して表示します。これらのユースケースの出力ゲートウェイは URL 選択です。

  • クリエイティブのローテーション: クリエイティブ ID、視聴回数、ユーザー インタラクションなどのデータを保存して、ユーザーに表示するクリエイティブをさまざまなサイト間で決定します。
  • A/B テスト: ユーザーをテストグループに割り当て、そのグループを Shared Storage に保存して、クロスサイトからアクセスできるようにします。
  • カスタム ユーザー エクスペリエンス: ユーザーの登録ステータスやその他のユーザー状態に基づいて、カスタム コンテンツと行動を促すフレーズを共有する

概要レポートを生成する

共有ストレージを使用して情報を収集し、ノイズが追加された集計概要レポートを生成します。これらのユースケースの出力ゲートウェイは Private Aggregation API です。

  • ユニークリーチの測定: 多くのコンテンツ制作者と広告主は、コンテンツを視聴したユニーク ユーザー数を知りたいと考えています。共有ストレージを使用すると、ユーザーが広告、埋め込み動画、またはパブリケーションを初めて見た日時を記録し、同じユーザーが異なるサイトで重複してカウントされるのを防ぐことができます。その後、Private Aggregation API を使用して、リーチの概要レポートを出力できます。
  • ユーザー属性の測定: コンテンツ制作者は、視聴者の属性を把握したいと考えることが多いでしょう。共有ストレージを使用すると、ファーストパーティ サイトなど、ユーザーの属性データが存在するコンテキストでユーザーの属性データを記録し、集計レポートを使用して、埋め込みコンテンツなど、他の多くのサイトにわたってレポートを作成できます。
  • K 回以上のフリークエンシー測定: 「有効フリークエンシー」とも呼ばれ、ユーザーが特定のコンテンツを認識または思い出すまでに必要な表示回数の最小数(多くの場合、広告の表示回数のコンテキストで)が存在します。共有ストレージを使用すると、コンテンツを K 回以上見たユニーク ユーザーのレポートを作成できます。

意見交換とフィードバックの提供

Shared Storage API の提案は現在議論と開発が進められているため、変更される可能性があります。

Shared Storage API について、ぜひご意見をお聞かせください。

最新情報を入手する

  • メーリング リスト: メーリング リストに登録すると、Shared Storage API に関する最新情報やお知らせを受け取ることができます。

ご不明な点がある場合