Como podemos ajudar?

API server-to-server (S2S) para mensuração da performance web

  • Atualizado

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

 

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 a jornada até seu app mobile. Não é só 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 do mobile. People-Based Attribution (PBA), o produto web legado, está sendo substituída pelo Web Performance Measurement, criada sobre o mecanismo principal de atribuição da AppsFlyer e um modelo de dados unificado. A Mensuração de performance web faz tudo o que o PBA faz hoje e ainda acrescenta:

  • Uma fonte única de verdade, mensuração web e do 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 acompanha a lógica do seu negócio, para você investir mais nas campanhas que realmente funcionam.
  • ROAS aprimorado, postbacks de otimização enriquecidos para suas ad networks e uma configuração server-side completa que mensura mais conversões, para que as networks possam otimizar com sinais melhores.
  • ROI cross-platform real, mensure toda a jornada do usuário entre web, app mobile e qualquer plataforma.
  • Relatórios simples e unificados, um dashboard e um conjunto de relatórios de dados para todas as plataformas, atualizados a cada hora.

Você não precisa substituir seu SDK web. A Mensuração de performance web usa o mesmo SDK, sem mudanças de código no seu site. O esforço envolvido no restante da mudança varia, dependendo de como você recebe seus dados hoje: pelo dashboard, pelo Data Locker ou pela API Server-to-server (S2S).

Comparação entre PBA e Mensuração de performance web

Esta seção compara o PBA e a Mensuração de performance web de duas formas: recursos gerais e resolução da fonte de tráfego.

Mensuração de performance web vs. PBA

A tabela abaixo compara os recursos do PBA e da Mensuração de performance web em dados, relatórios e atribuição.

Recursos Descrição PBA Mensuração de performance web
agregados
Relevância dos dados Com que rapidez os dados ficam disponíveis para relatórios Diariamente Relatórios por hora, com aproximadamente 2 horas de atualização dos dados
Modelo de dados Alinhamento do esquema com dados de atribuição mobile Diferente do mobile Alinhado com o mobile, fácil de unir e analisar
Relatórios
Dashboard de atividades Dashboard com base no horário do evento Com suporte Com suporte
Painel de coorte Analisar a performance por cohort de aquisição ao longo do tempo Sem suporte Com suporte
Dados brutos do Data Locker Acesso a dados de atribuição brutos por meio da exportação do Data Locker Com suporte Com suporte
Granularidade em nível de 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 tanto no dashboard quanto nos dados brutos
LTV cross-platform Una as jornadas do usuário na web e no mobile em um LTV unificado Sem suporte Com suporte
Custo e sinais
Custo web Ingere e cria relatórios sobre o gasto com anúncios para campanhas web Não suportado Suportado
Postbacks de otimização Enviar sinais de otimização de volta para a ad network Não suportado Suportado
Implementação
SDK web (Pixel) SDK do lado do cliente para mensurar visitas e eventos na web Suportado Mesmo SDK, sem necessidade de alterar o código
Suporte S2S Mensuração completa do lado do servidor para visitas e eventos Apenas eventos Eventos e visitas. Oferece suporte a uma implementação completa do lado do servidor.
Mecanismo de Atribuição
Janelas de atribuição Janelas configuráveis de lookback, atribuição, reengajamento e inatividade Apenas janela de lookback de clique 5 janelas configuráveis (controle total)
Evento de UA personalizado Define qual evento conta como um evento de aquisição de usuários (UA) além da primeira visita Apenas 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

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, veja por quê. Ambos usam a mesma abordagem subjacente: resolvem o canal de mídia a partir dos parâmetros da 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, com base nas regras de atribuição de canal de mídia do PBA e em 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)  Exemplo Twitter

A mensuração de performance 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 e snapweb_int para snapchat_int. Relatórios criados com base nos valores brutos antigos precisam considerar os novos.

Cobertura de ID de clique ampliada, e dclid removido

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

A mensuração de performance web 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 e rdt_cid para reddit_int.

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

Regras personalizadas de UTM expandidas

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

Disponível apenas em relatórios avançados.

Os valores do canal também mudam de formato, de Direct / Organic search / Social media / Email / Ad / Referral / Other da 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.

Migrar para a mensuração de performance web

