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
// ...
};
| Brand | appId (TWA package name) |
|---|---|
| 7k | br.bet.k.twa |
| Cassino | cassino.bet.br.twa |
| Vera | br.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 Front | Evento 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
- Mover
appsFlyer.sendFTDpra dentro do gate de trackers. Quebra atribuição mobile (bug histórico de maio/2026). - Confiar em web pra atribuição mobile. Web não tem appsflyer_id válido. S2S sem esse ID perde matching com install.
- Não atualizar
appIdquando time mobile renomeia o package. S2S vai pra dataset errado no AppsFlyer.