How can we help?

Migrar do PBA para a mensuração da performance na web

  • Atualizado

Em resumo: a People-Based Attribution (PBA) está sendo substituída pelo Web Performance Measurement, a solução aprimorada de mensuração na web da AppsFlyer. Este artigo aborda o que está mudando, as etapas de migração e o mapeamento completo de campos para seus relatórios e integrações do lado do servidor.

Por que estamos aprimorando sua mensuração web

A mensuração web é mais importante do que nunca. É no site que muitos dos seus usuários convertem e onde começa o caminho até o seu app mobile. Não se trata apenas de uma landing page; é um funil completo de aquisição com fluxos de quiz, onboarding personalizado, paywalls e lojas web que muitas vezes conquistam usuários com maior intenção a um custo de aquisição menor.

A AppsFlyer está elevando a mensuração web ao mesmo padrão da mensuração mobile. A People-Based Attribution (PBA), o produto web legado, está sendo substituída pelo Web Performance Measurement, desenvolvido com base no mecanismo principal de Atribuição e no modelo de dados unificado da AppsFlyer. O Web Performance Measurement corresponde a tudo o que o PBA faz hoje e adiciona:

  • Uma única fonte de verdade, mensuração na web e mensuração de app mobile em um só lugar, com custos agregados, postbacks de otimização e otimização de criativos.
  • Melhores decisões de orçamento, atribuição flexível que corresponde à lógica do seu negócio, para que você invista mais nas campanhas que realmente funcionam.
  • ROAS aprimorado, postbacks de otimização enriquecidos para suas ad networks e uma configuração completa do lado do servidor que mensura mais conversões, para que as networks possam otimizar usando melhores sinais.
  • ROI real entre plataformas, mensure toda a jornada do usuário na web, no app e em qualquer plataforma.
  • Relatórios simples e unificados, um dashboard e um conjunto de relatórios de dados para cada plataforma, atualizados a cada hora.

Atenção

A mudança exige um esforço mínimo da sua parte. Você mantém o mesmo SDK web, sem alterações de código no seu site.

Importante!

Espere algumas diferenças nos números. A lógica de atribuição no Web Performance Measurement é mais avançada e mais flexível, portanto os números do PBA não corresponderão exatamente.

Web Performance Measurement vs. PBA

Recursos A descrição PBA Web Performance Measurement
agregados
Relevância dos dados Com que rapidez os dados ficam disponíveis para relatórios ✗ diariamente ✓ Relatórios por hora, com atualização dos dados em aproximadamente 2 horas
Modelo de dados Alinhamento de esquema com dados de Atribuição mobile ✗ Diferente do mobile ✓ Alinhado ao mobile, fácil de integrar e analisar
Relatórios
Dashboard de atividades Dashboard com base no tempo do evento ✓ Permitido ✓ Permitido
Painel de coorte Analise a performance por coorte de aquisição ao longo do tempo ✗ Não suportado ✓ Permitido
Dados brutos do Data Locker Acesso aos dados de atribuição brutos via exportação do Data Locker ✓ Permitido ✓ Permitido
Granularidade no nível do anúncio Detalhamento do relatório da campanha até o nível do anúncio ✗ Apenas no dashboard, não nos dados brutos ✓ Granularidade completa da campanha no dashboard e nos dados brutos
LTV cross-platform Una as jornadas de usuários da web e do mobile em um LTV unificado ✗ Não suportado ✓ Permitido
Custo e sinais
Custo web Ingira e gere relatórios sobre o gasto com anúncios para campanhas web ✗ Não suportado ✓ Permitido
Postbacks de otimização Envie sinais de otimização de volta para ad networks ✗ Não suportado ✓ Permitido
Implementação
SDK web (Pixel) SDK do lado do cliente para mensurar visitas e eventos na web ✓ Permitido ✓ Mesmo SDK, sem necessidade de alterações no código
Suporte S2S Mensuração completa do lado do servidor para visitas e eventos ✗ Apenas eventos ✓ Eventos e visitas. Suporta uma implementação completa do lado do servidor.
Mecanismo de Atribuição
Janelas de atribuição Janelas de lookback, atribuição, reengajamento e inatividade configuráveis ✗ Apenas janela de lookback de clique ✓ 5 janelas configuráveis (controle total)
Evento personalizado de UA Define qual evento conta como aquisição de usuários além da primeira visita ✗ Apenas a primeira visita ✓ Qualquer evento personalizado (por exemplo, cadastro, compra)
UA vs. retargeting Crédito separado para nova aquisição vs. reengajamento ✗ Sem conceito de UA, eventos atribuídos ao último toque ✓ Visualizações dedicadas de UA e retargeting com crédito duplo de atribuição

Etapas da migração

A tabela abaixo divide a migração em cinco etapas. Criar um aplicativo web se aplica a todos; o restante depende dos recursos de PBA que você usa atualmente, como a API S2S ou os relatórios do Data Locker.

