cdp-edge 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +367 -0
- package/bin/cdp-edge.js +61 -0
- package/contracts/api-versions.json +368 -0
- package/dist/commands/analyze.js +52 -0
- package/dist/commands/infra.js +54 -0
- package/dist/commands/install.js +168 -0
- package/dist/commands/server.js +174 -0
- package/dist/commands/setup.js +123 -0
- package/dist/commands/validate.js +84 -0
- package/dist/index.js +12 -0
- package/docs/CI-CD-SETUP.md +217 -0
- package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
- package/docs/events-reference.md +359 -0
- package/docs/installation.md +155 -0
- package/docs/quick-start.md +185 -0
- package/docs/sdk-reference.md +371 -0
- package/docs/whatsapp-ctwa.md +209 -0
- package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +594 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +412 -0
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
- package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +264 -0
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2077 -0
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1419 -0
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +667 -0
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +224 -0
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +61 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +52 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +109 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +365 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +643 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +62 -0
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +900 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +1922 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +109 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +703 -0
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +110 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +255 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1157 -0
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1432 -0
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +310 -0
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +250 -0
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +313 -0
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1752 -0
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +383 -0
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +111 -0
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +364 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +267 -0
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +69 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +699 -0
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +422 -0
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -0
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +368 -0
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +2894 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
- package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +68 -0
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
- package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
- package/package.json +75 -0
- package/server-edge-tracker/INSTALAR.md +328 -0
- package/server-edge-tracker/migrate-new-db.sql +137 -0
- package/server-edge-tracker/migrate-v2.sql +16 -0
- package/server-edge-tracker/migrate-v3.sql +6 -0
- package/server-edge-tracker/migrate-v4.sql +18 -0
- package/server-edge-tracker/migrate-v5.sql +17 -0
- package/server-edge-tracker/migrate-v6.sql +24 -0
- package/server-edge-tracker/migrate.sql +111 -0
- package/server-edge-tracker/schema.sql +265 -0
- package/server-edge-tracker/worker.js +2574 -0
- package/server-edge-tracker/wrangler.toml +85 -0
- package/templates/afiliado-sem-landing.md +312 -0
- package/templates/captura-de-lead.md +78 -0
- package/templates/captura-lead-evento-externo.md +99 -0
- package/templates/checkout-proprio.md +111 -0
- package/templates/install/.claude/commands/cdp.md +1 -0
- package/templates/install/CLAUDE.md +65 -0
- package/templates/linkedin/tag-template.js +46 -0
- package/templates/multi-step-checkout.md +673 -0
- package/templates/pagina-obrigado.md +55 -0
- package/templates/pinterest/conversions-api-template.js +144 -0
- package/templates/pinterest/event-mappings.json +48 -0
- package/templates/pinterest/tag-template.js +28 -0
- package/templates/quiz-funnel.md +68 -0
- package/templates/reddit/conversions-api-template.js +205 -0
- package/templates/reddit/event-mappings.json +56 -0
- package/templates/reddit/pixel-template.js +46 -0
- package/templates/scenarios/behavior-engine.js +402 -0
- package/templates/scenarios/real-estate-logic.md +50 -0
- package/templates/scenarios/sales-page-logic.md +50 -0
- package/templates/spotify/pixel-template.js +46 -0
- package/templates/trafego-direto.md +582 -0
- package/templates/vsl-page.md +292 -0
- package/templates/webinar-registration.md +63 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
name = "server-edge-tracker"
|
|
2
|
+
main = "worker.js"
|
|
3
|
+
compatibility_date = "2025-01-01"
|
|
4
|
+
compatibility_flags = ["nodejs_compat"]
|
|
5
|
+
|
|
6
|
+
# ── Variáveis públicas (não são segredos) ─────────────────────────────────────
|
|
7
|
+
[vars]
|
|
8
|
+
META_PIXEL_ID = "1583939052660159"
|
|
9
|
+
GA4_MEASUREMENT_ID = "G-XXXXXXXXXX"
|
|
10
|
+
TIKTOK_PIXEL_ID = "CXXXXXXXXXXXXXXX"
|
|
11
|
+
SITE_DOMAIN = "server-edge-tracker.suporte-ed9.workers.dev"
|
|
12
|
+
|
|
13
|
+
# ── Banco D1 ──────────────────────────────────────────────────────────────────
|
|
14
|
+
# Após criar o banco com "wrangler d1 create cdp-edge-db",
|
|
15
|
+
# substitua o database_id pelo ID retornado no terminal.
|
|
16
|
+
[[d1_databases]]
|
|
17
|
+
binding = "DB"
|
|
18
|
+
database_name = "cdp-edge-db"
|
|
19
|
+
database_id = "7867d38f-5fa8-4c17-b465-386211422c09"
|
|
20
|
+
|
|
21
|
+
# ── Queues — Retry + Dead Letter Queue ───────────────────────────────────────
|
|
22
|
+
# Produtor: worker envia eventos com falha para cdp-edge-retry
|
|
23
|
+
# Consumidor: worker processa a fila e reaplica; falhas vão para cdp-edge-dlq
|
|
24
|
+
# Criar com: wrangler queues create cdp-edge-retry
|
|
25
|
+
# wrangler queues create cdp-edge-dlq
|
|
26
|
+
[[queues.producers]]
|
|
27
|
+
binding = "RETRY_QUEUE"
|
|
28
|
+
queue = "cdp-edge-retry"
|
|
29
|
+
|
|
30
|
+
[[queues.consumers]]
|
|
31
|
+
queue = "cdp-edge-retry"
|
|
32
|
+
max_batch_size = 10
|
|
33
|
+
max_batch_timeout = 30
|
|
34
|
+
max_retries = 3
|
|
35
|
+
dead_letter_queue = "cdp-edge-dlq"
|
|
36
|
+
|
|
37
|
+
# ── KV Namespace — Geo/Session Cache ─────────────────────────────────────────
|
|
38
|
+
# Cache de geolocalização e sessões recentes (TTL: 1h por padrão)
|
|
39
|
+
# Criar com: wrangler kv namespace create GEO_CACHE
|
|
40
|
+
# wrangler kv namespace create GEO_CACHE --preview
|
|
41
|
+
[[kv_namespaces]]
|
|
42
|
+
binding = "GEO_CACHE"
|
|
43
|
+
id = "821b6c1ccb4b475985439b801c1fdbe0"
|
|
44
|
+
preview_id = "d2d9198f47e340ee905a8dc566b09e95"
|
|
45
|
+
|
|
46
|
+
# ── R2 Bucket — Audit Logs ────────────────────────────────────────────────────
|
|
47
|
+
# ⚠️ PENDENTE: Habilitar R2 no Cloudflare Dashboard antes de descomentar
|
|
48
|
+
# Dashboard → R2 → Enable → depois: wrangler r2 bucket create cdp-edge-logs
|
|
49
|
+
# [[r2_buckets]]
|
|
50
|
+
# binding = "AUDIT_LOGS"
|
|
51
|
+
# bucket_name = "cdp-edge-logs"
|
|
52
|
+
|
|
53
|
+
# ── Cron Triggers — Intelligence Agent ───────────────────────────────────────
|
|
54
|
+
# Semanal: domingo 02:00 UTC — check de versões de API + relatório diário
|
|
55
|
+
# Mensal: 1º do mês 03:00 UTC — auditoria de taxa de erro + alertas críticos
|
|
56
|
+
[triggers]
|
|
57
|
+
crons = ["0 2 * * 7", "0 3 1 * *"]
|
|
58
|
+
|
|
59
|
+
# ── Cloudflare Workers AI ─────────────────────────────────────────────────────
|
|
60
|
+
# Habilita env.AI para LTV Prediction (Fase 4)
|
|
61
|
+
# Plano gratuito inclui 10.000 neurônios/dia — suficiente para enrichment
|
|
62
|
+
[ai]
|
|
63
|
+
binding = "AI"
|
|
64
|
+
|
|
65
|
+
# ── Secrets (NÃO ficam aqui — configurar via CLI) ─────────────────────────────
|
|
66
|
+
# wrangler secret put META_ACCESS_TOKEN ← token Meta CAPI (obrigatório)
|
|
67
|
+
# wrangler secret put GA4_API_SECRET ← secret GA4 Measurement Protocol (obrigatório)
|
|
68
|
+
# wrangler secret put TIKTOK_ACCESS_TOKEN ← token TikTok Events API (opcional)
|
|
69
|
+
# wrangler secret put META_TEST_CODE ← só para testes (remover em produção)
|
|
70
|
+
# wrangler secret put META_AD_ACCOUNT_ID ← ID da conta de anúncios Meta (act_XXXXXXXXX) — Customer Match
|
|
71
|
+
# wrangler secret put META_AUDIENCE_ID ← ID da Custom Audience Meta — Customer Match automático
|
|
72
|
+
# wrangler secret put WHATSAPP_TOKEN ← Token WhatsApp Cloud API (Meta Business Suite)
|
|
73
|
+
# wrangler secret put WHATSAPP_PHONE_NUMBER_ID ← ID do número WhatsApp (Meta Business Suite → Phone Numbers)
|
|
74
|
+
# wrangler secret put RESEND_API_KEY ← API Key do Resend (resend.com)
|
|
75
|
+
# wrangler secret put RESEND_FROM_EMAIL ← Remetente verificado ex: "CDP Edge <noreply@seudominio.com.br>"
|
|
76
|
+
# wrangler secret put WA_WEBHOOK_VERIFY_TOKEN ← Token de verificação do webhook WhatsApp (você define — qualquer string segura)
|
|
77
|
+
# wrangler secret put PINTEREST_ACCESS_TOKEN ← Bearer token Pinterest Conversions API
|
|
78
|
+
# wrangler secret put PINTEREST_AD_ACCOUNT_ID ← ID da conta de anúncios Pinterest (ex: 549755813XXX)
|
|
79
|
+
# wrangler secret put REDDIT_ACCESS_TOKEN ← Bearer token Reddit Conversions API
|
|
80
|
+
# wrangler secret put REDDIT_AD_ACCOUNT_ID ← ID da conta de anúncios Reddit (ex: t2_XXXXXXX)
|
|
81
|
+
# wrangler secret put LINKEDIN_ACCESS_TOKEN ← OAuth2 Bearer token LinkedIn Marketing API
|
|
82
|
+
# wrangler secret put LINKEDIN_CONVERSION_ID ← ID da conversão LinkedIn (ex: 12345678)
|
|
83
|
+
# wrangler secret put LINKEDIN_AD_ACCOUNT_ID ← ID da conta de anúncios LinkedIn
|
|
84
|
+
# wrangler secret put SPOTIFY_ACCESS_TOKEN ← Bearer token Spotify Advertising API
|
|
85
|
+
# wrangler secret put SPOTIFY_AD_ACCOUNT_ID ← ID da conta de anúncios Spotify Ads
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# Template: Afiliado Sem Landing Page Própria
|
|
2
|
+
> Você é afiliado de um produto e envia tráfego direto para o checkout da plataforma
|
|
3
|
+
> (Hotmart, Kiwify, Eduzz, Monetizze, CartPanda, Ticto).
|
|
4
|
+
> Não tem domínio próprio — o link de afiliado é a URL de destino dos seus anúncios.
|
|
5
|
+
> Infraestrutura: Cloudflare Workers + D1 (100% Native)
|
|
6
|
+
|
|
7
|
+
**Quando usar este modelo:**
|
|
8
|
+
- Afiliado que divulga link de produto de terceiros
|
|
9
|
+
- Sem landing page: o anúncio aponta direto para `pay.hotmart.com/XXXXX`
|
|
10
|
+
- Quer rastrear vendas no Meta/TikTok/Google sem pixel na página do produtor
|
|
11
|
+
|
|
12
|
+
**O problema central:**
|
|
13
|
+
O pixel do Meta está no seu gerenciador, mas o checkout é do produtor — você não tem acesso à página. O produtor te dá um webhook de compra, mas esse webhook não tem fbp/fbc/UTMs porque o pixel nunca rodou na página de checkout.
|
|
14
|
+
|
|
15
|
+
**A solução:**
|
|
16
|
+
Criar uma página de ponte (bridge page) mínima no seu domínio. O usuário passa por ela, o CDP Edge captura todos os dados e injeta o `cdp_uid` no link de checkout. Quando o webhook de compra chegar, o D1 faz o lookup e envia o evento com atribuição completa.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Arquitetura
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Anúncio Meta/TikTok/Google
|
|
24
|
+
│
|
|
25
|
+
▼
|
|
26
|
+
┌───────────────────────────────┐
|
|
27
|
+
│ Bridge Page (seu domínio) │ ← leva 2s, redireciona auto
|
|
28
|
+
│ bridge.seudominio.com │
|
|
29
|
+
│ │
|
|
30
|
+
│ 1. Gera cdp_uid │
|
|
31
|
+
│ 2. Captura fbclid/ttclid │
|
|
32
|
+
│ 3. Salva fbp/fbc/UTMs no D1 │
|
|
33
|
+
│ 4. Injeta cdp_uid no link │
|
|
34
|
+
│ 5. Redireciona para checkout │
|
|
35
|
+
└───────────────────────────────┘
|
|
36
|
+
│
|
|
37
|
+
▼
|
|
38
|
+
┌──────────────────────────────────┐
|
|
39
|
+
│ Checkout da Plataforma │
|
|
40
|
+
│ pay.hotmart.com/XXXXX?xcod=uid │
|
|
41
|
+
│ │
|
|
42
|
+
│ Usuário compra │
|
|
43
|
+
│ Plataforma envia webhook → │
|
|
44
|
+
│ Worker → D1 lookup(uid) │
|
|
45
|
+
│ Meta Purchase CAPI ✅ │
|
|
46
|
+
└──────────────────────────────────┘
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Passo 1 — Bridge Page (index.html)
|
|
52
|
+
|
|
53
|
+
Crie uma página mínima no seu domínio. Pode ser hospedada no Cloudflare Pages (grátis).
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<!DOCTYPE html>
|
|
57
|
+
<html lang="pt-BR">
|
|
58
|
+
<head>
|
|
59
|
+
<meta charset="UTF-8">
|
|
60
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
61
|
+
<title>Redirecionando...</title>
|
|
62
|
+
<!-- Pixel Meta browser (para ViewContent + fbp/fbc) -->
|
|
63
|
+
<script>
|
|
64
|
+
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
|
65
|
+
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
|
|
66
|
+
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
|
|
67
|
+
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
|
|
68
|
+
document,'script','https://connect.facebook.net/en_US/fbevents.js');
|
|
69
|
+
fbq('init', 'SEU_PIXEL_ID');
|
|
70
|
+
fbq('track', 'PageView');
|
|
71
|
+
</script>
|
|
72
|
+
</head>
|
|
73
|
+
<body>
|
|
74
|
+
<p style="font-family:sans-serif;text-align:center;margin-top:40px">
|
|
75
|
+
Aguarde, você está sendo redirecionado...
|
|
76
|
+
</p>
|
|
77
|
+
|
|
78
|
+
<script type="module">
|
|
79
|
+
import { init, track, getUserIdWithFallback, getUTMsWithFallback } from '/js/cdpTrack.js';
|
|
80
|
+
|
|
81
|
+
await init();
|
|
82
|
+
|
|
83
|
+
const uid = getUserIdWithFallback();
|
|
84
|
+
const utms = getUTMsWithFallback();
|
|
85
|
+
|
|
86
|
+
// Disparar ViewContent (sinal de interesse antes do checkout)
|
|
87
|
+
await track('ViewContent', {
|
|
88
|
+
content_name: 'Bridge Page - Afiliado',
|
|
89
|
+
content_type: 'product',
|
|
90
|
+
uid,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Construir URL de checkout com cdp_uid injetado
|
|
94
|
+
// passCheckoutParams() já faz isso para os links na página,
|
|
95
|
+
// mas para redirect direto usamos a função abaixo:
|
|
96
|
+
const checkoutUrl = buildCheckoutUrl('https://pay.hotmart.com/SEU_LINK_DE_AFILIADO', uid, utms);
|
|
97
|
+
|
|
98
|
+
// Redireciona após 800ms (tempo suficiente para o evento ser enviado)
|
|
99
|
+
setTimeout(() => { window.location.href = checkoutUrl; }, 800);
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Constrói a URL de checkout com parâmetros de atribuição
|
|
103
|
+
*/
|
|
104
|
+
function buildCheckoutUrl(baseUrl, uid, utms) {
|
|
105
|
+
const url = new URL(baseUrl);
|
|
106
|
+
|
|
107
|
+
// Hotmart: xcod = user_id, sck = UTMs pipe-separados
|
|
108
|
+
if (baseUrl.includes('hotmart.com')) {
|
|
109
|
+
if (uid) url.searchParams.set('xcod', uid);
|
|
110
|
+
const sck = [utms.utm_source, utms.utm_medium, utms.utm_campaign, utms.utm_content, utms.utm_term]
|
|
111
|
+
.map(v => v || 'direto').join('|');
|
|
112
|
+
if (utms.utm_source) url.searchParams.set('sck', sck);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Kiwify: src = utm_source
|
|
116
|
+
else if (baseUrl.includes('kiwify.com.br')) {
|
|
117
|
+
if (utms.utm_source) url.searchParams.set('src', utms.utm_source);
|
|
118
|
+
if (utms.utm_medium) url.searchParams.set('utm_medium', utms.utm_medium);
|
|
119
|
+
if (utms.utm_campaign) url.searchParams.set('utm_campaign', utms.utm_campaign);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Eduzz / Monetizze: src = utm_source
|
|
123
|
+
else if (baseUrl.includes('eduzz.com') || baseUrl.includes('monetizze.com.br')) {
|
|
124
|
+
if (utms.utm_source) url.searchParams.set('src', utms.utm_source);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// CartPanda: utm_* direto
|
|
128
|
+
else if (baseUrl.includes('cartpanda.com')) {
|
|
129
|
+
Object.entries(utms).forEach(([k, v]) => { if (v) url.searchParams.set(k, v); });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Ticto: utm_* + user_id
|
|
133
|
+
else if (baseUrl.includes('ticto.app')) {
|
|
134
|
+
Object.entries(utms).forEach(([k, v]) => { if (v) url.searchParams.set(k, v); });
|
|
135
|
+
if (uid) url.searchParams.set('user_id', uid);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Genérico: repassa tudo
|
|
139
|
+
else {
|
|
140
|
+
Object.entries(utms).forEach(([k, v]) => { if (v) url.searchParams.set(k, v); });
|
|
141
|
+
if (uid) url.searchParams.set('cdp_uid', uid);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return url.toString();
|
|
145
|
+
}
|
|
146
|
+
</script>
|
|
147
|
+
</body>
|
|
148
|
+
</html>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Passo 2 — Worker Route (Same-Domain)
|
|
154
|
+
|
|
155
|
+
O Worker precisa estar no mesmo domínio da bridge page para capturar fbp/fbc como first-party cookies.
|
|
156
|
+
|
|
157
|
+
```toml
|
|
158
|
+
# wrangler.toml — adicionar route da bridge page
|
|
159
|
+
[[routes]]
|
|
160
|
+
pattern = "bridge.seudominio.com/*"
|
|
161
|
+
zone_name = "seudominio.com"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
wrangler deploy
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Passo 3 — Configurar Webhook na Plataforma
|
|
171
|
+
|
|
172
|
+
### Hotmart
|
|
173
|
+
```
|
|
174
|
+
Hotmart → Ferramentas → Webhooks → Adicionar Webhook
|
|
175
|
+
URL: https://bridge.seudominio.com/webhook/hotmart
|
|
176
|
+
Eventos: Compra Aprovada, Compra Cancelada, Reembolso
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Kiwify
|
|
180
|
+
```
|
|
181
|
+
Kiwify → Configurações → Webhooks
|
|
182
|
+
URL: https://bridge.seudominio.com/webhook/kiwify
|
|
183
|
+
Status: Ativo
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Ticto
|
|
187
|
+
```
|
|
188
|
+
Ticto → Configurações → Webhook
|
|
189
|
+
URL: https://bridge.seudominio.com/webhook/ticto
|
|
190
|
+
Eventos: purchase_approved
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
O Worker (`worker.js`) já tem handlers para `/webhook/hotmart`, `/webhook/kiwify` e `/webhook/ticto`. Eles:
|
|
194
|
+
1. Extraem `xcod`/`sck`/`user_id` do payload
|
|
195
|
+
2. Fazem D1 lookup pelo `cdp_uid`
|
|
196
|
+
3. Recuperam `fbp`, `fbc`, `ttp`, UTMs
|
|
197
|
+
4. Enviam `Purchase` para Meta CAPI + GA4 + TikTok
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Passo 4 — Fallback de Fingerprint (Automático)
|
|
202
|
+
|
|
203
|
+
O SDK já salva automaticamente uid + UTMs no `localStorage` (`_cdp_aff`).
|
|
204
|
+
|
|
205
|
+
**Cenário coberto:** usuário vê o anúncio, clica, a página de bridge abre em nova aba — o cookie pode não ser lido em alguns navegadores nesse contexto.
|
|
206
|
+
|
|
207
|
+
```javascript
|
|
208
|
+
// Automaticamente chamado em init():
|
|
209
|
+
_saveAffiliateContext(); // salva uid + UTMs no localStorage
|
|
210
|
+
|
|
211
|
+
// Ao montar a bridge page:
|
|
212
|
+
const uid = getUserIdWithFallback(); // cookie → localStorage → ''
|
|
213
|
+
const utms = getUTMsWithFallback(); // URL params → localStorage → {}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
O `getUserIdWithFallback()` tenta em ordem:
|
|
217
|
+
1. Cookie `_cdp_uid` (primeira opção)
|
|
218
|
+
2. localStorage `_cdp_aff.uid` (fallback — 30 dias de validade)
|
|
219
|
+
3. String vazia (sem identificação)
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Passo 5 — Anúncio Meta: URL de Destino
|
|
224
|
+
|
|
225
|
+
Configure o anúncio apontando para a bridge page, não para o checkout direto:
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
URL de Destino do Anúncio:
|
|
229
|
+
https://bridge.seudominio.com/?utm_source=meta&utm_medium=paid&utm_campaign=NOME_CAMP&utm_content=NOME_AD
|
|
230
|
+
|
|
231
|
+
❌ NÃO usar:
|
|
232
|
+
https://pay.hotmart.com/XXXXX (perde fbp/fbc/UTMs)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
O Meta injeta o `fbclid` automaticamente na URL. O SDK captura e salva no D1.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Passo 6 — Verificar Atribuição
|
|
240
|
+
|
|
241
|
+
Após uma venda de teste:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# Ver se o cdp_uid chegou no webhook e fez lookup
|
|
245
|
+
wrangler d1 execute cdp-edge-db --command="
|
|
246
|
+
SELECT
|
|
247
|
+
w.raw_payload,
|
|
248
|
+
l.fbp,
|
|
249
|
+
l.fbc,
|
|
250
|
+
l.utm_source,
|
|
251
|
+
l.utm_campaign
|
|
252
|
+
FROM webhook_events w
|
|
253
|
+
LEFT JOIN leads l ON l.user_id = json_extract(w.raw_payload, '$.xcod')
|
|
254
|
+
ORDER BY w.created_at DESC
|
|
255
|
+
LIMIT 1;
|
|
256
|
+
"
|
|
257
|
+
|
|
258
|
+
# Confirmar evento no Meta Events Manager
|
|
259
|
+
# Gerenciador de Eventos → filtrar por Purchase → verificar match_keys
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Checklist de Verificação
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
[ ] Bridge page no seu domínio (Cloudflare Pages recomendado — grátis)
|
|
268
|
+
[ ] Worker Route configurado: bridge.seudominio.com/*
|
|
269
|
+
[ ] SDK instalado na bridge page com getUserIdWithFallback()
|
|
270
|
+
[ ] URL de destino do anúncio aponta para bridge page (não checkout direto)
|
|
271
|
+
[ ] UTMs na URL do anúncio (utm_source, utm_medium, utm_campaign)
|
|
272
|
+
[ ] Webhook configurado na plataforma para o Worker
|
|
273
|
+
[ ] Teste: compra de desenvolvimento → D1 lookup → Purchase no Meta Events Manager
|
|
274
|
+
[ ] Verificar fbp no D1 (confirma que fbclid foi capturado)
|
|
275
|
+
[ ] Verificar utm_source no D1 (confirma que UTMs chegaram)
|
|
276
|
+
[ ] Meta Events Manager: compra com match_keys email/phone (se plataforma enviar no webhook)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Fluxo Completo
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
1. Anúncio Meta clicado
|
|
285
|
+
└─ URL: bridge.seudominio.com/?fbclid=XXX&utm_source=meta&utm_campaign=CAMP
|
|
286
|
+
|
|
287
|
+
2. Bridge Page carrega (800ms)
|
|
288
|
+
└─ cdp_uid gerado (cookie 365 dias + localStorage backup)
|
|
289
|
+
└─ fbclid capturado → _fbc calculado
|
|
290
|
+
└─ UTMs salvos no localStorage (_cdp_aff)
|
|
291
|
+
└─ PageView → Worker → D1 salva {fbp, fbc, utm_source, utm_campaign, ip, ua}
|
|
292
|
+
└─ ViewContent → Worker → Meta ViewContent CAPI
|
|
293
|
+
|
|
294
|
+
3. Redirect para checkout
|
|
295
|
+
└─ URL: pay.hotmart.com/XXX?xcod=cdp_uid&sck=meta|paid|CAMP||
|
|
296
|
+
|
|
297
|
+
4. Usuário compra
|
|
298
|
+
└─ Hotmart webhook → Worker /webhook/hotmart
|
|
299
|
+
└─ Extrai xcod = cdp_uid
|
|
300
|
+
└─ D1 lookup(cdp_uid) → fbp, fbc, utm_source, utm_campaign, ip
|
|
301
|
+
└─ Meta Purchase CAPI: fbp + fbc + utm_source → atribuição completa ✅
|
|
302
|
+
└─ GA4 Purchase + TikTok CompletePayment
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Notas de Privacidade / LGPD
|
|
308
|
+
|
|
309
|
+
- A bridge page não coleta email ou telefone
|
|
310
|
+
- Apenas identifica a sessão com um ID anônimo (`cdp_uid`)
|
|
311
|
+
- Os dados de compra (email, telefone) chegam pelo webhook da plataforma e são hasheados antes de enviar ao CAPI
|
|
312
|
+
- O redirecionamento automático é transparente — nenhum dado sensível é exposto na URL
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Modelo: Captura de Lead (Cloudflare Native)
|
|
2
|
+
|
|
3
|
+
Este modelo é destinado a páginas de captura de leads (Opt-in), onde o objetivo principal é coletar o e-mail e/ou telefone do usuário antes de redirecioná-lo para a próxima etapa do funil.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA TÉCNICA (Quantum Tier)
|
|
8
|
+
|
|
9
|
+
O rastreamento é realizado de forma síncrona com o envio do formulário:
|
|
10
|
+
1. **Página**: Captura os dados do formulário e envia via `cdpTrack.track()`.
|
|
11
|
+
2. **Servidor (Worker)**: Recebe os dados, realiza o hashing SHA-256 e envia para as APIs.
|
|
12
|
+
3. **Database (D1)**: Armazena o lead e vincula aos IDs de rastreamento (`fbp`, `fbc`).
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 📘 EVENTOS PRINCIPAIS
|
|
17
|
+
|
|
18
|
+
| Evento | Gatilho | PII (Dados Pessoais) |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| **PageView** | Carregamento da página | IP, User-Agent, URL |
|
|
21
|
+
| **Lead** | Clique no botão de enviar | E-mail, Telefone, Nome (crus) |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 🛠️ PASSO 1: CONFIGURAÇÃO DO SITE
|
|
26
|
+
|
|
27
|
+
### 1.1 SDK de Rastreamento (Header)
|
|
28
|
+
```html
|
|
29
|
+
<script src="/js/cdpTrack.js" async></script>
|
|
30
|
+
<script>
|
|
31
|
+
window.cdpConfig = {
|
|
32
|
+
metaId: 'SEU_PIXEL_ID',
|
|
33
|
+
ttId: 'SEU_TIKTOK_ID'
|
|
34
|
+
};
|
|
35
|
+
</script>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 1.2 Captura do Formulário
|
|
39
|
+
Este script deve ser inserido antes da tag `</body>`. Ele garante que o evento seja enviado antes do redirecionamento.
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
<script>
|
|
43
|
+
document.querySelector('#meu-formulario').addEventListener('submit', async (e) => {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
|
|
46
|
+
const leadData = {
|
|
47
|
+
email: e.target.email.value,
|
|
48
|
+
phone: e.target.phone.value,
|
|
49
|
+
first_name: e.target.name.value,
|
|
50
|
+
event_id: cdpTrack.generateId() // ID único para deduplicação
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Envia para o Worker (Cloudflare)
|
|
54
|
+
await cdpTrack.track('Lead', leadData);
|
|
55
|
+
|
|
56
|
+
// Prossegue com o envio real do formulário
|
|
57
|
+
e.target.submit();
|
|
58
|
+
});
|
|
59
|
+
</script>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## ⚡ PASSO 2: SERVIDOR (CLOUDFLARE WORKER)
|
|
65
|
+
|
|
66
|
+
O PlayerBuilder Quantum Tier processa o evento via Cloudflare Worker:
|
|
67
|
+
1. **Deduplicação**: Utiliza o `event_id` do browser para 100% de precisão na Meta CAPI.
|
|
68
|
+
2. **Advanced Matching**: Aplica SHA256 em `email`, `phone`, `first_name` e `last_name` (WebCrypto native).
|
|
69
|
+
3. **D1 Store**: Salva o lead e o Identity Graph na tabela `leads`.
|
|
70
|
+
4. **API Dispatch**: Envia assincronamente para Meta CAPI (v22.0) e TikTok Events API (v1.3).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## ✅ VALIDAÇÃO TÉCNICA
|
|
75
|
+
|
|
76
|
+
- **Deduplicação**: Verifique se o `event_id` gerado no site é o mesmo recebido no Gerenciador de Eventos.
|
|
77
|
+
- **Match Quality**: O envio de e-mail e telefone hasheados pelo servidor garante a máxima pontuação de qualidade.
|
|
78
|
+
- **Persistência**: O lead deve aparecer no banco D1 imediatamente após o envio.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Modelo: Captura com Evento Externo (Cloudflare Native)
|
|
2
|
+
|
|
3
|
+
Este modelo combina a captura de leads no site com o recebimento de eventos externos (Webhooks) de plataformas de vendas (Ticto, Hotmart, Kiwify, Eduzz, etc.). Os dados são cruzados no banco **D1** para garantir uma atribuição de alta qualidade.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA TÉCNICA (Quantum Tier)
|
|
8
|
+
|
|
9
|
+
O fluxo de dados segue o enriquecimento de identidade:
|
|
10
|
+
1. **Site**: Captura o lead e gera o `event_id` inicial, disparando para o Worker.
|
|
11
|
+
2. **Servidor (Worker)**: Salva o lead no D1 vinculando e-mail aos cookies (`fbp`, `fbc`, `ttp`).
|
|
12
|
+
3. **Webhook**: O Worker recebe a venda, busca o lead no D1 e dispara a CAPI com todos os dados recuperados.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🛠️ PASSO 1: CONFIGURAÇÃO DO SITE
|
|
17
|
+
|
|
18
|
+
### 1.1 SDK de Rastreamento
|
|
19
|
+
```html
|
|
20
|
+
<script src="/js/cdpTrack.js" async></script>
|
|
21
|
+
<script>
|
|
22
|
+
window.cdpConfig = {
|
|
23
|
+
metaId: 'SEU_PIXEL_ID',
|
|
24
|
+
ttId: 'SEU_TIKTOK_ID'
|
|
25
|
+
};
|
|
26
|
+
</script>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 1.2 Captura de Lead
|
|
30
|
+
```javascript
|
|
31
|
+
document.querySelector('#form-lead').addEventListener('submit', async (e) => {
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
|
|
34
|
+
const leadData = {
|
|
35
|
+
email: e.target.email.value,
|
|
36
|
+
phone: e.target.phone.value,
|
|
37
|
+
first_name: e.target.name.value,
|
|
38
|
+
event_id: cdpTrack.generateId()
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
await cdpTrack.track('Lead', leadData);
|
|
42
|
+
|
|
43
|
+
e.target.submit();
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 🖥️ PASSO 2: RECEBIMENTO DE WEBHOOK
|
|
50
|
+
|
|
51
|
+
O Worker recebe o Webhook da plataforma de vendas, busca o lead no D1 e dispara as APIs.
|
|
52
|
+
|
|
53
|
+
### 2.1 Exemplo de Lógica no Worker
|
|
54
|
+
```javascript
|
|
55
|
+
export default {
|
|
56
|
+
async fetch(request, env, ctx) {
|
|
57
|
+
if (request.method === 'POST') {
|
|
58
|
+
const payload = await request.json();
|
|
59
|
+
const email = payload.email || payload.customer?.email;
|
|
60
|
+
|
|
61
|
+
// Busca o lead no banco D1
|
|
62
|
+
const lead = await env.DB.prepare(
|
|
63
|
+
"SELECT * FROM leads WHERE email = ?"
|
|
64
|
+
).bind(email).first();
|
|
65
|
+
|
|
66
|
+
if (lead) {
|
|
67
|
+
const capiData = {
|
|
68
|
+
event_name: 'Purchase',
|
|
69
|
+
event_id: payload.transaction_id,
|
|
70
|
+
user_data: {
|
|
71
|
+
em: lead.email,
|
|
72
|
+
ph: lead.phone,
|
|
73
|
+
fbp: lead.fbp,
|
|
74
|
+
fbc: lead.fbc,
|
|
75
|
+
client_ip_address: lead.ip,
|
|
76
|
+
client_user_agent: lead.ua
|
|
77
|
+
},
|
|
78
|
+
custom_data: {
|
|
79
|
+
value: payload.price,
|
|
80
|
+
currency: 'BRL'
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
ctx.waitUntil(dispatchCAPI(capiData, env));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return new Response('OK', { status: 200 });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## ✅ VALIDAÇÃO TÉCNICA
|
|
96
|
+
|
|
97
|
+
- **Enriquecimento**: Verifique se a CAPI está enviando os campos `fbp` e `fbc` mesmo em eventos que vêm de Webhook.
|
|
98
|
+
- **Match Quality**: O cruzamento via e-mail no D1 deve garantir uma pontuação máxima de qualidade no Gerenciador de Eventos.
|
|
99
|
+
- **Deduplicação**: O `event_id` da venda deve ser o ID de transação da plataforma.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Modelo: Checkout Próprio (Cloudflare Native)
|
|
2
|
+
|
|
3
|
+
Este modelo é destinado a checkouts integrados diretamente no seu site (WooCommerce, Shopify, ou checkouts customizados). O rastreamento cobre desde a entrada no checkout até a confirmação de compra na infraestrutura Cloudflare.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA TÉCNICA (Quantum Tier)
|
|
8
|
+
|
|
9
|
+
Fluxo de conversão:
|
|
10
|
+
1. **Site**: Captura de passos (`InitiateCheckout`, `AddPaymentInfo`) via Fetch direto.
|
|
11
|
+
2. **Servidor (Worker)**: Processamento e despacho para as APIs.
|
|
12
|
+
3. **D1 Database**: Repositório de pedidos e perfis de compradores.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 📘 IDENTIFICADORES
|
|
17
|
+
|
|
18
|
+
| Evento | Gatilho | Dados Enviados |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `InitiateCheckout` | Entrada na página de checkout | `email`, `phone` (se preenchidos) |
|
|
21
|
+
| `AddPaymentInfo` | Seleção da forma de pagamento | `email`, `payment_type` |
|
|
22
|
+
| `Purchase` | Clique no botão de finalizar | `email`, `value`, `order_id` |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 🛠️ PASSO 1: CONFIGURAÇÃO DO SITE
|
|
27
|
+
|
|
28
|
+
### 1.1 Script de Tracking de Checkout
|
|
29
|
+
Este script captura dados à medida que o usuário preenche o formulário.
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
<script>
|
|
33
|
+
(function() {
|
|
34
|
+
const WORKER_URL = 'https://api.seusite.com/api/tracking';
|
|
35
|
+
|
|
36
|
+
// Atualização de identidade ao sair do campo (Blur Event)
|
|
37
|
+
const inputs = document.querySelectorAll('input[type="email"], input[type="tel"]');
|
|
38
|
+
inputs.forEach(input => {
|
|
39
|
+
input.addEventListener('blur', function() {
|
|
40
|
+
window.cdpTrack('IdentityUpdate', {
|
|
41
|
+
email: document.querySelector('[name="email"]')?.value || '',
|
|
42
|
+
phone: document.querySelector('[name="phone"]')?.value || ''
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Evento: Entrada no Checkout
|
|
48
|
+
window.cdpTrack('InitiateCheckout', {
|
|
49
|
+
num_items: 1,
|
|
50
|
+
content_name: 'Produto Premium'
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Evento: Finalizar Compra
|
|
54
|
+
const purchaseBtn = document.querySelector('#btn-finalizar');
|
|
55
|
+
purchaseBtn?.addEventListener('click', function() {
|
|
56
|
+
window.cdpTrack('Purchase', {
|
|
57
|
+
value: 197.00,
|
|
58
|
+
currency: 'BRL',
|
|
59
|
+
order_id: 'ord_' + Date.now()
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
})();
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## ⚡ PASSO 2: SERVIDOR (CLOUDFLARE WORKER)
|
|
69
|
+
|
|
70
|
+
O Worker gerencia o estado da transação e a persistência.
|
|
71
|
+
|
|
72
|
+
### 2.1 Persistência de Pedido
|
|
73
|
+
Ao receber o evento `Purchase`, o Worker salva na tabela `leads` com o status correspondente.
|
|
74
|
+
|
|
75
|
+
### 2.2 Despacho para APIs
|
|
76
|
+
- O Worker envia `Purchase` para as APIs (Meta CAPI v22.0, TikTok v1.3).
|
|
77
|
+
- O `InitiateCheckout` prévio no D1 permite automação de recuperação de carrinho.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 📊 PASSO 3: BANCO DE DADOS D1
|
|
82
|
+
|
|
83
|
+
```sql
|
|
84
|
+
INSERT INTO leads (
|
|
85
|
+
event_name, event_id, email, value, currency, utm_source, page_url
|
|
86
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## ✅ VALIDAÇÃO TÉCNICA
|
|
92
|
+
|
|
93
|
+
- **Captura Intermediária**: Verifique se o e-mail é enviado ao Worker antes do clique final (evento Blur).
|
|
94
|
+
- **Deduplicação**: O `order_id` deve ser utilizado como `event_id`.
|
|
95
|
+
- **Integridade D1**: O valor da compra e moeda devem ser gravados corretamente no banco.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 🔄 EXEMPLOS DE INTEGRAÇÃO
|
|
100
|
+
|
|
101
|
+
### Stripe
|
|
102
|
+
```javascript
|
|
103
|
+
stripe.confirmPayment({ ... }).then(result => {
|
|
104
|
+
if (!result.error) {
|
|
105
|
+
cdpTrack.track('Purchase', { value: 197.0, order_id: result.paymentIntent.id });
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Mercado Pago / PagSeguro
|
|
111
|
+
Chamar o disparo de `Purchase` no callback de `status === 'approved'`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Leia o arquivo `cdp-edge/extracted-skill/tracking-events-generator/agents/master-orchestrator.md` e ative o Master Orchestrator exibindo a mensagem de boas-vindas completa.
|