Debug
Como inspecionar cada surface de marketing pra investigar problema de tracking.
DevTools — onde olhar cada coisa
Cookies
Application → Cookies → seleciona o domínio.
| Cookie | Pra que olhar |
|---|---|
cookie_tracking | UTMs, clicked-IDs, affiliate code |
cookie_referrer | Referrer first-touch + cinfo IDs |
_ga | GA client ID |
<rmkCookie> — rmk7k, rmkbpb, rmkcl7k, … | UUID de remarketing (nome varia por brand — ver Config map) |
<rmkCookie>_aud | Audience tags do funil |
lastclick | Clever Advertising ID |
cookies_consent | Preferências LGPD do user |
_fbp, _fbc | Meta Pixel cookies |
Filtrar pelo nome no campo de search da tabela. Click numa linha → painel inferior mostra "Cookie Value" + opção "Show URL-decoded" pra JSON formatado.
Network
Filtra por:
auth/register→ payload de signuppayments/deposit→ payload de depositgoogletagmanager.com→ GTM container + tagsconnect.facebook.net→ Meta Pixelanalytics.google.com→ Google Analyticskwai.net→ Kwaitaboola.com→ Taboola
Cada request tem 3 abas valiosas:
- Headers →
X-ORIGIN-*,X-LOG-INFO,Authorization - Payload → body do POST (UTMs, clicked-IDs, etc)
- Response → o que o BFF retornou (incluindo
X-INFOS-ID/X-INFOS-REF)
Console
// dataLayer primário
window.dataLayer
window.dataLayer.filter(e => e.event === "first_deposit")
window.dataLayer.length
// anaLayer — dataLayer do container SECUNDÁRIO (brands com anaLayer habilitado)
window.anaLayer
window.anaLayer?.filter(e => e.event === "first_deposit")
// Consent Mode v2 — wrapper gtag do módulo de consent (nome neutro de propósito)
window.__gtagConsent
window.dataLayer.filter(e => e[0] === "consent")
// Remarketing
window.__rmk
window.__rmk?.id
window.__rmk?.tags
// Meta Pixel
window.fbq
window._fbq
// Smartico
window._smartico
window._smartico_user_id
// GTM
window.google_tag_manager // (objeto interno do GTM)
// AppsFlyer (em modo app)
window.twa // bridge TWA
:::caution window.dataLayer vazio não significa "tagging quebrado"
Seis brands rodam com disableGtm: true em produção, e o 7k-bet-br migrou o tagging pro
container secundário — nele o dataLayer primário fica realmente vazio e tudo passa pelo
window.anaLayer. Confirme em qual container a brand está antes de concluir que há bug: ver
Config map por brand.
:::
Application → Local Storage / Session Storage
| Key | Conteúdo |
|---|---|
cookie_appsflyer_id (sessionStorage) | AppsFlyer ID do device (TWA) |
cookie_advertising_id (sessionStorage) | Advertising ID Android (TWA) |
cookie_app_version (sessionStorage) | Versão do APK |
c_documentReferrer (sessionStorage) | Referrer da sessão atual |
c_documentReferrerLocal (localStorage) | Referrer first-touch ever |
Rota /debug/analytics (só em dev)
Dispatcher manual de eventos: um select com cada variante de evento, uma matriz de campos por tipo,
e um tail ao vivo de tudo que entra no dataLayer (a rota intercepta os dataLayer.push). Serve
pra disparar um evento específico sem ter que percorrer o fluxo que normalmente o dispara —
útil pra validar trigger de GTM em minutos em vez de fazer signup + depósito de teste.
http://localhost:<DEV_PORT>/debug/analytics
:::info Não existe em produção — e não é uma decisão de runtime
A rota é gateada na geração das rotas (app/router/routes.ts, dentro de isDevBuild ? [...]),
junto do /debug. Em build de produção ela simplesmente não é registrada — não é 404 por guard,
é rota inexistente. Consistente com a regra do projeto de que código de debug é gateado por
import.meta.env.DEV e não chega ao bundle de prod. Não peça pra "ligar em prod": não há flag.
:::
Pra debugar tagging em produção o caminho é o oposto — inspecionar o dataLayer/anaLayer do
usuário real pelo console e correlacionar com wrangler tail via X-LOG-INFO.
Extensões Chrome úteis
| Extensão | Pra que serve |
|---|---|
| Meta Pixel Helper | Lista todos eventos Meta disparados em tempo real |
| TikTok Pixel Helper | Idem TikTok |
| Google Tag Assistant | Tags Google em geral (GTM, Analytics, Ads) |
| Adswerve dataLayer Inspector | Visualiza dataLayer events bonitinho |
| Cookie-Editor | Edita/remove cookies sem precisar abrir Application tab |
Debug em produção
?EnableDebug=1 foi REMOVIDO do bundle de produção em maio/2026. Razão: vazamento de cookies sensíveis em response. Não há toggle visual de debug em prod.
Pra debuggar prod
1. Cloudflare Dashboard → Workers & Pages → <worker> → Logs
Caminho recomendado. Tem filtro e histórico, e não exige descobrir nome de worker na mão.
2. wrangler tail (server logs em real-time)
:::danger --env production não funciona
O wrangler.toml do front-web-base não declara nenhum environment — não existe
[env.production] nem qualquer [env.*]. wrangler tail --env production falha com erro de
environment desconhecido. Também não há script tail no package.json.
:::
Cada brand/ambiente deploya como um worker separado, então o tail é por nome de worker:
cd repos/front-web-base
pnpm wrangler tail <worker-name> --format pretty
O nome do worker vem do pipeline de deploy, não deste repo — está em
front-ops/config/brands/web-base/environments/<environment>/deploy.yml, campo worker_name:
# lista todos os workers e seus ambientes
grep -rn "worker_name" repos/front-ops/config/brands/web-base/environments/*/deploy.yml
O padrão é front-web-<environment>, mas não confie no padrão — há exceções (o ambiente
prod-7k-bet-br, por exemplo, deploya no worker front-web-7k-bet-br). Sempre leia o
deploy.yml.
O tail traz os logs server-side em tempo real, incluindo o X-LOG-INFO que casa com a request do
usuário.
3. Cloudflare Observability → Logs (RUM)
Logs estruturados de browser side (page views, performance, etc).
4. Network tab no browser do user
Pede pro user reportando bug abrir DevTools → Network → reproduzir → exportar HAR file. Manda pro time de dev.
Reportando bug
Quando reportar bug de tracking, inclua:
- URL exata acessada
- Brand
X-LOG-INFOda request afetada (do Network tab)cookie_trackingcontent (JSON do cookie)window.__rmk?.id(UUID de remarketing — facilita correlação)- Steps to reproduce
- Screenshot do Network tab da request afetada
Cenários comuns
"Cookie não está sendo escrito"
Possíveis causas:
- HTTP em prod —
SameSite=NoneexigeSecure. HTTP local OK (cookie escreve comLax). - Browser bloqueando 3rd-party cookies — verifique Settings → Privacy → "Block third-party cookies". Em modo "block all",
SameSite=Nonecookies não escrevem em iframes. - Brand com remarketing desligado —
remarketingFeaturesConfig.enabled: false→ o cookie nunca escreve. (Hoje todas as 13 brands estão ligadas, então essa causa é improvável.) - Cookie name inválido — contém
cactus/bluetec→ front rejeita em runtime e loga warning no console.
"UTMs no cookie mas não no payload"
Possíveis causas:
- Form submit antes do hidrate completar — TrackingCapture ainda não rodou. Caso raro, mas acontece em form submitado por click muito rápido.
- Modal não usa o hook
useTrackingParams— verificar imports doRegisterModal.tsx/DepositModal.tsx.
"Pixel não dispara"
Possíveis causas, em ordem de frequência:
disableGtm: truena brand — vale pra 6 brands em prod. Verifica o config map.- Container errado — a brand roda no
anaLayer, não nodataLayerprimário. enabledSpecificEvents— a brand tem whitelist de eventos GTM e o seu evento não está nela (betpontobet-bet-br,donald-bet-br). O dispatcher no-opa em silêncio.- Canal inerte na brand —
floodlightsemanalyticsConfig.floodlight,pendosempendoConfig.enabled,taboolasemtaboolaId. A matriz declara o slot, a brand não tem o canal. ?app=true/?is_twa=true— modo app não carrega os pixels de marketing.thirdPartyScriptsDisabled: true— kill switch global ativo.- GCM v2
denied— brand não-cosmética + recusa registrada em visita anterior. O pixel carrega mas opera em modo limitado (sem cookies de identificação). - GTM container vazio — o pixel não foi configurado no GTM. O operador do container precisa adicionar a tag.
- Estratégia
engagement— em7k-bet-bro download dos scripts espera a primeira interação real ou o deadline de 5s. Antes disso os eventos ficam enfileirados (não perdidos) — se você só carregou a página e olhou o Network, ainda não baixou.
"Atribuição inflada/errada num canal"
Possíveis causas:
- UTM em link interno — header com
?utm_source=headersobrescreve atribuição real. Auditar links internos. - Janela de atribuição errada — o default do
cookie_trackingé 30 dias, não 7. Uma campanha curta pode estar recebendo crédito de clique de até um mês atrás. Ver UTMs. - Cap de cookie hit —
utm_*custom sendo dropped. Olha tamanho do cookie vs cap de 20 chaves.
"Banner LGPD aparece sempre"
Possíveis causas:
cookies_consentcookie sendo limpo — pode ser extension de privacidade (DuckDuckGo, Privacy Badger) limpando.- TTL expirou — 365 dias passaram.
brand.features.cookieConsentPopupmudou no backoffice. Validar.
Anti-patterns
- Tentar usar
?EnableDebug=1em prod. Foi removido em maio/2026. Use o Dashboard ouwrangler tail <worker-name>. - Rodar
wrangler tail --env production. Não existe environment nowrangler.toml— o comando erra. O tail é por nome de worker. - Pedir pra "ligar o
/debug/analyticsem prod". A rota não é registrada em build de produção — não existe flag que a ligue. - Confiar em DevTools de dev local pra validar prod. Configs de analytics diferem (gtmId via
API,
containerIddo anaLayer énullem dev, Stape só resolve em prod,disableGtm: trueem dev nas 8 brands com override). - Limpar cookies a cada teste. Atrapalha investigação de "bug que só acontece em user com X cookie pré-existente".
- Pedir log "verbose" pra dev. Logs de prod são server-side — peça o
X-LOG-INFOda request afetada. - Concluir "tagging quebrado" olhando só
window.dataLayer. Confira oanaLayertambém.