Action Relevante para O que envolve
Criar um aplicativo web Todos Quando você criar o novo aplicativo web, selecione sua Dev Key web existente no campo Web SDK ID. Isso mantém o código atual do seu site funcionando como está, sem alterações no código. Em seguida, configure as definições de atribuição no novo aplicativo.
Migrar para a nova API S2S Usar a API S2S do PBA Configure a nova API S2S. Ela oferece suporte a visitas e eventos, para que você possa executar tudo no lado do servidor. Veja abaixo o apêndice de migração da API S2S.
Mudar para os novos relatórios do Data Locker Consumir relatórios do Data Locker do PBA Habilite o novo relatório web na interface e aponte seu BI/ETL para os dados atualizados. Os novos relatórios seguem um esquema único compartilhado entre todas as plataformas, incluindo aplicativos móveis, sites, CTV e PC. Veja abaixo o apêndice de mapeamento dos campos de dados brutos.
Revisar parâmetros de atribuição Recomendado O PBA aplicava suas próprias regras de atribuição de canal de mídia. O Web Performance Measurement usa resolução aprimorada da fonte de tráfego para refinar a análise. Revise as diferenças para saber quais valores esperar nos seus relatórios. Veja abaixo o apêndice de comparação da resolução da fonte de tráfego.
Agrupar apps em uma linha de produtos OPCIONAL Crie uma linha de produtos e agrupe o aplicativo web com seus apps mobile para desbloquear relatórios de LTV do usuário entre plataformas (semelhante ao PBA Brand Bundle).

Atenção

Espere algumas diferenças nos números. A lógica de atribuição no Web Performance Measurement é mais avançada e mais flexível, portanto os números do PBA não corresponderão exatamente. A própria lógica de registro de sessão não mudou; uma sessão ainda dura 30 minutos de atividade, o padrão do mercado.

Capacidades que serão descontinuadas

Recursos O que muda Atenção
Caminho de conversão Já está obsoleto.
Instalações assistidas pela web (crédito para uma campanha web que ajudou a impulsionar uma instalação mobile posterior) Não há uma visualização dedicada de "instalações assistidas pela web".

As jornadas Web-to-app são mensuradas com Smart Script e Smart Banner. O relatório entre plataformas oferece uma análise semelhante, embora não idêntica. Assim como no PBA, ele se baseia em CUID:

  • Campanhas web que antes auxiliavam uma instalação reportada como orgânica agora aparecem como aquisição de usuários não orgânica. Não se trata de assistências; a campanha web é a fonte de aquisição.
  • Campanhas web que auxiliaram uma instalação não orgânica: a campanha web se torna a aquisição de usuários, e a instalação mobile se torna retargeting multiplataforma.
Recálculo retroativo Sem recálculo retroativo além do atraso padrão de 30 minutos. A atribuição é finalizada após um atraso de 30 minutos, o que dá aos usuários tempo para se identificarem dentro dessa janela.
Campos de dados brutos Os campos relacionados a mobile foram descontinuados para a web. Alguns campos são renomeados, e alguns valores mudam. Veja o apêndice de mapeamento dos campos de dados brutos abaixo.
Eventos S2S atrasados Eventos que chegam mais de 30 minutos após o fim do dia UTC em que ocorreram ainda são aceitos, mas o horário do evento é substituído pelo horário em que a AppsFlyer os recebeu. Envie eventos em tempo real, de preferência em até 30 minutos após a ocorrência do evento, em vez de agrupá-los em um único upload diário. A atribuição precisa depende do recebimento de eventos próximo ao momento em que acontecem. Isso alinha a web ao comportamento mobile existente.

Apêndice: alterações nos relatórios de dados brutos

Mapeamento único de todos os campos do Relatório de dados brutos do PBA (visitas ao site e eventos do site) para o novo relatório de eventos do usuário final. Fonte: Relatórios de dados brutos do PBA.

Escopo: o relatório de visitas ao site e eventos do site do PBA.

  • Inalterado, mesmo nome de campo e mesmos dados.
  • Renomeado, mesmos dados, novo nome de coluna.
  • Redefinido, nome igual ou semelhante, mas os dados ou o formato do valor mudam (requer cuidado antes da reutilização).
  • Descontinuado, sem equivalente no novo relatório.
