Pular para o conteúdo principal

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 → ApplicationCookies → 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

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:

  • page_view
  • 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 dataLayerDe onde vemDestinos
pix_confirmado_ftddeposit_confirmed (o adapter GTM resolve o nome)só GTM + Pendo — não dispara Purchase na Meta
first_depositevento próprioGTM, Meta (Purchase), Kwai, Taboola, Floodlight (ftd), bff_capi
purchaseevento 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:

  • PageView em cada navegação SPA
  • Lead no signup — não CompleteRegistration. O adapter dispara trackFBEvent("Lead", { content_name: "Cadastro", status: true, value: 1 }). Trigger montado em CompleteRegistration nunca dispara.
  • PixGenerated (evento custom, via trackCustom) no deposit_initiated
  • Purchase no FTD (de first_deposit e de purchase)

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: true em prod — não espere evento no dataLayer primário.
  • 4 brands rodam no anaLayer — inspecione window.anaLayer em vez de window.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_tracking populando 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-* e X-LOG-INFO aparecem
  • GTM dispara sign_up e pix_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 (dataLayer ou anaLayer)

Quando tudo passa: pode subir campanha 👍.

Anti-patterns

  1. Testar só em prod. Bug de tracking afeta atribuição imediatamente. Sempre staging primeiro.
  2. Aceitar "funciona em uma brand, deve funcionar em todas". Cada brand tem override. Testa na brand alvo.
  3. Esquecer de testar fluxo de re-deposit (rebill). FTD funciona ≠ rebill funciona. Disparar second_deposit requer isFirstDeposit: false.
  4. Validar só DevTools sem confirmar nos paineis externos. Meta pode receber evento mas rejeitar (domain unverified, signal limit, etc).