Testar uma campanha
Procedimento de validação antes de subir uma campanha em produção. Garante que o tracking captura tudo que deveria.
Pré-requisitos
- Acesso ao dev local ou a um ambiente de staging
:::note A porta do dev server não é sempre 5173
5173 é o default do Vite, mas o workspace pode sobrescrever via DEV_PORT no
.env.local do front-web-base (workspaces paralelos usam faixas próprias). Confirme a porta que
o feca dev imprimiu antes de colar as URLs deste guia — os exemplos usam 5173 como
placeholder.
:::
- Chrome / Firefox / Edge com DevTools
- Acesso ao GTM container da brand (se for testar tag GTM custom)
- (Opcional) Meta Pixel Helper / TikTok Pixel Helper / Tag Assistant — extensões Chrome
Procedimento padrão (signup)
1. Limpa cookies do site
DevTools → Application → Cookies → seleciona o domínio → Clear All Cookies. Garante que tracking começa zerado.
2. Abre URL com UTMs completos
http://localhost:5173/?utm_source=facebook&utm_campaign=black-friday-test&utm_medium=cpc&utm_content=banner-v3&utm_oferta=first-deposit-100pct&ref=AFIL_TEST&gclid=test_gclid_12345
3. Verifica cookie_tracking
DevTools → Application → Cookies → cookie_tracking:
{
"utm_source": "facebook",
"utm_campaign": "black-friday-test",
"utm_medium": "cpc",
"utm_content": "banner-v3",
"utm_oferta": "first-deposit-100pct",
"affiliation_code": "AFIL_TEST",
"gclid": "test_gclid_12345",
"media_source": "google",
"media_clid": "test_gclid_12345",
"app_source": "web"
}
✅ Se todos os campos estão lá: captura OK. ❌ Se algum falta: investigar Debug ou Anti-patterns.
4. Testa sobrescrita last-touch
Clique em outro link com ?utm_campaign=cyber-monday:
http://localhost:5173/?utm_campaign=cyber-monday-test
Verifica cookie_tracking novamente:
{
"utm_source": "facebook", // ← preservado
"utm_campaign": "cyber-monday-test", // ← sobrescrito
"utm_medium": "cpc", // ← preservado
"utm_content": "banner-v3", // ← preservado
"affiliation_code": "AFIL_TEST", // ← preservado
"gclid": "test_gclid_12345" // ← preservado
}
✅ Last-touch funcionando.
5. Submete signup
Abre RegisterModal (header → "Cadastrar") → preenche formulário fictício → submete.
DevTools → Network → filtra por auth/register → seleciona request:
Form Data / Request body:
{
"email": "test@example.com",
"password": "...",
"country": "BRA",
"utm_source": "facebook",
"utm_campaign": "cyber-monday-test",
"utm_medium": "cpc",
"utm_content": "banner-v3",
"utm_oferta": "first-deposit-100pct",
"ga_client_id": "GA1.1.123456789.987654321",
"app_source": "web",
"affiliation_code": "AFIL_TEST",
"gclid": "test_gclid_12345",
"media_source": "google",
"media_clid": "test_gclid_12345"
}
✅ Se TODOS os campos esperados estão no body: atribuição completa de signup OK.
6. Verifica headers X-ORIGIN-*
Na mesma request → seção Request Headers:
X-ORIGIN-ACCESS: 4 (mobile) ou 2 (desktop)
X-LOG-INFO: 1-1731000000000-8f2c1a4b3d3e
(X-ORIGIN-REFERRER aparece se você veio de URL externa; vazio se digitou direto.)
7. Confirma eventos GTM disparados
DevTools → Console:
window.dataLayer.filter(e => ["sign_up", "page_view"].includes(e.event))
Deve retornar pelo menos:
- 1×
page_view - 1×
sign_up
Se você tem GTM Preview Mode ligado, valida que tags de conversion (Google Ads, Meta) dispararam.
Procedimento padrão (deposit)
Continua do passo 7. Agora valida o fluxo de FTD:
8. Submete depósito (modo PIX)
DepositModal → seleciona PIX → digita valor → submete.
DevTools → Network → filtra por payments/deposit:
Body deve ter:
{
"user_id": ...,
"credit_amount": 5000,
"payment_method": "pix",
"currency": "BRL",
"utm_source": "facebook",
"utm_campaign": "cyber-monday-test",
"utm_medium": "cpc",
"utm_content": "banner-v3",
"utm_oferta": "first-deposit-100pct",
"ga_client_id": "GA1.1.123456789.987654321",
"gclid": "test_gclid_12345",
"media_source": "google",
"media_clid": "test_gclid_12345"
}
⚠️ src, affiliation_code, subid, app_source NÃO devem estar no body de deposit (paridade legado). Se aparecerem, é bug.
9. Confirma evento GTM
window.dataLayer.filter(e => ["pix_generated", "deposit_initiated"].includes(e.event))
Deve retornar pix_generated (event name varia por método de pagamento — astropayDeposit para Astropay, etc).
10. Aguarda confirmação BFF
Backend confirma depósito após alguns segundos (mock em dev). Quando confirma:
window.dataLayer.filter(e => ["pix_confirmado_ftd", "first_deposit", "purchase"].includes(e.event))
Deve retornar 3 eventos (branch de FTD):
| Evento no dataLayer | De onde vem | Destinos |
|---|---|---|
pix_confirmado_ftd | deposit_confirmed (o adapter GTM resolve o nome) | só GTM + Pendo — não dispara Purchase na Meta |
first_deposit | evento próprio | GTM, Meta (Purchase), Kwai, Taboola, Floodlight (ftd), bff_capi |
purchase | evento próprio (compat legado) | GTM, Meta (Purchase), Kwai, Taboola, Floodlight (purchase) |
:::caution Atenção ao montar trigger de conversão
O Purchase da Meta vem de first_deposit e de purchase — não de pix_confirmado_ftd. Se
você criar um trigger de Purchase em pix_confirmado_ftd além dos existentes, a conversão
conta duas ou três vezes. Matriz completa em
Catálogo de eventos.
:::
Validações nos paineis externos
Meta Events Manager
business.facebook.com/events_manager2 → escolhe Pixel da brand → Test Events tab.
Cole ?test_event_code=TEST_XYZ na URL e abre o site → eventos devem aparecer em real-time com:
PageViewem cada navegação SPALeadno signup — nãoCompleteRegistration. O adapter disparatrackFBEvent("Lead", { content_name: "Cadastro", status: true, value: 1 }). Trigger montado emCompleteRegistrationnunca dispara.PixGenerated(evento custom, viatrackCustom) nodeposit_initiatedPurchaseno FTD (defirst_deposite depurchase)
Google Ads Conversion DebugView
Google Ads → Conversions → escolhe a Conversion Action → Diagnostics → "Recent conversions" mostra evento e payload (latência ~1 minuto).
Google Tag Assistant
Tag Assistant — tab "Tags Detected" mostra todos os pixels disparados na página com status (success/error).
Validação por brand
Antes de subir campanha em brand específica, repete o procedimento naquela brand:
feca dev --<brand-key> # ex: feca dev --7k-bet-br
As 13 brand-keys do base: 7k-bet-br, betpontobet-bet-br, casateste-com, cl-bet7k-com,
donald-bet-br, fi-7k-bet, ng-7k-bet, pb-bet, ph-state77-com, pt-state77-com, rj-bet,
state77-com, x2b-bet (ls repos/front-web-base/overrides/ pra lista viva).
Cada brand tem config de analytics diferente — testar na brand alvo evita surpresa em prod. Três diferenças que mudam o procedimento em si:
- 6 brands têm
disableGtm: trueem prod — não espere evento nodataLayerprimário. - 4 brands rodam no
anaLayer— inspecionewindow.anaLayerem vez dewindow.dataLayer. - 2 brands têm whitelist de eventos GTM (
betpontobet-bet-br,donald-bet-br) — eventos fora da lista não disparam, por design.
Além disso: em dev, as 8 brands com override de analytics desligam o GTM (isDev() ? true), o
containerId do anaLayer é null, e o gtmScriptUrl do Stape não resolve. Validação de tag GTM de
ponta a ponta precisa de staging, não de dev local. Ver Config map.
Checklist final antes de subir campanha
- UTMs completos (source, campaign, medium, content) em todos os links de campanha
-
cookie_trackingpopulando após landing - Sobrescrita last-touch funciona (segundo link sobrescreve só o que veio)
- Payload de signup tem todos os campos
- Payload de deposit tem todos os campos (sem
src/affiliation_code/subid/app_source) - Headers
X-ORIGIN-*eX-LOG-INFOaparecem - GTM dispara
sign_upepix_confirmado_ftd/first_deposit/purchase - Meta Pixel Helper confirma
Lead(signup) +Purchase(FTD) - Google Ads Test Events confirma conversion
- Brand-specific testado (não default), no container correto (
dataLayerouanaLayer)
Quando tudo passa: pode subir campanha 👍.
Anti-patterns
- Testar só em prod. Bug de tracking afeta atribuição imediatamente. Sempre staging primeiro.
- Aceitar "funciona em uma brand, deve funcionar em todas". Cada brand tem override. Testa na brand alvo.
- Esquecer de testar fluxo de re-deposit (rebill). FTD funciona ≠ rebill funciona. Disparar
second_depositrequerisFirstDeposit: false. - Validar só DevTools sem confirmar nos paineis externos. Meta pode receber evento mas rejeitar (domain unverified, signal limit, etc).