Resumo: Instale o Web SDK da AppsFlyer (também conhecido como pixel) no seu site para registrar visitas e eventos de usuários na plataforma e defina um Customer User ID (CUID) para unificar jornadas cross-platform.
Visão geral
O Web SDK permite que você registre como os visitantes interagem com seu site e envia essa informação para a AppsFlyer. É um módulo plug-in de 40–60 KB que comunica as visitas e ações dos usuários no seu site à plataforma da AppsFlyer.
Siga as etapas abaixo para concluir a integração do Web SDK, desde a instalação até a validação e aos controles de privacidade.
- Receber suas chaves. Obtenha o ID do Web SDK (também conhecido como Web Dev Key).
- Selecionar um code snippet. Escolha o snippet que corresponde ao seu tipo de integração e requisitos de segurança.
- Implementar o Web SDK. Implemente o SDK usando um snippet nativo, o Google Tag Manager ou o Adobe Launch Tag Manager.
- Verificar se o SDK está funcionando. Certifique-se de que o SDK está enviando solicitações ao conferir as chamadas de rede nas ferramentas de desenvolvedor do navegador.
- Configurar e gravar eventos. Defina e envie eventos personalizados no carregamento da página ou em interações do usuário usando o JavaScript nativo ou o Google Tag Manager.
- Definir o Customer User ID. Defina um CUID para unificar a atividade da web com outras plataformas.
- Gerenciar a privacidade. Controle a mensuração opt-in ou opt-out e configure a segurança e os filtros de dados (Política de Segurança de Conteúdo e descarte dos parâmetros de consulta).
- Referência de cookies do Web SDK. Analise os cookies que o Web SDK configura ou usa, incluindo propósito, duração e alcance.
1. Receber suas chaves
Obtenha o ID do Web SDK (também conhecido como Web Dev Key):
- Na AppsFlyer, no menu superior, acesse Meus aplicativos.
- Selecione o seu aplicativo web (o seu domínio do site com o prefixo "site-").
- Copie o ID do Web SDK necessário.
Obtenha a chave do Smart Banner (se necessário):
- Na AppsFlyer, no menu lateral, acesse Engajar> Web-to-app > Smart Banners.
- Copie a chave do Smart Banner necessária.
2. Selecionar um code snippet
Escolha o snippet que corresponde ao seu tipo de integração e requisitos de segurança. Duas opções estão disponíveis:
- Web SDK padrão: a integração padrão.
- Verificação avançada de SDK: uma integração aprimorada que inclui segurança da cadeia de suprimentos para o Web SDK. Use-a para adicionar uma camada extra de segurança contra comprometimento de CDN, sequestro de DNS e ataques intermediários (MiTM).
Importante!
Se você estiver fazendo a transição do Web SDK padrão para a verificação avançada de SDK, substitua o snippet existente pelo novo. O novo snippet não deve ser adicionado em conjunto com o snippet existente.
Web SDK padrão
Use este snippet para implementar a integração do Web SDK padrão. Insira-o perto do topo da tag em todas as páginas onde você deseja que o SDK seja carregado.
Sem Smart Banners
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
window.AF.plugins = {};
// Inject SDK
var o = document.createElement("script"),
p = document.getElementsByTagName("script")[0];
o.async = 1;
o.src = "https://websdk.appsflyersdk.com?" + "st=pba&af_id=WEB_DEV_KEY";
p.parentNode.insertBefore(o, p);
</script>Com Smart Banners
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
window.AF.plugins = {};
// Inject SDK
var o = document.createElement("script"),
p = document.getElementsByTagName("script")[0];
o.async = 1;
o.src = "https://websdk.appsflyersdk.com?" + "st=pba,banners&af_id=WEB_DEV_KEY";
p.parentNode.insertBefore(o, p);
AF('banners', 'showBanner');
</script>Verificação avançada de SDK
A verificação avançada de SDK adiciona segurança da cadeia de suprimentos ao Web SDK. Ela garante que o código executado nos navegadores dos seus usuários é exatamente o mesmo que a AppsFlyer publicou. O código-fonte do SDK em si é idêntico à integração padrão; apenas os mecanismos de entrega e verificação diferem.
A verificação avançada de SDK:
- Adiciona uma camada extra de segurança contra comprometimento de CDN, sequestro de DNS e ataques intermediários (MiTM).
- Adiciona aproximadamente 250ms ao tempo de carregamento do SDK.
Esse recurso é opcional. A integração padrão permanece totalmente disponível e é o padrão de mercado para analytics pixels de terceiros. A verificação avançada do SDK fornece uma camada adicional de proteção além do padrão.
Se o seu site impõe uma Política de Segurança de Conteúdo (CSP) usando nonce, consulte Política de Segurança de Conteúdo (CSP) em “Gerenciar privacidade” para acessar a variante nonce-extended do snippet.
Sem Smart Banners
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
window.AF.plugins = {};
// Manifest loader config
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["pba"]
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>Com Smart Banners
<script>
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
window.AF.plugins = {};
// Manifest loader config
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["banners", "pba"]
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>3. Implementar o snippet
Implemente o snippet escolhido na Etapa 2 usando um dos seguintes métodos. Certifique-se de que o SDK seja carregado uma vez por cada página.
Opção A: Adicionar diretamente ao seu site
Repita os seguintes passos em todas as páginas:
- No snippet da Etapa 2, substitua
WEB_DEV_KEY(e, se aplicável,YOUR_BANNER_KEY) pelo ID do Web SDK. - Cole o snippet perto da parte superior da tag
do site.
Opção B: Implementar pelo Google Tag Manager (GTM)
Certifique-se de que o SDK seja carregado uma vez por cada página e configure-o para carregar assim que a página abrir usando a prioridade do GTM.
- Abra o Google Tag Manager.
- Crie uma nova tag para o Web SDK da AppsFlyer.
- Selecione o tipo de tag HTML personalizado.
- Dê um nome relevante à tag.
- Cole o snippet da Etapa 2 em Configuração de tags.
- Clique em Salvar.
- Adicione um gatilho:
- Para todas as páginas:
- Clique em Adicionar gatilho.
- Selecione Todas as páginas.
- Clique em Salvar.
- Insira um nome de tag e clique em Salvar.
- Para páginas específicas:
- Clique em Salvar tag.
- Na janela principal do GTM, selecione Gatilhos. Clique em Novo.
- Clique no ícone de edição.
- Escolha o tipo de gatilho Visualização de página.
- Selecione Algumas visualizações de página.
- Defina a página e as condições de gatilho conforme necessário.
- Clique em Salvar.
- Associe o gatilho à tag do Web SDK da AppsFlyer.
- Na janela principal do GTM, selecione Gatilhos.
- Selecione a etiqueta que você criou anteriormente.
- No painel de gatilhos, clique no ícone de edição.
- Selecione o gatilho da visualização da página que criou anteriormente.
- Clique em Salvar.
- Para todas as páginas:
Atenção
Os modelos personalizados do GTM não são compatíveis com a verificação avançada de SDK, porque o ambiente sandbox não permite configurar o atributo integrity necessário para a verificação. Em vez disso, use o tipo de tag HTML personalizado.
Opção C: Implementar via Adobe Launch Tag Manager
Crie uma propriedade no Adobe Experience Cloud
- Acesse Adobe Experience Cloud > Inicialização.
- Em Adobe Experience Cloud Launch, clique em Ir para Inicialização.
- Clique em Nova propriedade.
- Dê um nome à propriedade.
- Em Plataforma, selecione Web.
- Insira o domínio do seu site.
- Clique em Salvar.
Adicione o snippet à propriedade do Adobe Launch
- Na página Propriedade da minha web, selecione a aba Regras.
- Dê um nome à regra. Recomenda-se carregar o Web SDK.
- Na seção IF, em Eventos, clique em Adicionar.
- Em Tipo de evento, selecione Core - DOM Ready.
- Clique em Manter alterações.
- Na seção THEN, em Ações, clique em Adicionar .
- Em Tipo de ação, selecione Código personalizado.
- Selecione JavaScript > Abrir Editor e cole o snippet da Etapa 2 (sem linhas extras).
- Clique em Manter alterações para fechar o editor de código.
- Clique em Salvar.
Adicione a tag Adobe Launch ao site
- Na página Propriedade da minha web, selecione a aba Ambientes .
- Encontre a linha com o ambiente no qual você deseja publicar (desenvolvimento ou produção).
- Na coluna Instalar, clique no ícone de seleção na linha relevante.
- Na caixa de diálogo Instruções de instalação da web, copie o snippet de código do script e feche a caixa de diálogo.
- Cole o snippet de código na tag “head” do site.
Publicar o ambiente Adobe Launch
- Na página Propriedade da minha web, acesse a aba Publicação .
- Na seção Desenvolvimento, clique em Adicionar nova biblioteca.
- Dê um nome à biblioteca e escolha um ambiente.
- Em ALTERAÇÕES DE RECURSO, clique em Adicionar um recurso.
- Clique em Regras > Carregar Web SDK > Mais recentes > Selecionar e criar uma nova revisão.
- Clique em Salvar.
- Na seção Desenvolvimento:
- Ao lado da biblioteca recém-criada, clique no menu Ação (3 pontos) e selecione Criar para desenvolvimento.
- Clique no menu de ação novamente e selecione Enviar para aprovação.
- Na seção Enviado:
- Clique no menu de ação e selecione Criar para preparação.
- Clique novamente no menu de ação e selecione Aprovar para publicação.
- Abaixo da seção Aprovado:
- Clique no menu de ação e selecione Criar e publicar em produção.
2. Verificar se o SDK está funcionando
Após a instalação, certifique-se de que o SDK está enviando solicitações ao conferir as chamadas de rede nas ferramentas de desenvolvedor do navegador.
Para verificar se o SDK está funcionando, siga estes passos:
- Abra o site.
- Abra as ferramentas de desenvolvimento do navegador.
- Vá para a aba (A) Rede.
- Atualize a página.
- Filtre por duas solicitações:
-
Carregador do SDK: URL da solicitação começa com
https://websdk.appsflyersdk.com. Isso confirma que o script do SDK foi carregado corretamente. -
Dados de evento: URL da solicitação começa com
https://wa.appsflyer.com/events. Isso confirma que o SDK está enviando dados de evento para a AppsFlyer.
-
Carregador do SDK: URL da solicitação começa com
- Selecione a mensagem eventos (C): a chamada
wa.appsflyer.com. - Sob os headers, verifique (D):
- O URL da solicitação começa com
https://wa.appsflyer.com/events?site-id=. -
Parâmetro de consulta
site_id=WEB_SDK_KEY - O código de status é 200.
- O URL da solicitação começa com
- Verifique se
site_idcorresponde aWEB_SDK_KEYna AppsFlyer. No menu superior, acesse Meus aplicativos. - Certifique-se de que o SDK seja carregado apenas uma vez. O carregamento múltiplo do SDK pode fazer com que ele pare de funcionar.
3. Configurar e gravar eventos
Depois de inicializar o Web SDK, você deixa de mensurar visitas básicas para capturar ações específicas do usuário. Nessa seção, você aprenderá como configurar e gravar eventos personalizados, como compras ou cadastros, usando JavaScript nativo ou Google Tag Manager.
Configurar eventos
Os eventos são fundamentais para a mensuração da web, representando ações específicas do usuário que geram valor para o seu negócio. Para registrar essas interações, você precisa definir a lógica e os parâmetros para cada evento, garantindo que os parâmetros corretos, como receita e metadados personalizados, sejam enviados para a plataforma da AppsFlyer.
Exemplo de evento: evento de compra com receita associada
AF('pba', 'event', {eventType: 'EVENT', eventName: 'purchase', eventRevenue: 12, eventValue: {"key1": 123, "key2": "name"}});
Tabela de parâmetros de eventos do Web SDK
| Nome do parâmetro | Obrigatório | Descrição |
|---|---|---|
eventType |
Sim | Tipo de evento. Formato: string. Sempre preencha esse parâmetro com EVENT. Exemplo: eventType: "EVENT"
|
eventName |
Sim | Nome do evento. Formato: string. Exemplo: compra; assinatura |
eventRevenue |
Não | Receita atribuída a um evento de conversão. Formato: float |
eventRevenueCurrency |
Não | Moeda da receita. Código de moeda ISO 4217 de 3 caracteres. Padrão: USD. Formato: string |
eventValue |
Não | Mapa de parâmetros da descrição de eventos. Use esse parâmetro para enviar eventos in-app avançados como SKU do produto e preço do item. Formato: JSON. Exemplo: {"sku": "ABC123", "color": "blue", "unit_price": 3.99, "currency": "USD"} Limite: 1000 caracteres. Não exceda o limite permitido. |
Registrar eventos no carregamento da página
Essa é a abordagem padrão para conversões que terminam com um redirecionamento, como uma página de confirmação ou agradecimento.
Você pode implementar esse gatilho com um método de carregamento de janela ao seu JavaScript nativo ou com um gatilho de visualização de página no Google Tag Manager.
Aviso
Os exemplos de código abaixo são para fins ilustrativos. Não use o código original. Adapte-o à estrutura específica do seu site.
Exemplo: Gravação de eventos via Web SDK da AppsFlyer
Essa abordagem é ideal para gravar conversões que ocorrem através de redirecionamentos, como uma página de agradecimento para uma assinatura de newsletter.
Caso de uso: Um usuário assina uma newsletter e é redirecionado para uma página de confirmação. Você deve registrar o evento de assinatura assim que a página estiver visível.
Exemplo de carregamento nativo de página:
window.onload = function(){
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category': 'holiday_promotion'}, eventName: 'subscription'});
}
Como funciona:
- A página carrega o conteúdo necessário.
- Depois do carregamento completo da janela (
window.onload), o script chama automaticamente o métodoAF(). - O evento de assinatura, juntamente com os metadados associados (categoria e rótulo), é enviado diretamente para a AppsFlyer.
Exemplo: Gravação de eventos via GTM
Essa abordagem é usada para registrar conversões bem-sucedidas, como uma assinatura de newsletter, disparando uma tag no carregamento de uma página de agradecimento.
1. Crie uma página de agradecimento
A estrutura de HTML carrega o GTM que, por sua vez, carrega o Web SDK. Ela também mostra como os dados podem ser disponibilizados ao GTM através de funções ou localStorage.
<html>
<head>
<script>
// Google Tag Manager loads the Web SDK
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');
</script>
<script>
function getResponseFromServer() {
return JSON.stringify({ action: 'subscribe', category: 'site actions', label: userEmail })
}
localStorage.setItem('data', JSON.stringify({ action: 'subscribe', category: 'site actions', label: 'user@email.com' }));
</script>
</head>
<body>
<h1>Thank You for Subscribing to Our Newsletter</h1>
</body>
</html>
2. Configure a tag do GTM
- Crie uma nova tag no GTM e selecione o tipo de tag HTML personalizado.
- Dê um nome diferente (exemplo: "Evento de assinatura da AppsFlyer").
-
Cole o seguinte script na área de texto HTML:
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'subscription'}); - Abra Configurações avançadas > Sequenciamento de tags. Certifique-se de que está configurado para disparar após a tag de inicialização principal do Web SDK.
- Defina um gatilho para que a tag seja ativada na visualização de página da página de agradecimento.
Registrar eventos na interação do usuário
Use isso para rastrear ações sem carregamento de página (cliques em botões, downloads, adicionar ao carrinho).
Essas interações costumam ser gerenciadas por meio de um ouvinte de clique a um elemento HTML nativo ou através de variáveis do Google Tag Manager para identificar e mensurar IDs de elementos específicos ou seletores CSS.
Aviso
Os exemplos de código abaixo são para fins ilustrativos. Não use o código original. Adapte-o à estrutura específica do seu site.
Exemplo: Gravação de eventos via Web SDK da AppsFlyer
Use esse método para acompanhar ações específicas que os usuários realizam em uma página, como clicar em um botão de Checkout ou Download.
Caso de uso: Você opera um site de eCommerce e deseja capturar um evento de checkout no momento em que um usuário clica no botão Checkout no carrinho de compras.
Exemplo de interação de usuário nativo:
<html>
<head>
<script>
window.onload = function () {
document.getElementById('checkout').addEventListener('click', function () {
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'});
});
}
</script>
</head>
<body>
<h1>Shopping Cart</h1>
<button id='checkout'>Checkout</button>
</body>
</html>
Como funciona:
- Quando a página é carregada, o script anexa um ouvinte de clique ao elemento com a ID
checkout. - Quando o usuário clica no botão de checkout, a função de callback é ativada.
- A função pode recuperar dados relevantes (de
localStorage, por exemplo) e enviá-los para o método deAF(). - Em seguida, o SDK envia o evento de checkout para a plataforma da AppsFlyer.
Exemplo: Gravação de eventos via GTM
Esse método captura ações específicas, como clicar em um botão de checkout, usando as variáveis e os gatilhos integrados do GTM.
1. Configure uma página de checkout
<html>
<head>
<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');
</script>
</head>
<body>
<h1>Shopping Cart</h1>
<button id='checkout'>Checkout</button>
</body>
</html>
2. Configure variáveis e gatilhos no GTM
- No GTM, clique em Variáveis > Configurar e ative Elementos de clique na lista de variáveis incorporadas.
- Crie uma nova variável definida pelo usuário (tipo: Todos os elementos).
- Crie um novo gatilho:
- Tipo de gatilho: Clique - Todos os elementos.
- Esse gatilho dispara em: Alguns cliques.
- Condição: Elementos de clique corresponde ao seletor CSS
#checkout.
3. Crie a tag de interação
- Crie uma nova tag HTML personalizado para a ação do checkout.
-
Cole o script de interação:
<script> AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'}); </script> - Atribua o gatilho "clique do checkout" criado ne etapa anterior.
Práticas recomendadas para a implementação de eventos
Para garantir a precisão dos dados e um envio bem-sucedido, lembre-se destes requisitos técnicos:
- Ordem de carregamento: Verifique se a tag de funções do Web SDK está totalmente carregada antes de fazer chamadas de evento.
-
Formatação de dados: Não inclua caracteres especiais nos valores de eventos. Exemplo: use valores numéricos para receita em vez de símbolos de moeda (use
10.50em vez de$10.50). -
Limites de string: Mantenha suas strings
event_valueconcisas. Valores com mais de 4000 caracteres serão encurtados.
4. Definir o Customer User ID
Após implementar a mensuração de eventos, configure uma identidade para vincular a atividade web com outras plataformas (mobile, PC, CTV). Use setCustomerUserId para obter uma visão unificada da jornada do usuário entre as plataformas.
Regras principais
-
Consistência: Use o mesmo valor de CUID das suas implementações de apps mobile (ver
setCustomerUserIdmobile para: iOS, Android, Unity). - Tempo: Você pode enviar o CUID em qualquer fase (após o login ou cadastro, por exemplo). Defina o CUID assim que tiver acesso a ele. Na maioria das vezes, isso significa que é necessário esperar que o usuário se identifique através do login ou do cadastro.
-
Sintaxe: Envie o valor como uma string (entre aspas). Exemplo:
AF('pba', 'setCustomerUserId', '663274') - Privacidade: Não inclua informações pessoais identificáveis (PII), como endereços de e-mail ou números de telefone.
Exemplo: Configurando o CUID após o cadastro (nativo)
O código fornecido nestes exemplos é apenas para referência. Não use o código original. Se você não tiver certeza de como usá-lo, consulte seu desenvolvedor web.
Pressuposto: O Web SDK é carregado na página antes do evento ser enviado. Não o carregue novamente.
Cenário do usuário:
- Um usuário faz o cadastro no seu site.
- O código do site recolhe os dados do usuário e os envia ao seu servidor.
- O servidor gera um CUID único para o usuário.
- Na página de agradecimento após o cadastro, você consulta o servidor para obter o novo CUID.
- Com a resposta do servidor, você define o CUID da AppsFlyer usando o método
setCustomerUserId()do Web SDK.
Um exemplo de formulário de cadastro
O código abaixo é um formulário de cadastro simples. Quando o formulário é enviado, o endereço de e-mail é armazenado em localStorage. Quando o usuário chega à página de agradecimento, o endereço de e-mail é enviado para o servidor que obtém o CUID único para esse e-mail.
<html>
<head>
<script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
</script>
<script>
function storeUserEmail() {
var userEmail = document.getElementById('email').value;
localStorage.setItem('user_email', userEmail);
}
</script>
</head>
<body>
<h1>Sign Up</h1>
<form onsubmit="storeUserEmail()" action="/signup" method="post">
<div><label>Name</label><input type="text" name="name" id="name"></div>
<br/>
<div><label>Email</label><input type="email" name="email" id="email"></div>
<br/>
<input type="submit" id="submit">
</form>
</body>
</html>
Um exemplo de página de agradecimento
O código usa a Fetch API. Ele envia o endereço de e-mail inserido pelo usuário ao servidor. Considerando que o servidor crie um usuário com um CUID único no cadastro, enviar o endereço de e-mail para o servidor retornará um CUID único. O servidor responde com um CUID único, que é enviado com o métodosetCustomerUserId.
<html>
<head>
<script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
</script>
<script>
window.onload = function () {
var userEmail = localStorage.getItem('user_email');
fetch('users/' + userEmail).then(function (res) {
res.text().then(function (id) {
console.log(id);
AF('pba', 'setCustomerUserId', id);
});
});
}
</script>
</head>
<body>
<h1>Thank You for Signing Up!</h1>
</body>
</html>
Exemplo: Configurando o CUID após o cadastro (Google Tag Manager)
-
Crie uma página de cadastro.
O exemplo de código abaixo é um formulário de cadastro simples. Quando o formulário é enviado, o endereço de e-mail é armazenado em
localStorage. Quando o usuário chega à página de agradecimento, o endereço de e-mail é enviado para o servidor que obtém o CUID único para esse e-mail.<html> <head> <script> (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-5VJ6C7R'); function storeUserEmail() { var userEmail = document.getElementById('email').value; localStorage.setItem('user_email', userEmail); } </script> </head> <body> <h1>Sign Up</h1> <form onsubmit="storeUserEmail()" action="/signup" method="post"> <div><label>Name</label><input type="text" name="name" id="name"></div> <br /> <div><label>Email</label><input type="email" name="email" id="email"></div> <br /> <input type="submit" id="submit"> </form> </body> </html> -
Configure uma página de agradecimento para os usuários que fazem o cadastro. O código abaixo é uma página de agradecimento com um gatilho do GTM que envia o endereço de e-mail fornecido pelo usuário ao servidor no formulário de cadastro. Considerando que o servidor crie um usuário com um CUID único no cadastro, enviar o endereço de e-mail para o servidor retornará um CUID único. O servidor responde com um CUID exclusivo que é enviado usando o método
setCustomerUserId().<script> window.onload = function () { var userEmail = localStorage.getItem('user_email'); fetch('users/' + userEmail).then(function (res) { res.text().then(function (id) { console.log(id); AF('pba', 'setCustomerUserId', id); }); }); } </script> -
Adicione uma nova tag para atribuir assinaturas após o carregamento da página de agradecimento.
-
Dê um nome diferente à tag e selecione a opção de tipo de tag HTML personalizado.
<script> var userEmail = localStorage.getItem('user_email'); fetch('users/' + userEmail).then(function (res) { res.text().then(function (id) { console.log(id); AF('pba', 'setCustomerUserId', id); }); }); </script> -
Abra Configurações avançadas e Sequenciamento de tags e certifique-se de que está configurado para disparar a conversão após a execução da tag.
-
Defina um gatilho para a tag de conversão para indicar quando deve ser acionada. No exemplo abaixo, ela é acionada no carregamento da página de agradecimento.
5. Gerenciar a privacidade
Após implementar a mensuração de eventos, talvez você precise aplicar restrições de segurança e privacidade específicas para atender aos padrões da sua empresa ou região.
Opt-in ou opt-out do envio de eventos
Você pode controlar a mensuração de duas maneiras:
Definição do estado inicial do SDK (no snippet)
Determina se o SDK envia eventos quando a página da web carrega pela primeira vez ou espera até que você peça para que ele envie os eventos. Essa configuração é definida no snippet da web.
- Envie eventos:
{pba: {webAppId: "...", measurementStatus:true}} - Do not send events:
{pba: {webAppId: "...", measurementStatus:false}}
Atenção
Se measurementStatus estiver vazio ou NULL, a AppsFlyer considera como measurementStatus:true.
Controle explícito
O controle explícito tem prioridade sobre a configuração de estado inicial e usa cookies first-party:
- Definido no domínio do site.
- Expira após um período definido pelo Web SDK ou conforme determinado pelo navegador.
- Sempre sujeito às configurações de cookies do navegador.
Comandos
- Comece a enviar eventos (opt-in):
window.AF_SDK.PLUGINS.PBA.enableMeasurement() - Pare de enviar eventos (opt-out):
window.AF_SDK.PLUGINS.PBA.disableMeasurement()
Proteção e filtro de dados
e o seu site exige protocolos rigorosos de segurança e de privacidade de dados, use os seguintes mecanismos para configurar a maneira como o Web SDK interage com seu ambiente e seus dados.
Política de Segurança de Conteúdo (CSP)
Se o seu site exige que o JavaScript seja protegido por uma CSP, o Web SDK é compatível com duas abordagens diferentes, a depender da configuração da sua CSP e do snippet selecionado na Etapa 2.
-
CSP usando self: Adicione
https://websdk.appsflyersdk.comà sua lista de permissõesscript-src. Isso funciona tanto para o Web SDK padrão quanto para a verificação avançada do SDK. -
CSP usando nonce: Se sua política usar
script-src 'nonce-...', use a variante once-extended da derificação avançada do SDK. Esse mecanismo encaminha o nonce para todas as três tags de script exigidas pelo processo de verificação. Substitua{{CSP_NONCE}}pelo valor nonce gerado pelo servidor.
A tabela abaixo mostra quais políticas CSP são compatíveis com a variante nonce-extended.
| Política | Funcionamento | Observações |
|---|---|---|
script-src 'self' |
Não | Origem de CDN externa não permitida; script inline também é bloqueado. |
script-src 'self' https://websdk.appsflyersdk.com |
Parcial | Permite carregador e SDK; o script inline ainda está bloqueado. |
script-src 'nonce-...' https://websdk.appsflyersdk.com |
Sim | Nonce cobre script inline e carregador; a tag SDK recebe nonce encaminhado pelo carregador. |
script-src 'nonce-...' 'strict-dynamic' |
Sim (recomendado) | Nonce cobre script inline e carregador, strict-dynamic propaga confiança para a tag SDK inserida dinamicamente. Nenhuma origem de CDN necessária na lista de permissões. |
Verificação avançada de SDK com snippets de nonce CSP
Sem Smart Banners
<script nonce="{{CSP_NONCE}}">
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
window.AF.plugins = {};
// Manifest loader config — nonce forwarded to the injected SDK <script> tag
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["pba"],
nonce: "{{CSP_NONCE}}"
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.nonce = "{{CSP_NONCE}}";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>Com Smart Banners
<script nonce="{{CSP_NONCE}}">
// Queue — buffers AF() calls until the SDK is ready
window.AppsFlyerSdkObject = "AF";
window.AF = window.AF || function() {
(window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
};
window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
window.AF.plugins = {};
// Manifest loader config — nonce forwarded to the injected SDK <script> tag
window.AF_LOADER_CONFIG = {
baseUrl: "https://websdk.appsflyersdk.com",
plugins: ["banners", "pba"],
nonce: "{{CSP_NONCE}}"
};
// Inject manifest loader
var loaderScript = document.createElement("script");
loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
loaderScript.crossOrigin = "anonymous";
loaderScript.nonce = "{{CSP_NONCE}}";
loaderScript.async = true;
document.head.appendChild(loaderScript);
</script>Descartar parâmetros de consulta
Se os parâmetros de consulta de URL contêm informações confidenciais, peça à AppsFlyer para descartá-las (URLs, referrers e header_referer).
- Descarregue todos os parâmetros de consulta: anexar
af_url=true - Descarte os parâmetros específicos: use
af_url_mask=param(separar múltiplos parâmetros com;)
Exemplo:
- Original:
param1=value1¶m2=value2¶m3=value3&af_url_mask=param2;param3 - Resultado:
param1=value1&af_url_mask=param2;param3
Referência de cookies do Web SDK
O Web SDK define ou utiliza os seguintes cookies:
| Nome do cookie | Domínio | Duração | Uso | Detalhes |
|---|---|---|---|---|
| afUserid | Domínio do seu site | 395 dias | Non-Accelerated Mobile Pages (páginas não aceleradas para dispositivos mobile) | Identifica um usuário no contexto de eventos de carregamento de páginas da web e navegação. |
| AF_SYNC | Domínio do seu site | 1 semana | Non-Accelerated Mobile Pages (páginas não aceleradas para dispositivos mobile) | Sinaliza que um identificador de usuário final está definido. É usado para reduzir o tempo de carregamento do site. |
| af_id | appsflyer.com | 395 dias | Páginas não-AMP quando cookies de terceiros são permitidos | Identifica um usuário no contexto de eventos de inicialização de aplicativo e navegação. |
| af_id | onelink.me | 395 dias | Páginas não-AMP quando cookies de terceiros são permitidos | Vincule interações de banner, interações do OneLink, ou ambas, a eventos de inicialização de aplicativos. |
| amp-afUserid | AMP CDN ou domínio do seu site | 1 ano | Páginas AMP | |
| AF_DEFAULT_MEASUREMENT_STATUS | Domínio do seu site | 395 dias | Non-Accelerated Mobile Pages (páginas não aceleradas para dispositivos mobile) | Armazena o estado de consentimento. Impede que o SDK funcione até que o usuário autorize. Não definido por padrão. Usado apenas quando o gating de consentimento está configurado. |