Campaign HQ

Rotator · Webhooks · UTM Tracking

🧪 MODO DEV ATIVO — GA4 e scripts de evento bloqueados neste browser  ·  desativar
🌀

Nenhum rotator selecionado
Selecione um rotator ao lado
ou clique em + Novo para criar.

📖 Como funciona o Webhook

Cada vez que alguém compra um produto seu na plataforma de afiliado, ela envia um aviso automático para a URL do webhook. Esse sistema recebe o aviso, lê os dados da compra (valor, e-mail, UTMs) e encaminha tudo automaticamente para o GA4 e para o Facebook CAPI. Você não precisa fazer nada além de cadastrar a URL uma vez.

① COPIE A URL
Abaixo tem uma URL específica para cada plataforma. Copie a URL da plataforma que você usa.
② COLE NA PLATAFORMA
Acesse as configurações da plataforma, encontre a seção "Webhooks" ou "Notificações" e cole a URL lá.
③ FAÇA UMA VENDA TESTE
Use o modo de teste da plataforma (se disponível) ou aguarde a primeira venda real. O evento aparecerá no log abaixo.
📍 ONDE CADASTRAR EM CADA PLATAFORMA
Hotmart
Ferramentas → Webhooks → Adicionar webhook → cole a URL → selecione todos os eventos de compra.
Dica: adicione o Hottok no campo "Webhook Secret" dentro de ⚙️ Config → Webhook.
Kiwify
Conta → Webhooks → Adicionar → cole a URL. Para segurança, ative a assinatura e coloque o segredo no campo Kiwify Secret em ⚙️ Config.
Eduzz
Conta → Integrações → Webhooks → Nova URL. Selecione os eventos: Venda Concluída, Aguardando Pagamento, Reembolso.
Monetizze
Configurações → Webhooks → Adicionar Webhook. Cole a URL e marque os eventos de compra aprovada e estorno.
PerfectPay / Braip / Ticto / Payt
Configurações da conta → Integrações → Webhook / Postback. Cole a URL correspondente à plataforma.
Clickbank / Digistore24
Account Settings → My Site → Advanced Tools → Instant Notification URL (Clickbank) ou Account → Webhooks (Digistore). Cole a URL.
🔒 Segurança (recomendado)
Em ⚙️ Config → Webhook, defina um Webhook Secret. Depois adicione ?secret=SUA_SENHA no final de cada URL que cadastrar nas plataformas. Assim somente requisições com a senha correta serão aceitas. Exemplo: https://seu-site.pages.dev/webhook/hotmart?secret=minhasenha123
URLs para cadastrar nas plataformas
Adicione &secret=SUA_SENHA quando configurar o Webhook Secret
Eventos recebidos

Nenhum evento ainda. Configure os webhooks nas plataformas.

📊 Resumo

📊 Análise detalhada
📊

Carregando dados de analytics…

📈 Métricas gerais
Faturamento Líquido
R$ 0,00
Gastos com anúncios
R$ 0,00
ROAS
N/A
Lucro
R$ 0,00
Vendas por Produto
Nenhuma venda por aqui
Vendas Pendentes
R$ 0,00
ROI
N/A
Custos de Produto
R$ 0,00
Vendas Reembolsadas
R$ 0,00
Margem
N/A
Despesas adicionais
R$ 0,00
Imposto sobre vendas
R$ 0,00
Reembolso
0.0%
Taxas
R$ 0,00
Imposto total
R$ 0,00
Chargeback
0.0%
Imposto Meta Ads
R$ 0,00
Vendas por Pagamento
Total
0
Vendas por Fonte
Nenhuma venda por aqui
Taxa de Aprovação
Cartão
N/A
Pix
N/A
Boleto
N/A
Outros
N/A
Geral

ℹ️ Histórico armazenado por dia (TTL 13 meses). Clique em qualquer linha para filtrar. Configure taxas/custos na aba ⚙️ Config → 🧾 Custos & Impostos.

🔗 UTMs & Scripts

Códigos UTM para Anúncios

Selecione a plataforma de anúncio e o checkout, copie o código e cole no campo de URL final do anúncio.

Scripts para Landing Page

Cole no <head> de todas as suas LPs para capturar e preservar os UTMs entre redirecionamentos.

Carregando...
Script de Back Redirect

Redireciona o usuário quando ele pressionar "Voltar". Edite a variável link antes de usar.

📊 Google Analytics 4

🇧🇷 Propriedade Brasil (BRL)

📊 MEASUREMENT ID (G-XXXXXXXX)
  1. Acesse analytics.google.com ↗
  2. Clique no ícone de engrenagem ⚙️ (inferior esquerdo) → Admin
  3. Na coluna PropriedadeFluxos de dados
  4. Clique no seu fluxo web → o ID G-XXXXXXXXXX aparece no canto superior direito
🔑 API SECRET (Measurement Protocol)
  1. Na mesma tela do fluxo web, role para baixo até Measurement Protocol API secrets
  2. Clique em "Criar", dê um nome (ex: "Campaign HQ") e confirme
  3. Copie o valor gerado — ele só é exibido uma vez. Começa com letras e tem ~20 caracteres
⚠️ O API Secret não é o mesmo que a API Key do Google Cloud. Use especificamente o "Measurement Protocol API secret".

🌎 Propriedade Internacional (USD) opcional

