Use um armazenamento compartilhado para determinar qual criativo o usuário vai ver em vários sites.
A API Shared Storage é uma proposta do Sandbox de privacidade para armazenamento entre sites de finalidade geral, que oferece suporte a muitos casos de uso. Um exemplo é a rotação de criativos, que está disponível para testes no Chrome 104.0.5086.0 e versões mais recentes.
Com a rotação de criativos, é possível armazenar dados, como ID do criativo, contagens de visualizações e interação do usuário, para determinar quais criativos os usuários veem em diferentes sites.
Execute um worklet de armazenamento compartilhado para selecionar um URL de uma lista fornecida com base nos dados armazenados e renderize esse criativo em um frame limitado. Ele pode ser usado para selecionar novos anúncios ou outro conteúdo.
Testar a rotação de criativos
Para testar a rotação de criativos com o Shared Storage, confirme se você está usando o Chrome 104.0.5086.0 ou mais recente. Ative todas as APIs de privacidade de anúncios em chrome://settings/adPrivacy
.
Também é possível ativar o armazenamento compartilhado com a flag --enable-features=PrivacySandboxAdsAPIsOverride,OverridePrivacySandboxSettingsLocalTesting,SharedStorageAPI,FencedFrames
na linha de comando.
Testar exemplos de código
Um anunciante ou produtor de conteúdo pode querer aplicar estratégias diferentes a uma campanha e alternar os conteúdos ou criativos para aumentar a eficácia. O armazenamento compartilhado pode ser usado para executar diferentes estratégias de rotação, como rotação sequencial e rotação distribuída uniformemente, em diferentes sites.
Neste exemplo:
creative-rotation.js
está incorporado em um frame. Esse script define quais anúncios são mais importantes ( peso) e chama o worklet para determinar qual conteúdo deve ser exibido.creative-rotation-worklet.js
é o worklet de armazenamento compartilhado que determina a distribuição ponderada para o conteúdo e os retornos que devem ser exibidos.
// 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();
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);
使用场景
以上仅列举了共享存储空间的一些可能用例。随着我们收到反馈并发现新的使用场景,我们会继续添加示例。
内容选择
根据在共享存储空间中收集的信息,在围栏框架中选择并显示不同网站上的不同内容。这些用例的输出门限是网址选择。
- 广告素材轮替:存储广告素材 ID、观看次数和用户互动等数据,以确定用户在不同网站上看到的广告素材。
- A/B 测试:您可以将用户分配到实验组,然后将该组存储在共享存储空间中,以便跨网站访问。
- 自定义用户体验:根据用户的注册状态或其他用户状态分享自定义内容和号召性用语
生成摘要报告
使用共享存储空间收集信息,并生成包含噪声的汇总摘要报告。这些用例的输出网关是不公开汇总 API。
- 衡量覆盖的唯一身份用户数:许多内容制作者和广告客户都希望了解其内容的覆盖面(即看到过其内容的唯一身份用户数)。使用共享存储空间可记录用户首次看到您的广告、嵌入的视频或发布内容的时间,并防止在不同网站上重复统计同一用户。然后,您可以使用 Private Aggregation API 输出覆盖面摘要报告。
- 受众特征衡量:内容创作者通常希望了解其观众的受众特征。您可以使用共享存储空间在拥有用户特征数据的情境(例如您的第一方网站)中记录用户特征数据,并使用汇总报告在许多其他网站(例如嵌入式内容)中生成关于这些数据的报告。
- “K+”频次衡量:有时也称为“有效频次”,通常需要达到最低观看次数,用户才能识别或回想某些内容(通常是在广告观看情境中)。您可以使用共享存储空间生成报告,了解至少观看了某项内容 K 次的唯一身份用户。
Engajamento e compartilhamento de feedback
A proposta da API Shared Storage está em discussão e desenvolvimento e, portanto, está sujeita a mudanças.
Queremos saber sua opinião sobre a API Shared Storage.
- Proposta: analise a proposta detalhada.
- Discussão: participe da discussão em andamento para fazer perguntas e compartilhar seus insights.
Fique por dentro
- Lista de e-mails: inscreva-se na nossa lista de e-mails para receber as atualizações e os anúncios mais recentes relacionados à API Shared Storage.
Precisa de ajuda?
- Suporte para desenvolvedores: entre em contato com outros desenvolvedores e receba respostas para suas perguntas no repositório de suporte para desenvolvedores do Sandbox de privacidade.