String vazia A descrição Estado Novo campo/observação
advertising_id ID de publicidade (GAID) Descontinuado ID de publicidade do dispositivo mobile, vinculado entre plataformas no PBA. Os relatórios de LTV entre plataformas e de jornada do usuário são baseados em CUID e não usam esse campo.
af_web_id ID de cookie enviado do SDK da web Renomeado appsflyer_id_value, mesmo cookie web.
amazon_aid ID de publicidade da Amazon Fire TV Descontinuado Device ID mobile/do dispositivo, não relevante para web.
android_id ID do dispositivo Android Descontinuado Device ID mobile/do dispositivo, não relevante para web.
ativado ID do aplicativo mais recente instalado Descontinuado Campo multiplataforma mobile. O identificador do aplicativo web no novo relatório é unified_app_id ("website-{domain}"), um conceito diferente.
ativado Nome do aplicativo mais recente Inalterado app_name.
app_version Versão mais recente do aplicativo Descontinuado Campo mobile multiplataforma, não relevante para web.
appsflyer_id ID da AppsFlyer (instalação) Descontinuado ID de instalação mobile. O novo appsflyer_id_value é o cookie web (af_web_id), um identificador distinto.
attributed_touch_time Carimbo de data/hora da visita web (atribuída) Renomeado event_time__attribution, o horário do toque (engajamento) atribuído.
tipo_de_toque_atribuído Tipo de touchpoint, sempre "visita web" Descontinuado Valor constante em PBA. Visita vs. evento agora fica em end_user_event_type (SESSION / IN_APP).
bundle_id ID do bundle PBA Descontinuado Substituído pelo agrupamento Linha de Produto (web + aplicativo mobile) no relatório multiplataforma.
Twitter Atribuído à visita ao site Renomeado campaign_name.
id_da_campanha Atribuído à visita ao site Inalterado campaign_id.
cidade Resolvido usando o endereço IP Inalterado city.
código_país Resolvido usando o endereço IP Inalterado country_code.
customer_user_
id
Identificador de Usuário do Cliente (CUID) Inalterado customer_user_id.
device_type O tipo de dispositivo Renomeado device_category, os valores diferem ("Desktop" vs. "MOBILE_PHONE" / "TV").
dma Resolvido usando o endereço IP Inalterado dma.
nome_do_evento Visitas: sempre "website visit". Eventos: nome do evento enviado Redefinido Vazio nas visitas (o PBA registrava "website visit"). Inalterado para eventos.
event_revenue Valor da receita do evento na moeda de compra Renomeado revenue_value_original.
event_currency Código de moeda de 3 dígitos de event_revenue Renomeado revenue_currency_original.
event_revenue_usd event_revenue convertido para USD Renomeado revenue_usd.
event_source Ou o SDK web ou servidor a servidor Inalterado event_source.
event_time Visitas: horário da visita. Eventos: horário do evento Inalterado event_time.
event_type Evento padrão/evento de conversão/visita ao website Redefinido A marcação de evento de conversão não existe mais. Visit vs. event fica em end_user_event_type (SESSION / IN_APP).
event_url URL da página web onde ocorreu o evento (igual à URL original nas visitas ao site) Inalterado event_url, agora também é o local principal para ler os parâmetros de consulta da URL (UTMs etc.).
event_value Eventos: detalhes do evento como JSON. Visitas: nulo Inalterado event_value.
idfa Identificador do anúncio Descontinuado ID de mobile/dispositivo, não relevante para web.
idfv Identificador do anúncio Descontinuado ID de mobile/dispositivo, não relevante para web.
imei Identificador do dispositivo Descontinuado ID de mobile/dispositivo, não relevante para web.
install_time Horário de instalação mais recente do aplicativo Descontinuado Campo mobile multiplataforma. O horário de aquisição de usuários da web (conversão) é event_time__conversion, um conceito separado.
ip Endereço IP do visitante Renomeado ip_address_value, mesmo valor, mais ip_address_type para o método de hashing.
language Informado pelo user agent (por exemplo, "English") Redefinido language, o formato do valor muda para ISO 639-1 e código do país.
media_channel Atribuído à visita ao site ("Anúncio") Descontinuado Pode ser coberto por sub_param_1-5, se necessário.
fonte_de_mídia Atribuído à visita ao site Inalterado media_source.
media_type Atribuído à visita ao site ("Pago") Descontinuado Vazio para web. Orgânico vs. pago agora vem do booleano is_organic.
OAID Identificador do anúncio Descontinuado ID de mobile/dispositivo, não relevante para web.
original_url URL que redirecionou o usuário na visita atribuída Renomeado Consolidado em event_url (em visitas, event_url é igual à URL original). A coluna independente não existe mais.
platforma A plataforma ("macOS", "Windows") Redefinido A plataforma é sempre "WEBSITE". O sistema operacional foi movido para os_version / user_agent.
postal_code Resolvido usando o endereço IP Inalterado postal_code.
query_params Parâmetros de consulta na URL de redirecionamento, como JSON Descontinuado A string de consulta bruta fica em event_url; a coluna de JSON analisado não existe mais.
referrer Referenciador HTTP da visita ao website atribuída Renomeado http_referrer.
Região Resolvido usando o endereço IP ("NA") Renomeado continent, código do continente, por exemplo, "NA".
estado Resolvido usando o endereço IP Inalterado state.

Prompt pronto para uso de um agente de codificação para migração de ETL do Data Locker

Para facilitar essa transição, preparamos um prompt pronto para uso para o seu agente de codificação de IA (Claude Code, Cursor ou similar). Dê ao agente acesso ao seu código ETL existente e cole o prompt abaixo; ele contém o mapeamento completo dos campos e todas as diferenças de comportamento. Ele orientará o agente a aprender seu pipeline atual e recriá-lo para o novo relatório.

Você está migrando um pipeline de ETL dos relatórios de dados brutos do PBA legado do Data Locker da AppsFlyer (visitas ao site + eventos do site) para o relatório de Data Locker de Mensuração de Performance Web da AppsFlyer (eventos do usuário final). Tudo o que você precisa está neste prompt: as mudanças estruturais, o mapeamento completo campo a campo e as etapas de validação. Não suponha nada além do que está escrito aqui; se algo estiver ambíguo, pergunte-me.

## Etapa 1: Aprenda o pipeline atual