Use quando você vende em dólares (Clickbank, Digistore24, afiliados internacionais). Crie uma propriedade GA4 separada — misturar BRL e USD na mesma propriedade distorce todos os relatórios de receita. As mesmas vendas chegam nesta propriedade com valores em USD.

💡 Quando usar: produto vendido em USD via Clickbank ou Digistore24 · afiliado de produto gringo · operação internacional. Se só vende em BRL, deixe em branco.
📘 Facebook CAPI

Pixel padrão

🔢 PIXEL ID
  1. Acesse business.facebook.com/events_manager ↗
  2. No menu lateral, clique em Origens de dados e selecione seu Pixel. (Sem pixel? "+ Conectar origens de dados" → "Web" → "Facebook Pixel")
  3. Clique na aba Configurações
  4. O Pixel ID é o número de 15–16 dígitos logo abaixo do nome do pixel — clique para copiar
🔑 ACCESS TOKEN
  1. Na mesma aba Configurações do pixel, role a página para baixo
  2. Encontre a seção Conversions API
  3. Clique em "Gerar token de acesso manualmente"
  4. Copie o token completo — começa com EAA e tem ~200 caracteres
⚠️ Guarde o token — o Facebook não o exibe novamente.

Múltiplas BMs — PixelMap (roteado por utm_host)

Coloque o código no utm_host do anúncio (ex: C1_MOBILE). O Worker roteia para o Pixel correto automaticamente.

🎵 TikTok Events API

Pixel padrão

🔢 PIXEL ID
  1. Acesse ads.tiktok.com ↗ e faça login na conta de anunciante
  2. Menu superior → Assets (Ativos) → Events (Eventos) — ou Events Manager direto ↗
  3. Sem pixel? Clique em "Create Pixel" → "TikTok Pixel" → "Manually Install Pixel Code" → dê um nome → Create
  4. Clique no pixel desejado — o Pixel ID aparece no topo, formato CXXXXXXXXXXXXXXXX (começa com "C")
  5. Clique no ícone de copiar ao lado do ID
🔑 ACCESS TOKEN
  1. Na página do pixel, clique na aba Settings
  2. Role para baixo até a seção Events API
  3. Clique em "Generate Access Token"
  4. Copie o token completo da janela que abre — antes de fechar
⚠️ O token do TikTok pode expirar. Se as conversões pararem de chegar, volte em Settings → Events API e gere um novo.

Múltiplas contas — ttPixelMap (roteado por utm_host)

Mesmo padrão do Facebook: coloque o código no utm_host do anúncio (ex: C1_MOBILE). O Worker roteia para o Pixel TikTok correto automaticamente.

🔍 Google Ads Enhanced Conversions

Credenciais da API

Envio server-side de conversões direto para o Google Ads — mesmo princípio do Facebook CAPI. Funciona quando o visitante chegou pela busca paga (Google gera um gclid na URL).
⚠️ Requer gclid na URL do anúncio — configure o auto-tagging no Google Ads.

👤 CUSTOMER ID
  1. Acesse ads.google.com ↗ e faça login
  2. No canto superior direito aparece o número da conta no formato XXX-XXX-XXXX
  3. Cole esse número no campo Customer ID acima (com ou sem hífens)
🎯 CONVERSION ACTION ID
  1. No Google Ads, clique em MetasConversõesAções de conversão
  2. Crie uma ação do tipo "Compra" se ainda não tiver
  3. Clique na ação → em Detalhes de origem, veja a tag — o ID aparece como AW-XXXXXXXXXX/YYYYYYYYYYYY
  4. O número após a barra (YYYYYYYYYYYY) é o Conversion Action ID
  5. Alternativa: na URL ao editar a ação, o ID está no parâmetro conversionActionId=...
🔑 DEVELOPER TOKEN
  1. No Google Ads, clique em ⚙️ Ferramentas e configuraçõesAPI Center
  2. Se não houver Developer Token, clique em "Apply for access" e aguarde aprovação (normalmente imediata)
  3. Copie o token exibido — começa com letras/números, sem prefixo especial
  4. Nota: tokens novos ficam em modo TEST. Para conversões reais, solicite "Basic Access" no mesmo painel
🔐 OAUTH2 CLIENT ID + CLIENT SECRET
  1. Acesse console.cloud.google.com ↗ → crie ou selecione um projeto
  2. APIs e serviçosBiblioteca → pesquise "Google Ads API"Ativar
  3. APIs e serviçosCredenciaisCriar credenciaisID do cliente OAuth 2.0
  4. Tipo de aplicativo: Aplicativo da Web
  5. Em URIs de redirecionamento autorizados, adicione: https://developers.google.com/oauthplayground
  6. Clique em Criar — aparece o Client ID e o Client Secret. Copie os dois.
♻️ REFRESH TOKEN
  1. Acesse developers.google.com/oauthplayground ↗
  2. Clique no ícone de ⚙️ engrenagem no canto superior direito
  3. Marque "Use your own OAuth credentials"
  4. Cole o Client ID e o Client Secret que você obteve acima
  5. Feche o painel de configurações
  6. No campo Step 1 — Input your own scopes, cole: https://www.googleapis.com/auth/adwords
  7. Clique em Authorize APIs → faça login com a conta do Google Ads
  8. Clique em Exchange authorization code for tokens
  9. Copie o Refresh token — ele não expira (a menos que você o revogue)
✅ O Refresh Token é permanente. Você só precisa gerá-lo uma vez.
💰 Gastos de Anúncios — ROAS