A migração tem uma etapa obrigatória para todos. Depois disso, execute as etapas que se aplicam à sua configuração da PBA.

Espere diferenças nos números (todos)

Os números da PBA não vão corresponder exatamente aos que você terá após a migração. A lógica de atribuição na mensuração de performance web é mais avançada e mais flexível. A PBA aplicava suas próprias regras de atribuição de canal de mídia; a mensuração de performance web usa uma resolução de fonte de tráfego aprimorada. Veja "Resolução de fonte de tráfego, PBA vs. mensuração de performance web" abaixo para saber quais valores esperar. A lógica de gravação de sessão em si não mudou; uma sessão continua durando 30 minutos de atividade, o padrão do mercado.

1. Criar um aplicativo web (obrigatório para todos)

  1. Crie o novo aplicativo web, selecionando sua Dev Key web atual no campo Web SDK ID. Isso mantém o código atual do seu site funcionando como está, sem alterações no código.
  2. Configure as configurações de atribuição no novo aplicativo.

3. Se você envia eventos pela S2S API

Migre para a nova S2S API:

  1. Consulte a migração de PBA Web-S2S para a nova S2S API para ver o que muda em relação à sua integração atual de PBA S2S, endpoints, autenticação e campos de payload.
  2. Configure a nova S2S API para a mensuração de performance web.
  3. Atualize sua integração do lado do servidor para enviar para os novos endpoints.

3. Se você usa os relatórios de dados brutos da PBA

Migre para os novos relatórios do Data Locker. O relatório de eventos do usuário final substitui os relatórios de visitas ao site e de eventos do site da PBA.

  1. Confirme que você tem o Data Locker. Se não tiver, você precisará adicioná-lo à sua conta ou comprá-lo.
  2. Consulte o mapeamento de campos de dados brutos para ver o mapeamento completo no nível de campo, além dos campos renomeados, redefinidos ou descontinuados.
  3. Ative o novo relatório usando Exportar dados do relatório de atribuição web da AppsFlyer do Data Locker.
  4. Aponte seu BI/ETL para a nova localização e os novos campos do relatório. Isso se aplica independentemente de seus eventos chegarem via SDK ou S2S; ambos são incluídos no mesmo relatório de dados brutos.

4. Se você usa o Brand Bundle da PBA para relatórios entre plataformas

  1. Criar uma linha de produtos.
  2. Agrupe seu aplicativo web com seus outros aplicativos nessa linha de produtos para habilitar relatórios de LTV do usuário entre plataformas.

Recursos descontinuados

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

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

  • Campanhas web que ajudaram em uma instalação anteriormente reportada como orgânica agora aparecem como aquisição de usuários não orgânica. Essas não são assistências; a campanha web é a fonte de aquisição.
  • Campanhas web que ajudaram em uma instalação não orgânica: a campanha web funciona como aquisição de usuários, e a instalação mobile funciona como retargeting entre plataformas.
Recálculo retroativo Não há recálculo retroativo além do atraso padrão de 30 minutos. A atribuição é finalizada após um atraso de 30 minutos, dando aos usuários tempo para se identificarem durante essa janela.
Campos de dados brutos Os campos relacionados a mobile foram descontinuados para a web. Alguns campos são renomeados, e alguns valores mudam. Consulte o mapeamento de campos de dados brutos para ver o mapeamento completo dos campos.
Eventos S2S tardios 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 dentro de 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 dos eventos próximo ao momento em que eles acontecem. Isso alinha a web ao comportamento existente no mobile.

Mapeamento de campos de dados brutos

Se você já usa os Relatórios de dados brutos de Visitas ao site e Eventos do site do PBA, veja o que muda. O relatório em si passa para o Data Locker, e este é o mapeamento completo, campo por campo, para o novo relatório de eventos do usuário final, com base nos relatórios de dados brutos do PBA.

Os dados brutos de qualquer plataforma e o reportar entre plataformas estão disponíveis somente pelo Data Locker. Consulte a Etapa 3 ou a Etapa 4 acima se você ainda não tiver o Data Locker.

  • Sem alterações, 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 (exige cuidado antes da reutilização).
  • Descontinuado, sem equivalente no novo relatório.