Antes de escrever qualquer código, explore a base de código existente e produza um inventário:
1. Quais relatórios PBA consumimos (visitas ao web, eventos do web ou ambos) e onde eles são ingeridos.
2. Todos os campos PBA que lemos e onde cada um é usado adiante (transformações, junções, dashboards, alertas, exportações).
3. A cadência de carga e as premissas de agendamento (PBA entregue diariamente).
4. Qualquer lógica que separe ou una linhas de visita e linhas de evento.
5. Quaisquer filtros, agrupamentos ou valores codificados de forma fixa com base em valores de campos PBA (por exemplo, nomes de media_source, rótulos de canal, event_type, valores de plataforma).

Apresente esse inventário para mim e aguarde minha confirmação antes de prosseguir.

## Etapa 2: Faça estas perguntas para mim

1. O novo relatório End User Events já está habilitado no Data Locker (habilitado pela interface do AppsFlyer)? Se não, preciso habilitá-lo primeiro.
2. Qual é o Unified App ID do nosso novo aplicativo web? Formato: "website-{domain}" (por exemplo, website-www.example.com). Se eu não souber, vou obtê-lo no dashboard do AppsFlyer antes de continuarmos.
3. Queremos um período de execução paralela (pipelines antiga e nova lado a lado, comparando as saídas) ou uma migração direta? Recomendo a execução paralela.
4. O novo pipeline também deve consumir o relatório Conversions (instâncias de atribuição únicas, sem linhas duplicadas) ou o relatório End User Events entre plataformas, deduplicado por CUID (nível de usuário em web+mobile)? O escopo padrão é o relatório End User Events no nível da plataforma, o sucessor direto dos relatórios PBA.

## Mudanças estruturais para considerar no design

1. **Um relatório em vez de dois.** O PBA dividia visitas e eventos em dois relatórios. O novo relatório End User Events contém ambos: as visitas são linhas com end_user_event_type = 'SESSION' e os eventos são linhas com end_user_event_type = 'IN_APP'. Somente as linhas IN_APP têm um event_name válido; nas linhas SESSION, event_name fica vazio (o PBA registrava "website visit" ali).
2. **Um schema em todas as plataformas.** O relatório é compartilhado entre website, mobile, CTV e PC. Sempre filtre platform = 'WEBSITE' para isolar os dados web.
3. **Crédito de atribuição duplo, deduplique.** A mesma ação pode aparecer duas vezes: uma linha de crédito primário e uma linha de crédito secundário (fonte de UA original, para LTV na visualização de UA). Por padrão, filtre is_primary_attribution = true para evitar contagem dupla. Remova o filtro apenas para análises dedicadas de visualização de UA vs. visualização de retargeting usando conversion_type.
4. **Por hora em vez de diariamente.** O novo relatório é entregue por hora, com aproximadamente 2 horas de defasagem na atualização dos dados. Reestruture as cargas incrementais em torno de lotes por hora, em vez de uma entrega diária.
5. **Orgânico vs. pago.** O media_type ("Paid") do PBA não existe mais. Use o booleano is_organic; nunca infira orgânico/pago a partir de media_source.
6. **Contagem de usuários.** Conte e una os usuários com COALESCE(customer_user_id, appsflyer_id_value), usando primeiro o ID de usuário do cliente estável e, como fallback, o ID baseado em cookie.
7. **Valores vazios.** Os campos STRING são '', os campos NUMERIC são NULL.

## Mapeamento campo a campo (PBA → Eventos do Usuário Final)

Legenda de status: Inalterado = mesmo nome e mesmos dados. Renomeado = mesmos dados, nova coluna. Redefinido = alterações nos dados ou no formato do valor (trate com cuidado). Obsoleto = sem equivalente.