Configure aqui para ver ROAS e ROI na aba Analytics → 💰 ROAS. Para uso próprio (suas contas), não requer aprovação de app — basta gerar os tokens.

Meta Ads (Facebook / Instagram)

⭐ RECOMENDADO — System User Token (não expira, use em produção)
  1. Acesse business.facebook.com ↗Configurações do negócio
  2. Menu esquerdo → Usuários → Usuários do sistema → Adicionar
  3. Nome: ex. "Campaign HQ", função: Admin → Criar usuário do sistema
  4. Clique no usuário criado → Gerar novo token → selecione seu app
  5. Marque: ads_read + ads_managementGerar token
  6. ⚠️ Copie o token agora — ele só aparece uma vez
System User Token nunca expira. É a mesma abordagem usada por ferramentas como Utmify internamente. Configure uma vez e esqueça.
⚠️ ALTERNATIVA — Token de usuário (expira em 60 dias — só para testes)
  1. Acesse developers.facebook.com ↗Meus Apps → Criar App → tipo Business
  2. Dashboard do app → Adicionar produto → Marketing API → Configurar
  3. Acesse Graph API Explorer ↗ → selecione seu app → adicione ads_read + ads_management → Gerar token
⚠️ Token de usuário expira em 60 dias sem aviso — o painel para de puxar gastos silenciosamente. Não use em produção.
📌 Ad Account ID: acesse Gerenciador de Anúncios ↗ — o ID está na URL no formato act_XXXXXXXXXX

TikTok Ads

  1. Acesse ads.tiktok.com/marketing_api/apps ↗
  2. Clique em Create App → preencha as informações → Create
  3. Na página do app: copie o App ID; depois clique em Authorization → Get Access Token
  4. Autorize com sua conta de anúncios — o token dá acesso às suas contas sem revisão
  5. O Advertiser ID: em ads.tiktok.com ↗, canto superior direito, número abaixo do nome da conta
⚠️ Token do TikTok Ads API expira. Renove periodicamente em Apps → Authorization.

Google Ads usa credenciais acima

As credenciais OAuth (token, client ID/secret) já estão no card acima. Adicione aqui cada Customer ID que quiser monitorar. Para MCC, preencha o "Login Customer ID" na linha correspondente.

📊 Google Sheets — Looker Studio Bridge

Sincroniza gastos de anúncios (Meta, TikTok, Google) para uma planilha Google. No Looker Studio, conecte a planilha e cruze com GA4 via utm_campaign. O sync roda manualmente aqui ou via cron (cron-job.org) diário.

Planilha de destino

💡 Crie a planilha, compartilhe com a conta Google que gerou o token, e copie o ID da URL. Cabeçalho (linha 1) sugerido: date | platform | account | campaign | spend | impressions | clicks | currency


Credenciais OAuth do Google Sheets

Precisa de um token com escopo https://www.googleapis.com/auth/spreadsheets. Use o mesmo Google Cloud project do Google Ads — apenas regenere o token com o escopo de Sheets adicionado. Client ID e Client Secret são opcionais se forem iguais ao Google Ads (reutiliza automaticamente).

  1. No Google Cloud Console ↗ → habilite a Google Sheets API
  2. Acesse o OAuth 2.0 Playground ↗
  3. Clique em ⚙️ (canto superior dir.) → Use your own OAuth credentials → insira seu Client ID e Secret
  4. Em "Step 1", cole: https://www.googleapis.com/auth/spreadsheetsAuthorize APIs
  5. Em "Step 2" → Exchange authorization code for tokens → copie o Refresh Token
✅ O token do Playground dura indefinidamente enquanto houver uso periódico.

Sincronização

Clique em Sync agora para gravar os gastos de ontem na planilha. Para automação diária: configure um job gratuito em cron-job.org ↗ para chamar POST https://<seu-domínio>/api/sync-spend com header Authorization: Bearer <seu-token> às 06:00 BRT.

🧾 Custos & Impostos

Estes valores são usados para calcular Lucro, ROI e Margem no Resumo. Deixe em 0 qualquer campo que não se aplique.

Taxas de plataforma de checkout (% descontada por cada venda)


Impostos sobre vendas

Selecione seu tipo de empresa para preencher automaticamente a alíquota estimada:

Aplicado sobre o Faturamento Líquido


Impostos sobre anúncios

Ao pagar anúncios do Meta/Google com cartão de crédito brasileiro, incidem dois encargos adicionais sobre o valor cobrado:

Encargo % Base Observação
IOF (câmbio) 6,38% Valor do anúncio Cartão crédito BR em moeda estrangeira
Contrib. digital 5,00% Valor do anúncio Plataformas digitais desde 2021
Total aprox. ~11,38% Sobre gasto bruto Use 11,38 no campo abaixo
Com cartão americano/estrangeiro: o IOF de 6,38% não incide. Apenas a contribuição digital de 5% pode ainda se aplicar dependendo da conta. Marque o checkbox acima para ajustar.
Carregando taxas…

Aplicado sobre Gastos com anúncios


Outros custos

Prorateado pelo período selecionado

🔒 Segurança dos Webhooks

Secret geral

O secret protege seu webhook contra envios não autorizados — qualquer requisição sem ele é rejeitada automaticamente.