String vazia Descrição Estado Novo campo/observação
advertising_id ID de publicidade (GAID) Idêntico a af_siteid. ID de publicidade de dispositivo mobile, unificado entre plataformas no PBA. Os relatórios de LTV e jornada do usuário entre plataformas são baseados em CUID e não usam este campo.
af_web_id ID de cookie enviado do SDK da web Renomeado appsflyer_id_value, mesmo cookie da web.
amazon_aid ID de publicidade da Amazon Fire TV Idêntico a af_siteid. ID de mobile/dispositivo; não é relevante para web.
android_id ID do dispositivo Android Idêntico a af_siteid. ID de mobile/dispositivo; não é relevante para web.
Preenchido para posicionamento de anúncio de CTV ID do aplicativo mais recente instalado Idêntico a af_siteid. Campo mobile multiplataforma. O identificador do aplicativo web no novo relatório é unified_app_id ("website-{domain}"), um conceito diferente.
Indica se o usuário permite que o Google use seus dados a nível de usuário para mensuração e anúncios personalizados (true) ou não (false). Nome do aplicativo mais recente Inalterado app_name.
app_version Versão mais recente do aplicativo Idêntico a af_siteid. Campo mobile multiplataforma; não é relevante para web.
appsflyer_id ID da AppsFlyer (instalação) Idêntico a af_siteid. 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, a hora do toque atribuído (engajamento).
Página de exportação: moeda selecionada Tipo de touchpoint, sempre "web visit" Idêntico a af_siteid. Valor constante em PBA. A comparação visita vs. evento agora está em end_user_event_type (SESSION / IN_APP).
bundle_id ID do bundle PBA Idêntico a af_siteid. Substituído pelo agrupamento Linha de Produto (web + aplicativos mobile) no relatório multiplataforma.
Carga útil Atribuído à visita ao site Renomeado campaign_name.
Fuso horário (do cliente) no momento da conversão Atribuído à visita ao site Inalterado campaign_id.
Versão do SDK da AppsFlyer Resolvido usando o endereço IP Inalterado city.
Disponível apenas em relatórios avançados. 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 em visitas (a PBA escreveu "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: hora da visita. Eventos: hora do evento Inalterado event_time.
event_type Evento padrão/evento de conversão/visita ao site Redefinido A marcação de evento de conversão não existe mais. A distinção entre visita vs. evento está em end_user_event_type (SESSION / IN_APP).
event_url URL da página web onde o evento ocorreu (equivale à URL original nas visitas) Inalterado event_url, agora também é o principal local para ler os parâmetros de consulta da URL (UTMs etc.).
event_value Eventos: detalhes do evento como JSON. Visitas: null Inalterado event_value.
idfa Identificador do anúncio Idêntico a af_siteid. Device ID do dispositivo mobile, não relevante para a web.
idfv Identificador do anúncio Idêntico a af_siteid. Device ID do dispositivo mobile, não relevante para a web.
imei Identificador do dispositivo Idêntico a af_siteid. Device ID do dispositivo mobile, não relevante para a web.
install_time Horário da instalação mais recente do aplicativo Idêntico a af_siteid. Campo mobile multiplataforma. O horário de aquisição de usuário na web (conversão) é event_time__conversion, um conceito separado.
ip Endereço IP do visitante Renomeado ip_address_value, mesmo valor, além de ip_address_type para o método de hashing.
language Informado pelo agente do usuário (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") Idêntico a af_siteid. 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") Idêntico a af_siteid. Vazio para web. A distinção entre orgânico vs. pago agora vem do booleano is_organic.
OAID Identificador do anúncio Idêntico a af_siteid. ID do mobile/dispositivo, não relevante para a 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.
Número real 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 Idêntico a af_siteid. A string de consulta bruta fica em event_url. A coluna de JSON analisado não existe mais.
referrer Referenciador HTTP da visita atribuída ao website Renomeado http_referrer.
Nome do Adset Resolvido usando o endereço IP ("NA") Renomeado continent, código do continente, por exemplo, "NA".
Sequência de caracteres Resolvido usando o endereço IP Inalterado state.
Prompt pronto para uso para um agente de codificação na migração de ETL do Data Locker

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

Você está migrando um pipeline de ETL dos relatórios de dados brutos do Data Locker de PBA legado da AppsFlyer (visitas ao site + eventos do site) para o relatório de Mensuração de performance web do Data Locker 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 presuma 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 de PBA consumimos (visitas ao site, eventos do site ou ambos) e onde eles são ingeridos.
2. Cada campo de PBA que lemos e onde cada um é usado mais adiante (transformações, joins, 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 de PBA (por exemplo, nomes de media_source, rótulos de canal, event_type, valores de plataforma).

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

## Etapa 2: Faça-me estas perguntas

1. O novo relatório de eventos do usuário final já está habilitado no Data Locker (habilitado pela IU da 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 da AppsFlyer antes de continuarmos.
3. Queremos um período de execução paralela (pipelines antigo e novo 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 de conversões (instâncias únicas de atribuição, sem linhas duplicadas) ou o relatório de eventos do usuário final multiplataforma (deduplicado por CUID, em nível de usuário de web + mobile)? O escopo padrão é o relatório de eventos do usuário final em nível de plataforma, sucessor direto dos relatórios de PBA.

## Mudanças estruturais a serem consideradas no design

1. **Um relatório em vez de dois.** O PBA separava visitas e eventos em dois relatórios. O novo relatório de eventos do usuário final contém ambos: visitas são linhas com end_user_event_type = 'SESSION' e 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 único esquema em todas as plataformas.** O relatório é compartilhado entre o site, o mobile, a CTV e o PC. Sempre filtre plataforma = 'WEBSITE' para isolar os dados da 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). Filtre is_primary_attribution = true por padrão para evitar contagem em dobro. Remova o filtro apenas para análises dedicadas de visualização de UA vs. visualização de retargeting usando conversion_type.
4. **Por hora, não por dia.** O novo relatório é entregue por hora, com atualização dos dados em aproximadamente 2 horas. 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. Usar o booleano is_organic; nunca deduza orgânico/pago de media_source.
6. **Contagem de usuários.** Conte e relacione os usuários com COALESCE(customer_user_id, appsflyer_id_value): primeiro o ID estável do usuário cliente e, como fallback, o ID baseado em cookie.
7. **Valores vazios.** Campos STRING são '', 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 no formato de dados ou de valor (trate com cuidado). Descontinuado = sem equivalente.

| Campo do PBA | Status | Novo campo / tratamento |
|---|---|---|
| advertising_id | Descontinuado | ID de 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 | Descontinuado | ID de mobile/dispositivo, não relevante para a web. |
| android_id | Descontinuado | ID de mobile/dispositivo, não relevante para a web. |
| app_id | Descontinuado | 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 | Descontinuado | Campo mobile entre plataformas. |
| appsflyer_id | Descontinuado | ID de instalação mobile. Observação: o novo appsflyer_id_value é o cookie web (af_web_id da PBA), NÃO ESTE campo. |
| attributed_touch_time | Renomeado | event_time__attribution. |
| attributed_touch_type | Descontinuado | Era uma constante. Visit-vs-event agora fica em end_user_event_type. |
| bundle_id | Descontinuado | Substituído pelo agrupamento de Linha de produto no relatório multiplataforma. |
| 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 nos valores | device_category, os valores diferem (por exemplo, "Desktop" → "MOBILE_PHONE" / valores no estilo "TV"). Atualize qualquer lógica baseada em valor. |
| dma | Inalterado | dma. |
| event_name | Redefinido | Eventos: inalterado. Visitas: agora está vazio (a PBA registrava "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. Visit-vs-event fica em end_user_event_type (SESSION / IN_APP). |
| event_url | Inalterado | event_url, agora também é o principal local de onde os parâmetros de consulta da URL principal (UTMs etc.) são lidos. |
| event_value | Inalterado | event_value. |
| idfa / idfv / imei / oaid | Obsoleto | IDs de mobile/dispositivo, não relevantes para web. |
| install_time | Obsoleto | Campo de mobile. A hora de aquisição de 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 (antes 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 valor). |
| media_type | Obsoleto | Use o booleano is_organic no lugar. |
| original_url | Renomeado | Consolidado em event_url (nas visitas, event_url é igual à URL original). A coluna independente foi removida. |
| platform | Redefinido | platform é sempre "WEBSITE". O SO foi movido para 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 a análise 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. |

## Mudanças nos valores de atribuição (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/vídeo 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 Click-ID foi expandida (mais networks são resolvidas a partir de IDs de clique); dclid sozinho não é mais resolvido; fbclid não é usado.

Verifique 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 "Mudanças estruturais").
2. Após minha aprovação, implemente, reutilizando nossas convenções e infraestrutura existentes.
3. Para cada campo obsoleto que o inventário encontrar em uso em sistemas downstream, liste o consumidor e proponha uma resolução (remover, substituir pela alternativa sugerida ou sinalizar para o responsável pelo negócio).

## Etapa 4: Validar

1. Execute ambos os pipelines no mesmo intervalo de datas e compare: visitas (linhas SESSION) vs. visitas do site do PBA, eventos (linhas IN_APP) vs. eventos do site do 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, campaign) não corresponderão exatamente ao PBA. A lógica de contagem de sessão permanece inalterada (30 minutos de atividade), então espere que os volumes de visita permaneçam na mesma faixa.
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 removido, o que mudou nos valores e quaisquer itens em aberto para o responsável pelo negócio.

Migração do PBA web-S2S para a nova API S2S

Se você reporta eventos ao PBA por meio da API de eventos servidor a servidor da web (Web-S2S), migre para a nova API S2S. A nova API oferece suporte a visitas e eventos, então seu site pode ser executado totalmente no lado do servidor; o S2S do PBA aceita 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 inline no objeto user_id em cada evento/visita
Identificador do aplicativo bundleId (ID do bundle 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 que contém 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 Web-S2S do PBA 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 de customer_user_id ou appsflyer_id; envie ambos sempre que o usuário for identificado.
webDevKey Sequência de caracteres Removido do corpo. A autenticação foi movida para o cabeçalho Authorization; o aplicativo é identificado por appId no caminho.
eventType (sempre EVENT) Sequência de caracteres Removido. O endpoint (/inapps vs. /visits) determina o tipo.
eventName DMA (área de mercado designada) 1 a 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 horário de recebimento.
Valor do evento event_value Formato livre; compatível com um subobjeto custom_parameters.
eventRevenue event_revenue Agora é opcional (o PBA exigia isso para dashboards).
eventRevenueCurrency Fonte de mídia do colaborador Agora é opcional (o PBA exigia isso para dashboards).
referrer http_referrer Renomeado.
userAgent user_agent Renomeado.
ip ip Inalterado.
Sequência de caracteres event_url Novidade. Obrigatório em visitas; opcional em eventos.
Sequência de caracteres customer_dedup_id Novidade. Remove duplicatas em relação ao mesmo evento que chega de outra fonte (por exemplo, do SDK da web).
Sequência de caracteres email_hashed, phone_number_hashed, phone_number_e164_hashed, first_name_hashed, last_name_hashed Novidade. SHA256 (hexadecimal minúsculo de 64 caracteres) de valores normalizados, para enriquecimento de identidade.
Observações sobre a API S2S
  • As visitas agora são do lado do servidor. A S2S da PBA aceitava apenas eventos; as visitas precisavam vir do SDK web. O novo endpoint /visits permite que o site funcione totalmente do lado do servidor.
  • Chega de chamada setcuid. A PBA exigia o SDK web, então era necessária uma chamada separada para vincular um CUID a um usuário web. A nova API carrega a identidade em linha em todas as solicitações, então essa etapa foi eliminada.
  • Janela de dados atrasados. Envie eventos e visitas em tempo real, de preferência 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 da 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 do payload. 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 do payload 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 alterar o código

1. Devemos modificar o serviço existente no local ou criar um novo serviço/módulo em paralelo a ele (permitindo execução paralela e uma transição limpa)? Recomende um novo módulo em paralelo.
2. Sei qual é o Unified App ID do nosso novo aplicativo web? Formato: "website-{domain}" (por exemplo, website-www.example.com). Ele substitui o bundle ID do PBA no caminho da URL. Se eu não souber, vou obtê-lo no dashboard da AppsFlyer antes de continuarmos.
3. Temos a nova chave de API S2S? A autenticação foi movida do 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 no 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 deduplicar 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 baseados na resposta 200 OK.
4. Comportamento de repetição, processamento em lote e enfileiramento.

Apresente esse 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/s2s/inapps/app/web/{appId} |
| Chamada de visita | Não disponível | POST /v2/s2s/visits/app/web/{appId} |
| Chamada de identidade | POST /v1/{bundleId}/setcuid | Nenhuma; a identidade fica embutida no objeto user_id em todas as chamadas |
| Identificador do aplicativo no caminho | bundleId (ID do bundle da marca) | appId = o Unified App ID web ("website-{domain}") |
| Autenticação | webDevKey no corpo JSON | Cabeçalho Authorization com a chave de 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. |\n| afUserId | user_id.appsflyer_id | Aninhado no objeto user_id. Envie pelo menos um entre customer_user_id e appsflyer_id; envie ambos sempre que o usuário estiver identificado. |\n| webDevKey | (removido) | A autenticação foi movida para o cabeçalho Authorization; o aplicativo é identificado por appId no caminho. |\n| eventType (sempre "EVENT") | (removido) | O endpoint (/inapps vs /visits) determina o tipo. |\n| eventName | event_name | 1-64 caracteres; não pode conter os caracteres @ = + -. |\n| timestamp (Unix ms) | timestamp (Unix ms) | Mesmo formato. Recomendado em todas as chamadas; se omitido, a AppsFlyer usa o horário de recebimento. |
| eventValue | event_value | Forma livre; oferece suporte a um subobjeto custom_parameters personalizado. |
| 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 | Sem alterações. |
| (new) | event_url | Obrigatório em visitas; opcional em eventos. |
| (new) | customer_dedup_id | Desduplica em relação ao mesmo evento que chega de outra fonte (por exemplo, o SDK web). |
| (new) | 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 na AppsFlyer mostra um UUID de "ID do SDK web" (a antiga Web Dev Key, mantida para continuidade do SDK). O caminho S2S deve conter o ID unificado do aplicativo ("website-{domain}"), nunca esse UUID. Um 401 "app not found" normalmente significa um appId incorreto no caminho ou um cabeçalho Authorization ausente/inválido.
2. **Sucesso é 202, não 200.** Atualize as verificações de integridade, as novas tentativas e os alertas de acordo com isso.
3. **Não valide em relação ao endpoint antigo.** O endpoint legado ainda pode retornar 200, mas essa resposta não é prova de que os dados chegaram ao Web Performance Measurement. Sempre verifique se os eventos realmente aparecem nos dados do novo aplicativo web.
4. **Elimine totalmente o fluxo setcuid.** A identidade é transmitida 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 acontecem, de preferência em até 30 minutos após a ocorrência do evento. Dados que chegam mais de 30 minutos após o fim do dia em 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 timestamp. 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 lado da AppsFlyer, e não algo que precisamos implementar.
7. **Opção totalmente server-side (se adotarmos visitas).** Sem o SDK web, nosso servidor controla o identificador do usuário web: gere um ID estável para visitantes de primeira viagem, persista-o como um cookie HTTP first-party definido pelo servidor (cabeçalho Set-Cookie, não JavaScript; cookies JS têm limite de aproximadamente 7 dias no Safari), reutilize-o em todas as solicitações e envie-o como user_id.appsflyer_id. O payload da visita deve incluir event_url, e recomendamos também incluir ip, user_agent e http_referrer para a qualidade da atribuição.
8. **SDK + S2S juntos.** Se ambos enviarem o mesmo evento, preencha customer_dedup_id para que a AppsFlyer mantenha 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 hardcoded), builders de payload para eventos (e visitas, se estiverem no escopo) e o tratamento de resposta/novas tentativas para 202.
2. Após minha aprovação, implemente isso seguindo nossas convenções existentes.
3. Mapeie cada campo do inventário usando o mapeamento de payload acima; sinalize qualquer campo que enviamos atualmente e que não tenha equivalente novo.

## 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 no AppsFlyer (dashboard ou Data Locker); esse é o verdadeiro sinal de sucesso, não a resposta HTTP.
3. Confirme se os nomes dos eventos estão em conformidade com as novas restrições (1-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 migração e, em seguida, desative as chamadas antigas, incluindo setcuid.