| Campo do PBA | Status | Novo campo / tratamento |
|---|---|---|
| advertising_id | Obsoleto | Device ID mobile/dispositivo. Os relatórios entre plataformas são baseados em CUID; descarte-o. |
| af_web_id | Renomeado | appsflyer_id_value, mesmo cookie da web. |
| amazon_aid | Obsoleto | ID de dispositivo/mobile, não relevante para web. |
| android_id | Obsoleto | ID de dispositivo/mobile, não relevante para web. |
| app_id | Obsoleto | Campo mobile entre plataformas. O novo identificador do Aplicativo web é unified_app_id ("website-{domain}"), um conceito diferente, não uma renomeação. |
| app_name | Inalterado | app_name. |
| app_version | Obsoleto | Campo mobile entre plataformas. |
| appsflyer_id | Obsoleto | ID de instalação mobile. Observação: o novo appsflyer_id_value é o cookie da web (o af_web_id do PBA), NÃO este campo. |
| attributed_touch_time | Renomeado | event_time__attribution. |
| attributed_touch_type | Obsoleto | Era uma constante. A distinção entre visita vs. evento agora está em end_user_event_type. |
| bundle_id | Obsoleto | Substituído pelo agrupamento de Linha de Produto no relatório entre plataformas. |
| campaign | Renomeado | campaign_name. |
| campaign_id | Inalterado | campaign_id. |
| city | Inalterado | city. |
| country_code | Inalterado | country_code. |
| customer_user_id | Inalterado | customer_user_id. |
| device_type | Renomeado + alteração de valores | device_category, os valores são diferentes (por exemplo, "Desktop" → "MOBILE_PHONE" / valores no estilo "TV"). Atualize qualquer lógica baseada em valores. |
| dma | Inalterado | dma. |
| event_name | Redefinido | Eventos: inalterado. Visitas: agora vazio (o PBA escreveu "website visit"). Use end_user_event_type = 'SESSION' para identificar visitas. |
| event_revenue | Renomeado | revenue_value_original. |
| event_revenue_currency | Renomeado | revenue_currency_original. |
| event_revenue_usd | Renomeado | revenue_usd. |
| event_source | Inalterado | event_source. |
| event_time | Inalterado | event_time. |
| event_type | Redefinido | A marcação de "evento de conversão" não existe mais. A distinção entre visita e evento está em end_user_event_type (SESSION / IN_APP). |
| event_url | Inalterado | event_url, agora também é o local principal de onde os parâmetros de consulta da URL (UTMs etc.) são lidos. |
| event_value | Inalterado | event_value. |
| idfa / idfv / imei / oaid | Descontinuado | IDs mobile/de dispositivo, não relevantes para web. |
| install_time | Descontinuado | Campo mobile. O momento de aquisição do usuário na web é event_time__conversion, um conceito separado. |
| ip | Renomeado | ip_address_value (mais ip_address_type para o método de hashing). |
| language | Redefinido | language, o formato muda para ISO 639-1 + código do país (era, por exemplo, "English"). |
| media_channel | Obsoleto | Pode ser coberto por sub_param_1-5, se necessário. |
| media_source | Inalterado | media_source (mas veja abaixo as renomeações de valores). |
| media_type | Obsoleto | Use o booleano is_organic em vez disso. |
| original_url | Renomeado | Consolidado em event_url (em visitas, event_url é igual à URL original). A coluna independente foi removida. |
| platform | Redefinido | platform é sempre "WEBSITE". O SO foi movido para os campos os_version / user_agent. |
| postal_code | Inalterado | postal_code. |
| query_params | Obsoleto | A string de consulta bruta fica em event_url; a coluna de JSON analisado foi removida. Reimplemente o parsing a partir de event_url, se necessário. |
| referrer | Renomeado | http_referrer. |
| region | Renomeado | continente, código do continente (por exemplo, "NA"). |
| state | Inalterado | state. |

## Alterações de valores atribuídos (atualize filtros e agrupamentos)

O mecanismo de atribuição resolve as fontes de tráfego de forma diferente, então alguns VALORES mudam mesmo quando os nomes dos campos não mudam:
- renomeações de media_source: doubleclick_int → dv360_int (display/video do Google via UTM); "X Ads" → "Twitter" (Twitter via UTM). Mais valores de PID agora são remapeados para nomes de exibição (por exemplo, iossearchads_int → Apple Search Ads, metweb_int → Facebook Ads, tiktokweb_int → tiktokglobal_int, snapweb_int → snapchat_int).
- Os rótulos de canal mudam de formato: Direct / Organic search / Social media / Email / Ad / Referral / Other passam a ser DIRECT / ORGANIC_SEARCH / SOCIAL_MEDIA / EMAIL / AD / REFERRAL / OTHER.
- A cobertura de IDs de clique foi ampliada (mais networks são resolvidas a partir de IDs de clique); dclid sozinho não é mais resolvido; fbclid não é usado.

Examine a base de código em busca de qualquer filtro, CASE, chave de join ou agrupamento de dashboard baseado nesses valores antigos e atualize-os.

## Etapa 3: Criar

1. Proponha o novo design de ETL (ingestão, esquema, lógica incremental por hora, os filtros obrigatórios de "Structural changes").
2. Após minha aprovação, implemente-o reutilizando nossas convenções e infraestrutura existentes.
3. Para cada campo obsoleto que o inventário encontrar em uso downstream, liste o consumidor e proponha uma solução (remover, substituir pela alternativa sugerida ou sinalizar ao responsável de negócios).

## Etapa 4: Validar

1. Execute ambos os pipelines no mesmo intervalo de dias e compare: visitas (linhas SESSION) vs. visitas ao site no PBA, eventos (linhas IN_APP) vs. eventos do site no PBA e totais de receita.
2. Espere diferenças, não igualdade: a nova lógica de atribuição é mais avançada, então as dimensões atribuídas (media_source, campanha) não corresponderão exatamente ao PBA. A lógica de contagem de sessões permanece inalterada (30 minutos de atividade), portanto os volumes de visita devem ficar na mesma ordem de grandeza.
3. Verifique se o filtro is_primary_attribution é aplicado em todos os lugares; a ausência dele aparece como contagens infladas de eventos.
4. Produza um breve relatório de migração: o que foi mapeado, o que foi descartado, o que mudou nos valores e quaisquer itens pendentes para o responsável pela área de negócios.

Apêndice: migração de PBA Web-S2S para a nova API S2S

Se você reporta eventos ao PBA por meio da API de eventos servidor a servidor web (Web-S2S), migre para a nova API S2S. A nova API oferece suporte a visitas e eventos, para que seu site possa ser executado totalmente no lado do servidor; o S2S do PBA aceitava apenas eventos.

Endpoints e autenticação

