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.
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.
Conta → Webhooks → Adicionar → cole a URL. Para segurança, ative a assinatura e coloque o segredo no campo Kiwify Secret em ⚙️ Config.
Conta → Integrações → Webhooks → Nova URL. Selecione os eventos: Venda Concluída, Aguardando Pagamento, Reembolso.
Configurações → Webhooks → Adicionar Webhook. Cole a URL e marque os eventos de compra aprovada e estorno.
Configurações da conta → Integrações → Webhook / Postback. Cole a URL correspondente à plataforma.
Account Settings → My Site → Advanced Tools → Instant Notification URL (Clickbank) ou Account → Webhooks (Digistore). Cole a URL.
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
&secret=SUA_SENHA quando configurar o Webhook Secret
Nenhum evento ainda. Configure os webhooks nas plataformas.
📊 Resumo
Abra a aba Analytics para carregar os dados.
ℹ️ Histórico armazenado por dia (TTL 13 meses). Clique em qualquer linha para filtrar. Configure taxas/custos na aba ⚙️ Config → 🧾 Custos & Impostos.
🔗 UTMs & Scripts
Selecione a plataforma de anúncio e o checkout, copie o código e cole no campo de URL final do anúncio.
Cole no <head> de todas as suas LPs para capturar e preservar os UTMs entre redirecionamentos.
Redireciona o usuário quando ele pressionar "Voltar". Edite a variável link antes de usar.
🇧🇷 Propriedade Brasil (BRL)
🌎 Propriedade Internacional (USD) opcional
Pixel padrão
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.
Pixel padrão
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.
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.
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)
TikTok Ads
Google Ads usa credenciais acima
As credenciais OAuth já estão no card "Google Ads Enhanced Conversions". Para puxar gastos de múltiplas contas, adicione os Customer IDs aqui. Deixe vazio para usar o mesmo Customer ID das conversões.
Para MCC: adicione o ID do Manager Account primeiro e os sub-IDs em seguida. Configure também o campo "Login Customer ID" se necessário.
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
Aplicado sobre o Faturamento Líquido
Aplicado sobre os Gastos com anúncios
Outros custos
Prorateado pelo período selecionado
Secret geral
Adicione ?secret=SUA_SENHA no final de cada URL de webhook cadastrada nas plataformas.
Hotmart Hottok opcional
Kiwify Secret HMAC opcional
Os checkboxes ficam salvos no seu navegador.
powershell e tecle Enter. Depois navegue até a pasta:cd C:\Users\Anderson\pageswirlnpm installnpx wrangler@4 loginnpx wrangler@4 kv namespace create ROTATOR_KVnpx wrangler@4 kv namespace create ROTATOR_KV --previewnpx wrangler@4 kv namespace create CONFIG_KVnpx wrangler@4 kv namespace create CONFIG_KV --previewnpx wrangler@4 kv namespace create WEBHOOK_LOG_KVnpx wrangler@4 kv namespace create WEBHOOK_LOG_KV --previewC:\Users\Anderson\pageswirl\wrangler.toml e substitua os 6 placeholders pelos IDs que o terminal exibiu:a1b2c3d4e5f6789012345678901234abhttps://pageswirl.pages.devnpx wrangler@4 pages deploy public --project-name pageswirlADMIN_TOKEN → Valor: uma senha forte
123456789012345). Clique no número para copiar.
EAA e tem cerca de 200 caracteres. Selecione tudo e copie o token completo.
utm_host=C1_MOBILE. O Test Event Code (TEST12345) é opcional — aparece no Gerenciador de Eventos quando você clica em "Testar eventos" e serve para validar a integração sem esperar uma venda real.CXXXXXXXXXXXXXXXX (começa com "C", 16–18 caracteres). Clique no ícone de copiar ao lado do ID.
gclid (gerado automaticamente ao clicar em um anúncio com auto-tagging ativo).?gclid=XXX automático na URL
AW-XXXXXX/YYYYYY — o ID é o número após a barrahttps://developers.google.com/oauthplaygroundhttps://www.googleapis.com/auth/adwords → Authorize → Exchange code → copie o Refresh Tokenk9xZ2mP7vQ4nR1wL8jT3cA5sE6bH0yNlocalStorage por 30 dias. Cole no <head> de cada landing page.</body> — depois do script anterior.utm_lp injetado pelo rotator) chegam com a venda nos webhooks.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.https://pageswirl.pages.dev/webhook/PLATAFORMA?secret=SEU_SECRETA aba Webhooks já monta a URL certa com o seu secret preenchido.
</body> da LP — depois do script do Google Analytics (gtag.js).
<script>
(function () {
// ── Scroll depth + Tempo na página — Campaign HQ ──────────────
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>
depth_percent / seconds. Crie dimensões personalizadas no GA4 para segmentar.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>
<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 -->
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>
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.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>
🌀 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 re-deployar após qualquer mudança de código, rode:
npx wrangler@4 pages deploy public --project-name pageswirl
utm_conj, utm_ad, utm_lp e utm_host.
utm_conj, utm_ad etc. não aparecem.purchasepurchase