📋 PASSO A PASSO
  1. Digite um secret forte no campo acima (ex: xK9pQ2mR7vL4nZ1w) e clique em 💾 Salvar Segurança
  2. Sua URL de webhook fica assim:
    https://pages.shortsmonetiza.online/webhook/hotmart?secret=SEU_SECRET
  3. Copie esta URL e cadastre no painel da plataforma (Hotmart, Kiwify etc.) no campo de Webhook/Postback
  4. Pronto — toda requisição sem o ?secret= correto é bloqueada com erro 401
🔗 URLs por plataforma
Hotmart: /webhook/hotmart?secret=SEU_SECRET
Kiwify: /webhook/kiwify?secret=SEU_SECRET
Eduzz: /webhook/eduzz?secret=SEU_SECRET
Monetizze: /webhook/monetizze?secret=SEU_SECRET
PerfectPay: /webhook/perfectpay?secret=SEU_SECRET
⚠️ O secret é salvo no KV (CONFIG_KV) — não precisa ser configurado como variável de ambiente no Cloudflare. Apenas salve aqui e já funciona.

Hotmart Hottok opcional


Kiwify Secret HMAC opcional

📣 Fontes de Tráfego

Configure quais fontes aparecem no menu lateral. Cada fonte filtra o Analytics pelo campo utm_source. As alterações ficam salvas localmente no navegador.

IDs com reconhecimento amplo: meta (fb, facebook, facebookads), google (gads, adwords), tiktok (tt, tiktokads)

💾 Backup & Restauração

Exporta todos os dados do painel (rotators, URLs, tokens, config) para um arquivo .json. Guarde no Google Drive, pendrive ou e-mail. Use "Importar" para restaurar tudo em caso de perda.

Exportar backup

Gera um arquivo com todos os rotators + URLs + configurações. Faça isso periodicamente ou sempre que fizer mudanças importantes.


Importar / Restaurar backup

⚠️ Atenção: a importação substitui tudo — rotators, URLs e config serão sobrescritos pelos dados do arquivo. Exporte um backup atual antes de importar.
Progresso de setup
0 / 20

Os checkboxes ficam salvos no seu navegador.

🚀
Guia de Setup — Campaign HQ na Cloudflare
Siga os blocos abaixo para colocar o sistema no ar e integrar tudo. O deploy é feito 100% pelo GitHub + Cloudflare — sem terminal, sem CLI.
🌐 BLOCO 1 — Deploy na Cloudflare (faça uma vez)
1
Criar conta GitHub e conta Cloudflare (gratuito)
Você precisa das duas contas. Ambas são gratuitas e levam menos de 2 minutos para criar.
github.com/join ↗ dash.cloudflare.com/sign-up ↗
Se você já tem as contas, pule direto para o passo 2.

2
Copiar o repositório para sua conta GitHub
Acesse o repositório original no GitHub e clique em "Use this template" → "Create a new repository". Dê um nome (ex: campaign-hq) e clique em Create repository. Isso cria uma cópia 100% sua — todas as atualizações que você fizer ficam no seu repositório.
💡 Cada novo projeto/cliente = um novo repositório (fork/template) conectado a um novo projeto Cloudflare Pages. Dados completamente isolados.

3
Conectar o repositório ao Cloudflare Pages
No dash.cloudflare.com ↗, siga os passos:
Clique em Workers & PagesCreate application → aba Pages
Clique em Connect to Git → autorize o acesso ao GitHub → selecione seu repositório
Em Build settings: Framework preset = None, Build command = em branco, Build output directory = public
Clique em Save and Deploy. Você receberá uma URL como campaign-hq.pages.dev
✔ A partir de agora, qualquer git push no seu repositório dispara um deploy automático — sem terminal.

4
Criar os 3 bancos de dados (KV namespaces) no dashboard
No Cloudflare, vá em Workers & Pages → KV. Para cada namespace abaixo, clique em Create a namespace, digite o nome exato e clique Add:
ROTATOR_KVSlugs, URLs e contagem de cliques dos rotators
CONFIG_KVGA4, Facebook CAPI, Webhook Secret e mapeamento de pixels
WEBHOOK_LOG_KVLog dos últimos 100 eventos recebidos das plataformas
📋 Após criar cada namespace, copie o ID exibido na coluna da lista — você vai usá-lo no passo 5.

5
Vincular os KVs ao projeto Pages
No Cloudflare, abra seu projeto Pages → aba Settings → Functions. Em KV namespace bindings, clique em Add binding para cada um dos 3 KVs:
Variable nameKV namespace (selecione o namespace criado)
ROTATOR_KV→ selecione o namespace ROTATOR_KV
CONFIG_KV→ selecione o namespace CONFIG_KV
WEBHOOK_LOG_KV→ selecione o namespace WEBHOOK_LOG_KV
💡 Alternativamente, edite o wrangler.toml no GitHub colocando os IDs copiados e faça push — a Cloudflare lê o arquivo automaticamente no próximo deploy.