PBA web-S2S Nova API S2S
URL base https://webs2s.appsflyer.com https://events.appsflyer.com
Chamada de evento POST /v1/{bundleId}/event POST /v2.0/s2s/inapps/app/web/{appId}
Chamada de visita Não disponível (as visitas vinham apenas do SDK web) POST /v2.0/s2s/visits/app/web/{appId}
Chamada de identidade POST /v1/{bundleId}/setcuid (chamada separada para associar um CUID a um usuário web) Nenhuma, a identidade é enviada em linha no objeto user_id em cada evento/visita
Identificador do aplicativo bundleId (ID do pacote da marca) no caminho appId = o unified_app_id web ("website-{domain}") no caminho
Autenticação webDevKey dentro do corpo JSON em cada chamada Cabeçalho Authorization contendo a chave da API S2S
Tipo de conteúdo application/json application/json
Resposta de sucesso 200 OK 202 Aceito

Mapeamento de campos do payload

Campo PBA web-S2S Novo campo S2S Atenção
customerUserId user_id.customer_user_id Agora aninhado no objeto user_id.
afUserId user_id.appsflyer_id Agora aninhado no objeto user_id. Envie pelo menos um entre customer_user_id e appsflyer_id; envie ambos sempre que o usuário for identificado.
webDevKey Removido do corpo. A autenticação foi movida para o cabeçalho Authorization; o Aplicativo é identificado por appId no caminho.
eventType (sempre EVENT) Removido. O endpoint (/inapps vs. /visits) determina o tipo.
eventName nome_do_evento 1-64 caracteres; não pode conter @ = + -.
timestamp (Unix ms, 13 dígitos) timestamp (Unix ms) Mesmo formato. Recomendado em todas as chamadas; se omitido, a AppsFlyer usa o tempo de recebimento.
Valor do evento event_value Formato livre; oferece suporte a um subobjeto custom_parameters.
eventRevenue event_revenue Agora opcional (o PBA exigia isso para dashboards).
eventRevenueCurrency event_currency Agora opcional (o PBA exigia isso para dashboards).
referrer http_referrer Renomeado.
userAgent user_agent Renomeado.
ip ip Inalterado.
event_url Novidade. Obrigatório em visitas; opcional em eventos.
customer_dedup_id Novidade. Desduplica em relação ao mesmo evento que chega de outra fonte (por exemplo, o SDK web).
email_hashed, phone_number_hashed, phone_number_e164_hashed, first_name_hashed, last_name_hashed Novidade. SHA256 (hexadecimal em minúsculas com 64 caracteres) de valores normalizados, para enriquecimento de identidade.

Observações sobre a API S2S

  • As visitas agora são do lado do servidor. O S2S do PBA aceitava apenas eventos; as visitas precisavam vir do SDK web. O novo endpoint /visits permite que o site opere totalmente do lado do servidor.
  • Não é mais necessária a chamada setcuid. O PBA exigia o SDK web, então era necessária uma chamada separada para vincular um CUID a um usuário da web. A nova API carrega a identidade inline em todas as solicitações, então essa etapa foi removida.
  • Janela para dados atrasados. Envie eventos e visitas em tempo real, de preferência em até 30 minutos após a ocorrência do evento, em vez de agrupá-los em um único upload diário. Os dados que chegam mais de 30 minutos após o fim do dia UTC em que o evento ocorreu ainda são aceitos, mas o horário do evento é substituído pelo horário em que a AppsFlyer os recebeu.

Migração do serviço S2S: prompt pronto para uso para agente de código

Se você reporta eventos pela API servidor a servidor do PBA, preparamos um prompt pronto para uso para seu agente de codificação com IA (Claude Code, Cursor ou similar). Dê ao agente acesso ao serviço que envia eventos para a AppsFlyer e cole o prompt abaixo; ele contém o endpoint completo e o mapeamento da carga útil. Ele orientará o agente a entender sua implementação atual e criar a versão atualizada.

Você está migrando uma integração do lado do servidor da API legada de eventos PBA Web S2S da AppsFlyer (webs2s.appsflyer.com) para a nova API S2S da AppsFlyer para mensuração de performance web (events.appsflyer.com). Tudo o que você precisa está neste prompt: endpoints, autenticação, o mapeamento completo da carga útil e as mudanças de comportamento. Não presuma nada além do que está escrito aqui; se algo estiver ambíguo, pergunte-me.

## Etapa 0: Faça estas perguntas antes de mexer no código

1. Devemos modificar o serviço existente no local ou criar um novo serviço/módulo em paralelo a ele (permitindo uma execução paralela e uma transição limpa)? Recomende um novo módulo em paralelo.
2. Eu sei o ID unificado do aplicativo do nosso novo aplicativo web? Formato: "website-{domain}" (por exemplo, website-www.example.com). Ele substitui o ID do pacote do PBA no caminho da URL. Se eu não souber, vou obtê-lo no dashboard da AppsFlyer antes de continuarmos.
3. Tenho a nova chave da API S2S? A autenticação passou da webDevKey no corpo da solicitação para um cabeçalho Authorization que carrega esta chave. Se eu não a tiver, vou recuperá-la no dashboard da AppsFlyer.
4. Queremos enviar apenas eventos (como no PBA) ou adotar também o novo endpoint de visitas? A nova API oferece suporte a visitas do lado do servidor, então o site pode ser executado totalmente do lado do servidor; o PBA aceitava apenas eventos.
5. O SDK web da AppsFlyer ainda está em execução no nosso site? (Isso determina se as visitas vêm do SDK e se precisamos de desduplicação de eventos entre o SDK e o S2S.)

