Pular para o conteúdo principal

Catálogo unificado de eventos

Esta página é o mapa canônico de todos os eventos que o front rastreia, organizados por fase do funil com a matriz de destinos (quem recebe o quê). Substitui o antigo eventos-gtm.md (que listava apenas o canal GTM).

Fonte de verdade

  • Type registry: repos/front-web-base/app/analytics/events.ts — discriminated union de todos os eventos. Adicionar evento novo = uma variant aqui.
  • Matrix: repos/front-web-base/app/analytics/destinations.ts — mapa EventId → DestinationMap. Marketing pede destino novo num evento existente = uma linha aqui.
  • Dispatcher: repos/front-web-base/app/analytics/dispatch.ts — fan-out engine. Lê a matriz e chama os adapters non-null.

Princípios

  1. Front mapeia o que o front observa. Eventos backend-only (pix paid via webhook PSP, bet placed via game iframe webhook, dormant detection via cron) NÃO estão aqui — vão pra Contract BFF.
  2. Adicionar um destino é uma linha na matriz. Se a Meta quer receber viewed_casino como ViewContent, marketing pede e dev troca meta_pixel: null por meta_pixel: { name: "ViewContent", payloadFn: ... }.
  3. Dispatch é exhaustivo at compile time. TypeScript erra se evento novo entra no registry sem destino mapeado.

Canais de destino (10 hoje)

CanalComo é dispatchedStatus
gtmdataLayer.push({ event, ... })✅ Ativo (todas as brands com gtmId)
meta_pixelfbq("track", name, params)✅ Ativo (brands com pixelId)
kwaikwaiq.instance(id).track(name)✅ Ativo (brands com kwaiPixelId)
taboola_tfa.push({ notify: "action", name })✅ Ativo (brands com taboolaId)
tiktok_pixelttq.track(name, params) direto🟡 Hoje só via GTM custom HTML (matriz desligada por enquanto pra evitar duplicidade)
mixpanelmixpanel.track(name)🟡 Hoje chamado direto no useAnalytics (matriz desligada durante transição)
smarticoSDK próprio🟡 Fluxo separado
webtrendsA/B testing🟡 Fluxo separado (não consome eventos)
audience_cookieaddAudienceTag(name) no <rmkBrand>_aud✅ Ativo (brands com remarketing flag)
bff_capiexternal_id no body de signup/deposit pro BFF🟡 Roadmap (depende do BFF — ver Contract BFF)

Mapa por fase do funil

A. Pré-cadastro (visitor anônimo)

EventoTrigger no frontDestinos ativos
page_viewtoda navegação SPAgtm, meta_pixel (PageView), kwai (contentView)
view_modal_loginabrir modal de logingtm
view_modal_cadastroabrir modal de cadastrogtm
viewed_casinorota sob casinoaudience_cookie
viewed_live_casinorota casino.liveaudience_cookie
viewed_game_detailrota casino.playaudience_cookie
viewed_sportsrota sob sportsaudience_cookie
viewed_promotionsrota sob promotionsaudience_cookie
played_demo 🆕clique no botão "Demo" no GameIframegtm, audience_cookie
clicked_registerabertura do modal de registeraudience_cookie
started_register 🆕user digita em email/document do modalgtm, audience_cookie
abandoned_registermodal fecha sem auth completaaudience_cookie
viewed_app_install_banner 🆕banner PWA/APK aparece (surface: footer hoje)gtm, audience_cookie
scrolled_to_payment_seals 🆕viewport hit nos seals do footer (após scroll)gtm, audience_cookie

B. Pós-cadastro / pré-FTD

EventoTrigger no frontDestinos ativos
sign_upBFF /auth/register retornou OKgtm, meta_pixel (Lead), kwai (completeRegistration), taboola, bff_capi
loginBFF /auth/login retornou OKgtm
registeredmodal de register fechou + auth bem-sucedidaaudience_cookie
viewed_deposit_modalabertura do modal de depositaudience_cookie
abandoned_depositmodal de deposit fecha (sempre — set-once)audience_cookie
home_deposit_loginclique no CTA de deposit (logado)gtm
home_deposit_registerauto-open de deposit pós-registergtm
deposit_initiatedsubmit do form de depositgtm (pix_generated/astropayDeposit/etc), meta_pixel (PixGenerated custom)

C. Pós-FTD / engajado

EventoTrigger no frontDestinos ativos
deposit_confirmedpolling do BFF retorna approvedgtm (pix_confirmado/pix_confirmado_ftd)
first_depositquando deposit_confirmed.isFirstDeposit === truegtm, meta_pixel (Purchase), kwai (purchase), taboola, bff_capi
second_depositquando deposit_confirmed.isFirstDeposit === falsegtm
purchaseversão legacy do FTD (compat)gtm, meta_pixel (Purchase), kwai (purchase), taboola
ftd_completedderivado de first_depositaudience_cookie
multi_depositderivado de second_depositaudience_cookie
withdrawsubmit do form de saquegtm (saque)

