Pular para o conteúdo principal

AppsFlyer (S2S)

AppsFlyer é a integração Server-to-Server (S2S) pra atribuição de instalações de app. Só funciona em modo TWA (?app=true) — no web puro, AppsFlyer não está ativo.

Configuração por brand

// overrides/<brand>/app/config/analytics/appsflyer.ts
export const appsFlyerConfig = {
enabled: true,
appId: "br.bet.k.twa", // ← mesmo do AndroidManifest
// ...
};
BrandappId (TWA package name)
7kbr.bet.k.twa
Cassinocassino.bet.br.twa
Verabr.bet.vera.twa.apk
Demais brands com TWA(a confirmar com time mobile)

Modelo de funcionamento

Chave: S2S vai do BFF pro AppsFlyer, não do browser. Resistente a ad blockers.

Por que S2S antes do gate de trackers?

O useAnalytics.trackDepositConfirmed chama appsFlyer.sendFTD/sendRebill antes do gate if (!shouldLoadTrackers) return. Razão:

shouldLoadTrackers = !isAppMode && !isBot
useAppsFlyer.ready = isAppMode && enabled

Os dois escopos são inversos. Se o S2S ficasse dentro do gate, nunca seria chamado:

  • No app (escopo correto): shouldLoadTrackers = false → return early → nunca chama appsFlyer
  • No web: appsFlyer.ready = false → não envia mesmo que chame

Solução: chama AppsFlyer S2S antes do gate. Bug histórico que ficou meses sem ser detectado em maio/2026.

Eventos enviados

Evento FrontEvento AppsFlyer
first_deposit (FTD)dep
second_deposit (rebill)rebill

Saídas da dep/rebill:

{
"event": "dep",
"value": 50.00,
"appsflyer_id": "<from sessionStorage>",
"advertising_id": "<from sessionStorage>",
"app_version": "<from sessionStorage>"
}

appsflyer_id, advertising_id, app_version são populados pelo APK via TWA bridge no boot — sem eles, S2S funciona mas perde matching com instalação original.

Versão de APK gating

Algumas features de S2S exigem versão mínima do APK (ex: nova API de bridge). O front lê cookie_app_version e compara com versionGte:

if (versionGte(appVersion, "2.5.0")) {
// usa nova API
}

Mantém compatibilidade retroativa com APKs velhos sem forçar update.

Como debuggar

AppsFlyer dashboard

hq.appsflyer.com → seu app → Overview → events recebidos.

Em dev

?app=true na URL + injetar window.twa = { getPostMessageService: () => ({ postMessage: console.log }) } no console pra simular bridge.

Anti-patterns

  1. Mover appsFlyer.sendFTD pra dentro do gate de trackers. Quebra atribuição mobile (bug histórico de maio/2026).
  2. Confiar em web pra atribuição mobile. Web não tem appsflyer_id válido. S2S sem esse ID perde matching com install.
  3. Não atualizar appId quando time mobile renomeia o package. S2S vai pra dataset errado no AppsFlyer.