## Etapa 1: Conheça o serviço atual

Explore a base de código e produza um inventário:
1. Todos os pontos de chamada para webs2s.appsflyer.com, as chamadas para /event e quaisquer chamadas para /setcuid.
2. Os campos preenchidos em cada chamada (customerUserId, afUserId, eventName, eventValue, eventRevenue, timestamp, referrer, userAgent, ip etc.) e de onde vêm seus valores.
3. Tratamento de erros e monitoramento com base na resposta 200 OK.
4. Comportamento de tentativas, processamento em lote e enfileiramento.

Apresente este inventário para mim e aguarde minha confirmação antes de prosseguir.

## O que mudou: endpoints e autenticação

|  | PBA Web-S2S (antigo) | Nova API S2S |
|---|---|---|
| URL base | https://webs2s.appsflyer.com | https://events.appsflyer.com |
| Chamada de evento | POST /v1/{bundleId}/event | POST /v2.0/s2s/inapps/app/web/{appId} |
| Chamada de visita | Não disponível | POST /v2.0/s2s/visits/app/web/{appId} |
| Chamada de identidade | POST /v1/{bundleId}/setcuid | Nenhuma; a identidade está embutida no objeto user_id em todas as chamadas |
| Identificador do aplicativo no caminho | bundleId (ID do pacote da marca) | appId = o ID unificado do aplicativo web ("website-{domain}") |
| Autenticação | webDevKey no corpo JSON | Cabeçalho Authorization com a chave da API S2S |
| Tipo de conteúdo | application/json | application/json (415 se estiver ausente) |
| Resposta de sucesso | 200 OK | 202 Accepted |

## Mapeamento de campos do payload

| Campo do PBA | Novo campo | Observação |
|---|---|---|
| customerUserId | user_id.customer_user_id | Aninhado no objeto user_id. |
| afUserId | user_id.appsflyer_id | Aninhado no objeto user_id. Envie pelo menos um entre customer_user_id ou appsflyer_id; envie ambos sempre que o usuário estiver identificado. |
| webDevKey | (removido) | A autenticação foi movida para o cabeçalho Authorization; o aplicativo é identificado pelo appId no caminho. |
| eventType (sempre "EVENT") | (removido) | O endpoint (/inapps vs /visits) determina o tipo. |
| eventName | event_name | 1-64 caracteres; não pode conter os caracteres @ = + -. |
| timestamp (Unix ms) | timestamp (Unix ms) | Mesmo formato. Recomendado em todas as chamadas; se omitido, o AppsFlyer usa o horário de recebimento. |
| eventValue | event_value | Formato livre; oferece suporte a um subobjeto custom_parameters. |
| eventRevenue | event_revenue | Agora é opcional (o PBA exigia isso para dashboards). |
| eventRevenueCurrency | event_revenue_currency | Agora é opcional (o PBA exigia isso para dashboards). |
| referrer | http_referrer | Renomeado. |
| userAgent | user_agent | Renomeado. |
| ip | ip | Inalterado. |
| (novo) | event_url | Obrigatório em visitas; opcional em eventos. |
| (novo) | customer_dedup_id | Remove duplicatas em relação ao mesmo evento que chega de outra fonte (por exemplo, o SDK web). |
| (novo) | email_hashed, phone_number_hashed, phone_number_e164_hashed, first_name_hashed, last_name_hashed | SHA256 (hexadecimal minúsculo de 64 caracteres) de valores normalizados, para enriquecimento de identidade. |

## Mudanças de comportamento e pontos de atenção

1. **appId é o ID unificado do Aplicativo, não o "ID do SDK web".** A página de configurações do Aplicativo no AppsFlyer mostra um UUID de "ID do SDK web" (a antiga Web Dev Key, mantida para continuidade do SDK). O caminho S2S deve incluir o ID unificado do Aplicativo ("website-{domain}"), nunca esse UUID. Um 401 "app not found" geralmente significa um appId incorreto no caminho ou um cabeçalho Authorization ausente/inválido.
2. **O sucesso é 202, não 200.** Atualize as verificações de integridade, as novas tentativas e os alertas adequadamente.
3. **Não valide em relação ao endpoint antigo.** O endpoint legado ainda pode retornar 200, mas essa resposta não prova que os dados chegaram à mensuração de performance web. Sempre verifique se os eventos realmente aparecem nos dados do novo Aplicativo web.
4. **Elimine totalmente o fluxo setcuid.** A identidade é enviada inline no objeto user_id em cada evento e visita.
5. **Visitas antes de eventos.** O sistema espera uma visita antes de qualquer evento de um usuário; eventos de um usuário sem visita anterior são classificados como orgânicos. As visitas vêm do SDK web ou, agora, do endpoint /visits.
6. **Envie em tempo real; não agrupe em lote.** Envie cada evento e visita conforme acontecer, de preferência em até 30 minutos após a ocorrência do evento. Os dados que chegam mais de 30 minutos após o fim do dia UTC em que o evento ocorreu ainda são aceitos, mas o horário do evento é substituído pelo horário de recebimento, o que distorce a atribuição. Sempre envie um registro de data/hora. Observe que o atraso de atribuição de aproximadamente 30 minutos sobre o qual você pode ler é uma retenção separada, no lado do servidor, do AppsFlyer — não é algo que precisemos implementar.
7. **Opção completa do lado do servidor (se adotarmos visitas).** Sem o Web SDK, o nosso servidor controla o identificador do usuário na web: gere um ID estável para visitantes de primeira visita, persista-o como um cookie HTTP first-party definido pelo servidor (cabeçalho Set-Cookie, não JavaScript; cookies JS têm um limite de aproximadamente 7 dias no Safari), reutilize-o em todas as solicitações e envie-o como user_id.appsflyer_id. A carga útil da visita deve incluir event_url (e deve incluir ip, user_agent, http_referrer para a qualidade da atribuição).
8. **SDK + S2S juntos.** Se ambos enviarem o mesmo evento, preencha customer_dedup_id para que o AppsFlyer mantenha apenas uma cópia.