Behavior

EventoTrigger no frontDestinos ativos
searchsubmit de busca (jogo ou esporte)gtm
view_game_pageabrir página de detalhe do jogogtm
game_page_depositclique em deposit dentro do iframe do jogogtm

Ecommerce (GA4 + interno)

EventoTrigger no frontDestinos ativos
view_item_listseção entra no viewport (interno)gtm
view_item_list_ga4seção entra no viewport (GA4 ecommerce padrão)gtm
select_itemclique num card de jogogtm
view_promotionbanner/promoção entra no viewportgtm
select_promotionclique no banner/promoçãogtm

🆕 = adicionado na refatoração do registry (2026-05).

Como adicionar evento novo

Caso 1 — evento novo que o front pode observar

  1. Adiciona a variant em app/analytics/events.ts (AnalyticsEvent).
  2. Adiciona o ID no array ANALYTICS_EVENT_IDS (TS força — vai erra se faltar).
  3. Adiciona a phase em EVENT_PHASE.
  4. Adiciona entrada em app/analytics/destinations.ts (DESTINATIONS) com cada canal explicit (null ou slot).
  5. No componente que observa o trigger, importa pushMetricEvent de ~/utils/metrics/index e chama pushMetricEvent({ type: "...", ...payload }).
  6. Atualiza esta tabela.

Caso 2 — destino novo num evento existente

Marketing pede "agora viewed_casino também vai pra Meta como ViewContent":

// destinations.ts
viewed_casino: {
// ...outros canais
meta_pixel: { name: "ViewContent" }, // ← era null
// ...
}

Adapter pushFacebookEvent precisa de uma case pra viewed_casino se o payload for não-trivial — quando vazio (fbq("track", "ViewContent") direto), basta destravar a matriz. Adiciona case em app/utils/metrics/facebook.ts.

Caso 3 — evento backend-only

Não vai pra cá. Vai pra Contract BFF. Front não vê.

User fields enriquecidos (em todos os eventos GTM)

Todos os eventos GTM são enriquecidos automaticamente via gtmUserParams(user):

{
// base do evento
event: "first_deposit",
user_id: "12345",
// ...

// user fields injetados
user_email: "user@example.com",
user_phone: "+5511999999999",
user_first_name: "João",
user_last_name: "Silva",
user_dob: "1990-01-01",
affiliate_btag: "AFIL1",
}

Permite tags GTM enviarem Enhanced Conversions (hashed PII) pro Google Ads / Meta CAPI / TikTok Events API (quando configuradas).

Schema customizável por brand (renomear no GTM)

O analyticsSchemaConfig continua existindo e brands podem renomear nomes de evento GTM:

{
events: {
firstDeposit: "first_deposit", // ← pode ser "ftd_legacy" em brand específica
pixGenerated: "pix_generated", // ← pode ser "pix_brl_v2" em outra
}
}

Útil pra GTM containers legacy (7k, etc) com triggers já configurados em event names específicos. Renomeação acontece no adapter GTM — outros canais (Meta, Kwai, Taboola) usam os nomes da matriz direto.

Como debuggar

dataLayer manual

window.dataLayer.filter(e => e.event === "first_deposit")
window.dataLayer.filter(e => e.event === "rmk_audience_tag")

DevTools → Application → Cookies → <rmkBrand>_aud (JSON com tags).

Console em dev

window.__rmk
// → { id: "...", ts: ..., tags: [...], ... }

Pixel helpers

Anti-patterns

  1. Adicionar evento custom só no GTM tag. Sem entry no registry, o front nunca dispara.
  2. Mudar nome de evento sem atualizar GTM. Quebra trigger no container — eventos viram silenciosos.
  3. Disparar Purchase em deposit_initiated. Infla conversão (depósito gerado mas não pago vira Purchase). A matriz já segrega — deposit_initiated só vai pra GTM + Meta (PixGenerated custom). Purchase real vem de first_deposit/purchase.
  4. Logar PII em campo não-hashado direto no dataLayer. Use Enhanced Conversions / hashed values.
  5. Adicionar case num adapter sem atualizar a matriz. Adapter dispara mesmo se matriz disser null na ordem dos eventos. Usa o registry como SoT.
  6. Esquecer da matriz quando declarar evento novo. TS pega — Record<AnalyticsEventId, DestinationMap> força exhaustividade.

Histórico

  • 2026-05 — Migração pro registry unificado. MetricEvent virou alias de AnalyticsEvent. Audience tags do RemarketingCapture passam pelo registry. 4 flags MVP novas (played_demo, started_register, viewed_app_install_banner, scrolled_to_payment_seals). Doc reescrita pra refletir matriz multi-canal.
  • Anterior — Doc cobria apenas GTM (mapeamento legacy 7k Vue → React 19).