6
Definir o ADMIN_TOKEN (senha do painel)
No Cloudflare, abra seu projeto Pages → Settings → Environment Variables:
Clique em Add variable
Nome: ADMIN_TOKEN  ·  Valor: uma senha forte qualquer
Marque Encrypt e clique Save and deploy
✔ Pronto! Acesse seu projeto e faça login com o ADMIN_TOKEN definido. Todo novo git push no GitHub atualiza o sistema automaticamente — sem terminal.
⚙️ BLOCO 2 — Configurações no painel (aba Config)
⚙️
Todas as integrações são configuradas direto pela aba Config — sem precisar editar código.
Cada seção da aba Config tem instruções detalhadas embutidas (clique em ? Como obter em qualquer campo). Configure as integrações que você usa:
GA4Measurement ID (G-XXXXXXXX) + API Secret — Google Analytics
Facebook CAPIPixel ID + Access Token (começa com EAA) — Conversions API server-side
TikTok EventsPixel ID (CXXXXXXXX) + Access Token — opcional, para quem anuncia no TikTok
Google AdsCustomer ID + Conversion ID + Developer Token + OAuth2 — opcional
Webhook SecretSenha para proteger o endpoint — use a mesma ao cadastrar o webhook nas plataformas

📄 BLOCO 3 — Scripts nas landing pages
13
Script 1 — Captura de UTMs (cole no <head> de todas as LPs)
Lê todos os parâmetros UTM + clique IDs da URL e salva no localStorage por 30 dias. Cole no <head> de cada landing page.
<script> (function(){ var KEY = 'chq_utm', DAYS = 30; var p = new URLSearchParams(window.location.search); var keys = ['utm_source','utm_medium','utm_campaign', 'utm_content','utm_term','utm_conj', 'utm_ad','utm_lp','utm_host', 'fbclid','ttclid','gclid']; var d = {}; keys.forEach(function(k){ var v = p.get(k); if(v) d[k] = v; }); if(Object.keys(d).length){ d._t = Date.now(); try{ localStorage.setItem(KEY, JSON.stringify(d)); }catch(e){} } // Expira UTMs antigos try{ var raw = localStorage.getItem(KEY); if(raw){ var e = JSON.parse(raw); if(e._t && Date.now()-e._t > DAYS*864e5) localStorage.removeItem(KEY); } }catch(e){} })(); </script>
💡 Salva por 30 dias no localStorage — os UTMs sobrevivem ao visitante fechar e reabrir o navegador.

14
Script 2 — Injeta UTMs nos botões de compra
Lê os UTMs salvos e adiciona automaticamente em todos os links de checkout. Cole antes do </body>depois do script anterior.
<script> (function(){ var KEY = 'chq_utm'; var keys = ['utm_source','utm_medium','utm_campaign', 'utm_content','utm_term','utm_conj', 'utm_ad','utm_lp','utm_host', 'fbclid','ttclid','gclid']; function getUtms(){ try{ return JSON.parse(localStorage.getItem(KEY)) || {}; }catch(e){ return {}; } } function appendUtms(a) { try { var d = getUtms(); if(!Object.keys(d).length) return; var url = new URL(a.href, window.location.href); keys.forEach(function(k){ if(d[k]) url.searchParams.set(k, d[k]); }); a.href = url.toString(); } catch(e){} } function injectAll(){ document.querySelectorAll('a[href]').forEach(appendUtms); } document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', injectAll) : injectAll(); // Cobre elementos carregados dinamicamente (page builders, SPAs) new MutationObserver(injectAll).observe(document.body||document.documentElement, {childList:true, subtree:true}); // Garante injeção no clique (última linha de defesa) document.addEventListener('click', function(e){ var a = e.target.closest('a[href]'); if(a) appendUtms(a); }, true); })(); </script>
✔ Com os dois scripts instalados, todos os UTMs (incluindo utm_lp injetado pelo rotator) chegam com a venda nos webhooks.
📌 Mapeamento Hotmart: o Hotmart repassa os UTMs via objeto tracking interno, então use utm_campaign para o nome do conjunto e utm_medium para o código da conta. O webhook mapeia automaticamente para utm_conj e utm_host. Para Kiwify e demais, use utm_conj/utm_ad/utm_host diretamente.
📡 BLOCO 4 — Registrar webhooks nas plataformas
15
Copiar as URLs e cadastrar em cada plataforma
Na aba Webhooks deste painel você encontra a URL pronta de cada plataforma. Basta copiar e colar no painel da plataforma. Onde cadastrar em cada uma:
HotmartFerramentas → Webhook → Adicionar → evento: Compra Aprovada
KiwifyConfigurações → Webhooks → Novo webhook → Order Approved
EduzzConfigurações → Notificações → Postback URL
MonetizzeFerramentas → Postback → Adicionar URL
PerfectPayConfigurações → Integrações → Webhook
BraipIntegrações → Webhook → Nova URL
TictoConfigurações → Webhooks
PaytConfigurações → Webhooks
ClickbankAccount Settings → Notifications → IPN URL
Digistore24Account → Integrations → IPN URL
O formato da URL é sempre: https://pageswirl.pages.dev/webhook/PLATAFORMA?secret=SEU_SECRET
A aba Webhooks já monta a URL certa com o seu secret preenchido.
🛠️ BLOCO 5 — Scripts extras para Landing Page
16
Script de Scroll Depth + Tempo na Página
Dispara eventos no GA4 quando o visitante scrolla 25%, 50%, 75% ou 90% da LP, e quando permanece 30s, 60s ou 120s na página. Cole antes do </body> da LP — depois do script do Google Analytics (gtag.js).
<script>
(function () {
  // ── Scroll depth + Tempo na página — Campaign HQ ──────────────
  // Modo Dev: não polui GA4 durante seus testes (ative no painel)
  if (localStorage.getItem('chq_dev') === '1') return;

  var SCROLL_THRESHOLDS = [25, 50, 75, 90]; // % da página
  var TIME_THRESHOLDS   = [30, 60, 120];    // segundos

  var fired = {};

  function fire(name, params) {
    if (typeof gtag !== 'undefined') gtag('event', name, params);
  }

  // Scroll tracking
  function onScroll() {
    var scrolled = window.scrollY || document.documentElement.scrollTop;
    var total    = document.body.scrollHeight - window.innerHeight;
    if (total <= 0) return;
    var pct = Math.round((scrolled / total) * 100);
    SCROLL_THRESHOLDS.forEach(function (t) {
      if (!fired['s' + t] && pct >= t) {
        fired['s' + t] = true;
        fire('scroll_depth', { depth_percent: t, page: location.pathname });
      }
    });
  }
  window.addEventListener('scroll', onScroll, { passive: true });

  // Tempo na página
  TIME_THRESHOLDS.forEach(function (t) {
    setTimeout(function () {
      if (!fired['t' + t]) {
        fired['t' + t] = true;
        fire('time_on_page', { seconds: t, page: location.pathname });
      }
    }, t * 1000);
  });
})();
</script>
Os eventos aparecem no GA4 em Eventos → scroll_depth e time_on_page com o parâmetro depth_percent / seconds. Crie dimensões personalizadas no GA4 para segmentar.

17
Script Backfix — Interceptar o botão Voltar
Quando o visitante tenta sair clicando em "Voltar" no navegador, ele é redirecionado para uma página de downsell (desconto, oferta menor) em vez de sair. Substitua URL_DO_DOWNSELL pelo link da sua oferta de recuperação. Cole antes do </body>.
<script>
(function () {
  // ── Backfix — redireciona botão Voltar para downsell ──────────
  var DOWNSELL_URL = 'URL_DO_DOWNSELL'; // ← substitua aqui

  // Empurra um estado extra para o histórico
  history.pushState({ backfix: true }, '', location.href);

  window.addEventListener('popstate', function (e) {
    // Empurra de volta para manter o visitante na página
    history.pushState({ backfix: true }, '', location.href);
    // Redireciona para o downsell
    setTimeout(function () {
      location.replace(DOWNSELL_URL);
    }, 50);
  });
})();
</script>
⚠️ Não use o Backfix em páginas de checkout — pode interferir com o processo de pagamento. Use apenas na landing page principal.
🎉 BLOCO 6 — Scripts para Página de Obrigado
18
Pixel base do TikTok (cole nas LPs e na página de obrigado)
Instale o código base do TikTok Pixel no <head> de todas as páginas — LP e obrigado. Substitua SEU_TIKTOK_PIXEL_ID pelo seu Pixel ID (encontrado em TikTok Events Manager).
<!-- TikTok Pixel Base Code -->
<script>
!function(w,d,t){
  w.TiktokAnalyticsObject=t;
  var ttq=w[t]=w[t]||[];
  ttq.methods=['page','track','identify','instances','debug',
    'on','off','once','ready','alias','group',
    'enableCookie','disableCookie'];
  ttq.setAndDefer=function(t,e){
    t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}
  };
  for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);
  ttq.instance=function(t){
    for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)
      ttq.setAndDefer(e,ttq.methods[n]);
    return e
  };
  ttq.load=function(e,n){
    var i='https://analytics.tiktok.com/i18n/pixel/events.js';
    ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,
    ttq._t=ttq._t||{},ttq._t[e]=+new Date,
    ttq._u=ttq._u||{},n&&(ttq._u[e]=n);
    var o=document.createElement('script');
    o.type='text/javascript',o.async=!0,o.src=i+'?sdkid='+e+'&lib='+t;
    var a=document.getElementsByTagName('script')[0];
    a.parentNode.insertBefore(o,a)
  };
  ttq.load('SEU_TIKTOK_PIXEL_ID'); // ← substitua aqui
  ttq.page();
}(window,document,'ttq');
</script>
<!-- End TikTok Pixel Base Code -->
O Pixel ID fica no TikTok Events Manager → selecione seu pixel → aba Overview ou Settings. O Access Token para a Events API está em Settings → Generate Access Token.

19
Script de Deduplicação Facebook — Página de Obrigado
Cole este script na página de obrigado (após a compra confirmada), depois do código base do Facebook Pixel. Ele lê o order_id da URL e dispara o evento Purchase com o mesmo eventID que o servidor já enviou via CAPI — evitando contagem dupla.
<script>
(function() {
  // ── Deduplicação Facebook — Página de Obrigado ────────────────
  // Lê o ID do pedido da URL (funciona com Hotmart, Kiwify, Eduzz, etc.)
  var u = new URL(window.location.href);
  var orderId = u.searchParams.get('transaction')
             || u.searchParams.get('order_id')
             || u.searchParams.get('invoice')
             || u.searchParams.get('cod')
             || u.searchParams.get('sale_code')
             || u.searchParams.get('transaction_id')
             || 'order-' + Date.now();

  var utmAd   = sessionStorage.getItem('utm_ad')   || '';
  var utmConj = sessionStorage.getItem('utm_conj') || '';

  if (typeof fbq !== 'undefined') {
    fbq('track', 'Purchase',
      { value: 0, currency: 'BRL', utm_ad: utmAd, utm_conj: utmConj },
      { eventID: orderId }  // mesmo eventID que o servidor enviou via CAPI
    );
  }
})();
</script>
✔ O eventID = orderId é o segredo da deduplicação: o Facebook ignora o evento duplicado quando Pixel e CAPI mandam o mesmo ID. O webhook já envia o CAPI com esse ID — este script fecha o ciclo no lado do browser.

20
Script de Deduplicação TikTok — Página de Obrigado
Cole este script na página de obrigado, depois do código base do TikTok Pixel (passo 16). O eventID igual garante que o TikTok não duplique a conversão entre Pixel e Events API.
<script>
(function() {
  // ── Deduplicação TikTok — Página de Obrigado ─────────────────
  var u = new URL(window.location.href);
  var orderId = u.searchParams.get('transaction')
             || u.searchParams.get('order_id')
             || u.searchParams.get('invoice')
             || u.searchParams.get('cod')
             || u.searchParams.get('sale_code')
             || u.searchParams.get('transaction_id')
             || 'order-' + Date.now();

  if (typeof ttq !== 'undefined') {
    ttq.track('PlaceAnOrder',
      { value: '0', currency: 'BRL', order_id: orderId },
      { eventID: orderId }  // mesmo eventID que o servidor enviou via TikTok Events API
    );
  }
})();
</script>
💡 Resumo dos scripts na página de obrigado: (1) Pixel base Facebook + base TikTok no <head> → (2) Script de dedup FB → (3) Script de dedup TikTok. O servidor envia CAPI + TikTok Events API via webhook; o browser fecha com os dois dedup scripts — sem contagem dupla.
Tudo pronto!
Com todos os blocos concluídos o sistema está 100% funcional:
🌀 Rotator distribui tráfego e injeta utm_lp automático  ·  📄 Scripts passam UTMs + fbclid + ttclid para o checkout  ·  📡 Webhooks recebem vendas e disparam GA4 + Facebook CAPI + TikTok Events API  ·  🎉 Scripts de dedup na página de obrigado eliminam contagem dupla.

Para atualizar o sistema após qualquer mudança: basta fazer git push no GitHub — o deploy na Cloudflare acontece automaticamente em ~30 segundos.

📊 BLOCO 7 — Looker Studio (Google Data Studio) — relatórios avançados
📊
O que é e para que serve
O Looker Studio é a ferramenta gratuita do Google para criar dashboards visuais em cima dos dados do GA4. Ele se conecta diretamente à sua propriedade GA4 e exibe os eventos que chegam via webhook — incluindo os parâmetros personalizados como utm_conj, utm_ad, utm_lp e utm_host.
O resultado: tabelas separadas — uma para conjuntos, uma para criativos, uma para LPs — com seletor de data, filtros e gráficos. Tudo 100% gratuito.
1
Registrar as dimensões personalizadas no GA4 (OBRIGATÓRIO antes de tudo)
O GA4 não exibe parâmetros personalizados automaticamente no Looker Studio. Você precisa registrá-los manualmente. Sem isso, as colunas utm_conj, utm_ad etc. não aparecem.
⚠️ Faça isso antes de criar o relatório no Looker Studio. O GA4 demora 24–48h para processar as dimensões novas. Dados anteriores ao registro não terão essas colunas preenchidas.
Como registrar:
① analytics.google.comAcesse sua conta GA4
② Admin (engrenagem)Canto inferior esquerdo
③ Definições personalizadasColuna "Propriedade" → "Definições personalizadas"
④ Criar dimensãoBotão azul "Criar dimensão personalizada"
Crie uma dimensão para cada linha abaixo:
Nome da dimensão (você escolhe)
Nome do parâmetro EXATO
Escopo
Conjunto de anúncio
utm_conj
Evento
Criativo / Anúncio
utm_ad
Evento
Landing Page
utm_lp
Evento
Conta de anúncio
utm_host
Evento
Plataforma de venda
platform
Evento
Produto
product_name
Evento
✅ Ao salvar cada dimensão, o GA4 confirma. Aguarde 24–48h antes de verificar no Looker Studio.
2
Acessar o Looker Studio e criar a fonte de dados
Use a mesma conta Google que tem acesso à sua propriedade GA4.
② CriarBotão "+ Criar" → "Relatório"
③ Fonte de dadosJanela "Adicionar dados" → clique em "Google Analytics"
④ SelecionarEscolha sua conta GA4 → sua propriedade → o fluxo web → clique "Adicionar"
⑤ ConfirmarClique "Adicionar ao relatório" — o relatório abre em branco
💡 Se pedir permissão para acessar o GA4, autorize. O Looker Studio nunca altera os dados — só lê.
3
Adicionar o controle de período (seletor de data)
Este controle permite filtrar o relatório inteiro por qualquer período — hoje, esta semana, este mês, mês passado, range personalizado. É o equivalente ao seletor de data do GA4.
① MenuBarra superior → "Inserir" → "Controle de intervalo de datas"
② PosicionarArraste para o topo do relatório
③ PadrãoNo painel direito, defina o período padrão: "Últimos 28 dias" ou "Este mês"
✅ Agora qualquer pessoa que abrir o relatório pode mudar o período clicando no seletor.
4
Adicionar os cards de resumo (scorecards)
São os números grandes no topo — igual ao painel interno. Mostre: total de vendas, receita total e ticket médio.
① Inserir"Inserir" → "Scorecard" (clique 3 vezes para criar 3 cards)
② Card 1Métrica: Transações · Filtro: nome do evento = purchase
③ Card 2Métrica: Receita do evento (ou "Revenue")
④ Card 3Métrica: Valor médio do pedido (Average purchase revenue)
💡 Para configurar o filtro "evento = purchase": com o scorecard selecionado, painel direito → aba "Dados" → role até "Filtros" → "+ Adicionar filtro" → Dimensão: "Nome do evento", Condição: Igual a, Valor: purchase
5
Criar a tabela "Por Conjunto de anúncio" (utm_conj)
Esta tabela mostra cada conjunto numa linha separada com receita, vendas e ticket médio. Nenhuma campanha fica misturada com outra.
① Inserir"Inserir" → "Tabela"
② DimensãoPainel direito → "Dimensão" → procure "Conjunto de anúncio" (o nome que você deu ao utm_conj)
③ MétricasAdicione: Receita do evento · Transações · Valor médio do pedido
④ OrdenarClassificar por: "Receita do evento" → decrescente
⑤ FiltrarFiltros → Nome do evento = purchase
⑥ LinhasMáximo de linhas: 50 (ou mais)
✅ Resultado: cada linha = um conjunto. Colunas: "CONJ-MAIO-1", "CONJ-FESTA-2"... com receita de cada um separado.
6
Repetir para as outras dimensões (uma tabela por dimensão)
Copie a tabela do Passo 5 e troque apenas a dimensão. Cada tabela fica numa seção separada do relatório — não se misturam.
Tabela
Dimensão a usar
O que cada linha representa
Por Criativo
Criativo / Anúncio
Cada vídeo/imagem que você anunciou
Por LP
Landing Page
Qual versão de página converteu mais
Por Conta
Conta de anúncio
Qual BM / conta de tráfego performou melhor
Por Fonte
Origem da sessão
Facebook vs TikTok vs Google
Por Plataforma
Plataforma de venda
Hotmart vs Kiwify vs Eduzz etc.
💡 Copiar tabela: clique na tabela existente → Ctrl+C → Ctrl+V → arraste para outra área → troque a dimensão no painel direito. Tudo mais (métricas, filtro, ordenação) é herdado.
7
Adicionar filtros interativos (dropdown por campanha)
Permite clicar num dropdown e filtrar o relatório inteiro por um valor específico — ex: ver só o conjunto "CONJ-MAIO-1" em todas as tabelas ao mesmo tempo.
① Inserir"Inserir" → "Controle" → "Caixa de lista suspensa"
② DimensãoSelecione: Conjunto de anúncio (utm_conj)
③ RepitaCrie mais dropdowns para utm_ad, utm_lp, utm_host
④ PosicioneColoque os 4 dropdowns em linha no topo, abaixo do seletor de data
✅ Resultado: você seleciona "CONJ-FESTA-1" no dropdown e todas as tabelas e cards filtram instantaneamente mostrando só aquele conjunto.
8
Adicionar gráfico de evolução temporal (vendas por dia)
Mostra a curva de vendas dia a dia dentro do período selecionado — igual ao gráfico principal do GA4.
① Inserir"Inserir" → "Gráfico de séries temporais"
② DimensãoData (já vem por padrão)
③ MétricaReceita do evento + Transações (dois eixos)
④ FiltroNome do evento = purchase
9
Salvar e compartilhar o relatório
O relatório fica na sua conta do Google. Você pode acessar de qualquer dispositivo ou compartilhar com um sócio/gestor de tráfego.
SalvarCtrl+S ou clique "Salvar" — fica em lookerstudio.google.com/u/0/reporting
CompartilharÍcone de compartilhamento (pessoa+) → "Qualquer pessoa com o link pode visualizar"
Editar acessoPara permitir que outros editem: mude "visualizador" para "editor" por e-mail
⚠️ "Qualquer pessoa com o link pode visualizar" significa que quem tiver o link vê os dados — não exige login. Use com cuidado se os dados forem sigilosos.
📐 Como o relatório vai ficar — layout sugerido
Organizando os elementos na ordem abaixo, você terá um relatório profissional com uma página:
Linha 1 — Controles: [Seletor de data]   [▼ Conjunto]   [▼ Criativo]   [▼ LP]   [▼ Conta]
Linha 2 — Scorecards: [💰 Receita total]   [🛒 Nº de vendas]   [📦 Ticket médio]   [↩️ Estornos]
Linha 3 — Gráfico: [📈 Receita por dia — gráfico de área]
Linha 4 — Tabelas lado a lado: [Tabela: Por Conjunto]    [Tabela: Por Criativo]
Linha 5 — Tabelas lado a lado: [Tabela: Por LP]    [Tabela: Por Conta]
Como funciona o filtro cruzado: quando você clica numa linha de qualquer tabela (ex: "CONJ-FESTA-1"), todas as outras tabelas e scorecards da página filtram automaticamente para mostrar só aquele conjunto — incluindo os criativos, LPs e contas que estavam rodando naquela campanha. Este comportamento é nativo do Looker Studio (não precisa configurar nada extra).
⚠️ Dados históricos: o Looker Studio só mostra dados a partir do momento em que você registrou as dimensões personalizadas no GA4. Eventos anteriores ao registro aparecem com os campos utm_conj, utm_ad, etc. em branco. Registre as dimensões antes de começar a trafegar.
Resumo do fluxo completo: Webhook recebe venda → envia para GA4 via Measurement Protocol → GA4 armazena com parâmetros personalizados → Looker Studio lê e exibe nas tabelas separadas. Completamente automático após a configuração inicial.