## Etapa 2: Criar

1. Proponha o design: novo cliente/módulo, configuração (URL base, appId, armazenamento da chave de API no nosso gerenciador de segredos, nunca codificada diretamente), builders de carga útil para eventos (e visitas, se estiverem no escopo) e o tratamento de resposta/repetição para 202.
2. Após a minha aprovação, implemente isso seguindo nossas convenções existentes.
3. Mapeie todos os campos do inventário por meio do mapeamento de carga útil acima; sinalize qualquer campo que enviamos atualmente e que não tenha um novo equivalente.

## Etapa 3: Validar

1. Envie um evento de teste (e visita, se estiver no escopo) e confirme uma resposta 202.
2. Verifique se os dados de teste aparecem no novo aplicativo web na AppsFlyer (dashboard ou Data Locker); esse é o sinal real de sucesso, não a resposta HTTP.
3. Confirme se os nomes dos eventos estão em conformidade com as novas restrições (1 a 64 caracteres, sem @ = + -).
4. Se estiver em execução em paralelo com o serviço antigo, compare os volumes de eventos entre o antigo e o novo por alguns dias antes da transição e, em seguida, desative as chamadas antigas, incluindo setcuid.

Apêndice: resolução da fonte de tráfego, PBA vs. mensuração de performance web

Se os valores de canal de mídia, canal ou campanha forem diferentes do que o PBA reportou, aqui está o motivo. Ambos usam a mesma abordagem subjacente: resolvem o canal de mídia a partir de parâmetros de URL e do referenciador na visita web, percorrendo uma lista de prioridades até que a primeira correspondência prevaleça. Mas várias regras mudaram, e essas mudanças alteram os valores que você vê nos relatórios. Fontes: Regras de atribuição de canal de mídia do PBA e Sobre a resolução da fonte de tráfego.

Valores de canal de mídia renomeados

Trigger Valor do PBA Novo valor
Google display/video (utm_source=Google + utm_medium= cpm / display/banner/video/listing) doubleclick_int dv360_int
Twitter via UTM (twitter + cpc) AppsFlyer Twitter

A mensuração de performance da web também remapeia mais valores de PID para nomes de exibição, por exemplo, iossearchads_int para Apple Search Ads, metweb_int para Facebook Ads, twitterweb_int para Twitter, tiktokweb_int para tiktokglobal_int, snapweb_int para snapchat_int. Relatórios criados com base nos valores brutos antigos precisam considerar os novos.

Cobertura de IDs de clique ampliada e dclid removido

O PBA resolvia três IDs de clique: gclid para googleadwords_int, dclid para doubleclick_int e msclkid para bingsearch_int.

A web performance mensuração resolve muitos outros: gclid/wbraid/gbraid para googleadwords_int, msclkid para bingsearch_int, twclid para Twitter, vmcid para yahoogemini_int, sccid para snapchat_int, li_fat_id para linkedin_int, ttclid para tiktokglobal_int, tbclid para taboola_int, ob_click_id/dicbo para outbrain_int, yclid para yandex_int, rdt_cid para reddit_int.

Aviso

Duas mudanças de comportamento: dclid não é mais usado sozinho para resolução (o PBA o resolvia para doubleclick_int) e fbclid explicitamente não é usado.

Regras personalizadas de UTM ampliadas

O mapeamento personalizado de utm_source + utm_medium é mais amplo na web performance mensuração: inclui mais sinônimos de mídia (paid, paid_search, paid-search etc.) e adicionou cobertura para TikTok, Snapchat e Pinterest além das regras restritas de mídia única do PBA. Quando nenhuma regra personalizada corresponde, ambos recorrem ao valor bruto de utm_source.

Canal

Os valores de canal também mudam de formato, de Direct / Organic search / Social media / Email / Ad / Referral / Other do PBA para os novos DIRECT / ORGANIC_SEARCH / SOCIAL_MEDIA / EMAIL / AD / REFERRAL / OTHER. Os filtros e agrupamentos baseados nos rótulos antigos precisam ser atualizados.

This article was translated using AI and may contain errors. For the most accurate information, please refer to the English version using the language selector.


Share article: