cdp-edge 1.12.0 → 1.14.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 +195 -279
- package/docs/whatsapp-ctwa.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +157 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +10 -4
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +142 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +56 -4
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +49 -0
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +738 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +14 -2
- package/package.json +1 -1
- package/server-edge-tracker/INSTALAR.md +195 -20
- package/server-edge-tracker/SEGMENTATION-DOCS.md +444 -0
- package/server-edge-tracker/schema-ab-ltv.sql +97 -0
- package/server-edge-tracker/schema-bidding.sql +86 -0
- package/server-edge-tracker/schema-fraud.sql +90 -0
- package/server-edge-tracker/schema-segmentation.sql +219 -0
- package/server-edge-tracker/schema.sql +1 -1
- package/server-edge-tracker/worker.js +1637 -51
- package/server-edge-tracker/wrangler.toml +20 -2
|
@@ -24,6 +24,10 @@ Toda a sua análise deve ser baseada na infraestrutura nativa da Cloudflare.
|
|
|
24
24
|
| Botão WhatsApp | `Contact` | 🔴 crítico |
|
|
25
25
|
| Botão "Comprar" → Hotmart/Kiwify/Ticto | `InitiateCheckout` (Trafego Direto) | 🔴 crítico |
|
|
26
26
|
| Página de obrigado | `Purchase_Success` | 🔴 crítico |
|
|
27
|
+
| **Preço Formatado (R$, $, €)** | `value_extraction` (Atrelado ao CTA) | 🔴 crítico |
|
|
28
|
+
| **Campo de Formulário Oculto (CSS hide/opacity 0)** | `honeypot_field` | 🔴 crítico |
|
|
29
|
+
| **Aparecimento de Botão Atrasado (Timer)** | `pitch_seen` | 🟡 essencial |
|
|
30
|
+
| **Classe de Erro CSS (.error, .invalid)** | `form_error_detected` | 🟡 essencial |
|
|
27
31
|
| **Micro-Evento: Rage Click** | `rage_click` | 🟡 essencial |
|
|
28
32
|
| **Micro-Evento: Heatmap** | `click_heatmap` (x,y) | 🟡 essencial |
|
|
29
33
|
| **Micro-Evento: Visibility** | `tab_visibility_change` | 🟡 essencial |
|
|
@@ -84,7 +88,9 @@ Retorne APENAS este JSON (sem texto antes ou depois):
|
|
|
84
88
|
"email": "email",
|
|
85
89
|
"nome": "nome-completo",
|
|
86
90
|
"telefone": "telefone",
|
|
87
|
-
"form": "#form-lead"
|
|
91
|
+
"form": "#form-lead",
|
|
92
|
+
"honeypot_detectado": "input[name='website_url_hp']",
|
|
93
|
+
"seletor_erros": ".input-error"
|
|
88
94
|
},
|
|
89
95
|
"evento_sugerido": "Lead",
|
|
90
96
|
"evento_ga4": "generate_lead",
|
|
@@ -99,6 +105,7 @@ Retorne APENAS este JSON (sem texto antes ou depois):
|
|
|
99
105
|
"integracao_externa": "hotmart",
|
|
100
106
|
"evento_sugerido": "InitiateCheckout",
|
|
101
107
|
"seletor_sugerido": "a[href*='hotmart']",
|
|
108
|
+
"valor_extraido": { "seletor": ".price-tag", "moeda": "BRL" },
|
|
102
109
|
"prioridade": "critico"
|
|
103
110
|
},
|
|
104
111
|
{
|
|
@@ -115,7 +122,8 @@ Retorne APENAS este JSON (sem texto antes ou depois):
|
|
|
115
122
|
"tipo": "youtube",
|
|
116
123
|
"id": "dQw4w9WgXcQ",
|
|
117
124
|
"posicao": "hero",
|
|
118
|
-
"evento_sugerido": "ViewContent"
|
|
125
|
+
"evento_sugerido": "ViewContent",
|
|
126
|
+
"pitch_timer_cta": "#btn-compra-atrasado"
|
|
119
127
|
}
|
|
120
128
|
],
|
|
121
129
|
"tem_secao_preco": true,
|
|
@@ -175,6 +183,10 @@ Retorne APENAS este JSON (sem texto antes ou depois):
|
|
|
175
183
|
- Se um arquivo é muito grande (>500 linhas), focar nos primeiros e últimos 100 e nas funções com `submit`, `click`, `form`
|
|
176
184
|
- Se não encontrar nenhum formulário nem CTA relevante em uma página, registrar `tipo_pagina: "generica"` e pular
|
|
177
185
|
- `precisa_server_side: true` quando encontrar integração com Hotmart, Kiwify, Eduzz, Ticto, Stripe, MercadoPago — pois o webhook de compra confirmada precisa do servidor para rastrear Purchase com fbp/fbc
|
|
186
|
+
- **Value Scraping:** Se existir botão de InitiateCheckout/Comprar, busque ativamente por seletor de preço próximo (`.price`, `h2 strong`) para incluir em `valor_extraido`. O Edge precisa do valor exato sem hardcode.
|
|
187
|
+
- **Form Error Tracking:** Mapeie classes CSS de erro (ex: `.error`, `.text-red-500`) em `seletor_erros` para nosso rastreador Edge capturar "taxas de frustração de conversão" orgânicas.
|
|
188
|
+
- **Fraude/Honeypot:** Se houver campos de input ocultos (`display: none`, `opacity: 0`) perto de formulários, marque como `honeypot_detectado`. Robôs preenchem isso; o Fraud Gate Edge usará esse seletor para bloqueio imediato.
|
|
189
|
+
- **Pitch Seen (VSLs):** Procure por botões (CTAs) que iniciam como ocultos (`display: none`) ou são ativados via `setTimeout` em páginas com VSL. Informe em `pitch_timer_cta` para criarmos o evento ultra-qualificado de View Pitch.
|
|
178
190
|
- **A/B test:** quando detectado, `gerar_tracking: true` instrui os agentes de tracking a incluir captura da variante ativa no momento do evento de conversão (Lead, Purchase). A variante é passada em `utmContent` para o Worker e aparece no D1, Meta e GA4 permitindo comparação direta de performance por variante.
|
|
179
191
|
- **Se não houver teste A/B detectado:** omitir o campo `ab_tests` do JSON (não retornar array vazio)
|
|
180
192
|
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Setup Completo — server-edge-tracker
|
|
2
|
-
##
|
|
2
|
+
## SEU_DOMINIO | Meta CAPI v22.0 + GA4 Measurement Protocol + D1 Database
|
|
3
3
|
|
|
4
4
|
> Execute cada bloco no terminal, um de cada vez.
|
|
5
5
|
> Tempo total estimado: 15–20 minutos.
|
|
@@ -118,21 +118,30 @@ wrangler secret put META_TEST_CODE
|
|
|
118
118
|
> Encontrar no Gerenciador de Eventos Meta → Testar Eventos → copie o código "TEST12345"
|
|
119
119
|
> **Lembrar de remover esse secret em produção** (veja PASSO 10)
|
|
120
120
|
|
|
121
|
-
### WhatsApp —
|
|
121
|
+
### WhatsApp — Webhook Verification (CTWA Tracking):
|
|
122
122
|
```bash
|
|
123
|
-
wrangler secret put
|
|
123
|
+
wrangler secret put WA_WEBHOOK_VERIFY_TOKEN
|
|
124
124
|
```
|
|
125
|
-
>
|
|
125
|
+
> Token de verificação do webhook WhatsApp (obrigatório para CTWA). Meta exige este token para registrar o webhook.
|
|
126
|
+
> Defina qualquer string segura, ex: `cdp-edge-webhook-2026-secret-xyz`.
|
|
127
|
+
|
|
128
|
+
### WhatsApp — Meta Cloud API v22.0 (mensagens automáticas - OPCIONAL):
|
|
129
|
+
> ⚠️ Estes secrets são **OPCIONAIS**. Se você precisa apenas de tracking de dados (ctwaclid), não configure-os.
|
|
126
130
|
|
|
127
131
|
```bash
|
|
128
|
-
wrangler secret put
|
|
132
|
+
wrangler secret put WHATSAPP_PHONE_NUMBER_ID
|
|
129
133
|
```
|
|
130
|
-
>
|
|
134
|
+
> Meta: "Phone Number ID" — ID do número WhatsApp Business. Necessário apenas para enviar mensagens automáticas.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
wrangler secret put WHATSAPP_ACCESS_TOKEN
|
|
138
|
+
```
|
|
139
|
+
> Meta: "Access Token" — Token de acesso do WhatsApp Business. Necessário apenas para enviar mensagens automáticas.
|
|
131
140
|
|
|
132
141
|
```bash
|
|
133
142
|
wrangler secret put WA_NOTIFY_NUMBER
|
|
134
143
|
```
|
|
135
|
-
> Número que vai receber as notificações de venda/lead.
|
|
144
|
+
> Número que vai receber as notificações de venda/lead. Necessário apenas para enviar mensagens automáticas.
|
|
136
145
|
|
|
137
146
|
### WhatsApp — CallMeBot (alertas internos do sistema):
|
|
138
147
|
```bash
|
|
@@ -197,8 +206,8 @@ Ainda com `META_TEST_CODE` configurado, rode este comando no terminal
|
|
|
197
206
|
```bash
|
|
198
207
|
curl -X POST https://server-edge-tracker.seu-usuario.workers.dev/track \
|
|
199
208
|
-H "Content-Type: application/json" \
|
|
200
|
-
-H "Origin: https://
|
|
201
|
-
-d "{\"eventName\":\"Lead\",\"email\":\"teste@email.com\",\"pageUrl\":\"https://
|
|
209
|
+
-H "Origin: https://SEU_DOMINIO" \
|
|
210
|
+
-d "{\"eventName\":\"Lead\",\"email\":\"teste@email.com\",\"pageUrl\":\"https://SEU_DOMINIO/teste\"}"
|
|
202
211
|
```
|
|
203
212
|
|
|
204
213
|
Resultado esperado:
|
|
@@ -210,7 +219,97 @@ Verificar no Meta: Gerenciador de Eventos → Testar Eventos → deve aparecer "
|
|
|
210
219
|
|
|
211
220
|
---
|
|
212
221
|
|
|
213
|
-
## PASSO 10 —
|
|
222
|
+
## PASSO 10 — Verificar Plano Workers ($5) e Dados Geográficos
|
|
223
|
+
|
|
224
|
+
### IMPORTANTE: Plano Workers Paid ($5/mês)
|
|
225
|
+
|
|
226
|
+
O CDP Edge foi desenvolvido para aproveitar todos os recursos do **Cloudflare Workers Paid ($5/mês)**, especialmente os dados geográficos avançados.
|
|
227
|
+
|
|
228
|
+
**O que você ganha com o plano $5:**
|
|
229
|
+
- **Cidade exata:** Ex: "São Paulo" (plano free: NULL)
|
|
230
|
+
- **Estado completo:** Ex: "São Paulo" (plano free: NULL)
|
|
231
|
+
- **Estado (sigla):** Ex: "SP" (plano free: NULL)
|
|
232
|
+
- **CEP:** Ex: "01310-100" (plano free: NULL)
|
|
233
|
+
- **Latitude/Longitude:** Ex: "-23.5505", "-46.6333" (plano free: NULL)
|
|
234
|
+
- **Timezone:** Ex: "America/Sao_Paulo" (plano free: NULL)
|
|
235
|
+
|
|
236
|
+
**Como verificar se está funcionando:**
|
|
237
|
+
|
|
238
|
+
1. **Enviar evento de teste:**
|
|
239
|
+
```bash
|
|
240
|
+
curl -X POST "https://SEU_DOMINIO/track" \
|
|
241
|
+
-H "Content-Type: application/json" \
|
|
242
|
+
-H "Origin: https://SEU_DOMINIO" \
|
|
243
|
+
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
|
|
244
|
+
-d '{"eventName":"TestGeo","pageUrl":"https://SEU_DOMINIO/teste","email":"teste@exemplo.com","firstName":"Teste","lastName":"Geo"}'
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
2. **Verificar no banco D1 se os dados geográficos foram capturados:**
|
|
248
|
+
```bash
|
|
249
|
+
wrangler d1 execute cdp-edge-db --remote --command="SELECT event_name, email, city, state, country FROM leads WHERE email = 'teste@exemplo.com' ORDER BY created_at DESC LIMIT 1"
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Resultado esperado (com plano $5):**
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"event_name": "TestGeo",
|
|
256
|
+
"email": "teste@exemplo.com",
|
|
257
|
+
"city": "São Bernardo do Campo", // ← Plano $5: nome da cidade
|
|
258
|
+
"state": "SP", // ← Plano $5: sigla do estado
|
|
259
|
+
"country": "BR" // ← Plano free: país
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Se `city` e `state` aparecem como `NULL`:**
|
|
264
|
+
- O plano $5 não está ativo
|
|
265
|
+
- Verifique no painel Cloudflare se Workers está contratado
|
|
266
|
+
- Contrate o plano em: https://dash.cloudflare.com/[ID_DA_CONTA]/workers/plans
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## PASSO 11.1 — Solução de Conflitos de Rotas
|
|
271
|
+
|
|
272
|
+
### ⚠️ Se aparecer erro no deploy:
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
ERROR: Can't deploy routes that are assigned to another worker.
|
|
276
|
+
"server-edge-tracker" is already assigned to routes:
|
|
277
|
+
- lancamentosabc.com.br/track*
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### SOLUÇÃO 1 — Via Painel Cloudflare (RECOMENDADO):
|
|
281
|
+
|
|
282
|
+
1. Acesse: https://dash.cloudflare.com/[ID_DA_CONTA]/workers/overview
|
|
283
|
+
2. Clique no worker que está usando as rotas do seu domínio
|
|
284
|
+
3. Vá em Settings → Triggers → Routes
|
|
285
|
+
4. Clique "Delete" nas rotas do domínio `lancamentosabc.com.br`
|
|
286
|
+
5. Repita o `wrangler deploy`
|
|
287
|
+
|
|
288
|
+
### SOLUÇÃO 2 — Via Wrangler CLI:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
# Listar workers para encontrar o deployment conflitante
|
|
292
|
+
wrangler deployments list
|
|
293
|
+
|
|
294
|
+
# Remover deployment conflitante (substituir pelo ID correto)
|
|
295
|
+
wrangler deployment delete --id <ID_DO_DEPLOYMENT_CONFLITANTE>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### SOLUÇÃO 3 — Usar Sufixo nas Rotas:
|
|
299
|
+
|
|
300
|
+
Se não quiser remover rotas existentes, use sufixo:
|
|
301
|
+
|
|
302
|
+
```toml
|
|
303
|
+
[[routes]]
|
|
304
|
+
pattern = "lancamentosabc.com.br/track-worker-novo*"
|
|
305
|
+
zone_name = "lancamentosabc.com.br"
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**URL do tracking:** `https://lancamentosabc.com.br/track-worker-novo`
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## PASSO 11.2 — Remover o Test Code antes de ir ao ar
|
|
214
313
|
|
|
215
314
|
```bash
|
|
216
315
|
wrangler secret delete META_TEST_CODE
|
|
@@ -219,18 +318,94 @@ wrangler deploy
|
|
|
219
318
|
|
|
220
319
|
---
|
|
221
320
|
|
|
222
|
-
## PASSO
|
|
321
|
+
## PASSO 12 — Configurar domínio personalizado (OBRIGATÓRIO para produção)
|
|
322
|
+
|
|
323
|
+
### ⚠️ ATENÇÃO: Domínio OBRIGATÓRIO
|
|
324
|
+
|
|
325
|
+
Para o tracking funcionar corretamente em produção, você **PRECISA** configurar um domínio personalizado. **NÃO** use o domínio `.workers.dev` em produção.
|
|
326
|
+
|
|
327
|
+
### INSTRUÇÕES EXATAS:
|
|
328
|
+
|
|
329
|
+
#### 1. Verificar se o domínio está na Cloudflare
|
|
330
|
+
```bash
|
|
331
|
+
# No painel Cloudflare: https://dash.cloudflare.com
|
|
332
|
+
# Verifique se o domínio está listado em "Websites"
|
|
333
|
+
# Se não estiver, adicione o domínio antes de continuar
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
#### 2. Configurar rotas no wrangler.toml
|
|
337
|
+
|
|
338
|
+
Edite o arquivo `wrangler.toml` e substitua:
|
|
339
|
+
```toml
|
|
340
|
+
# SUBSTITUIR estes valores:
|
|
341
|
+
pattern = "SEU_DOMINIO/track*" # ← Substituir pelo domínio real
|
|
342
|
+
zone_name = "SEU_DOMINIO" # ← Substituir pelo domínio real
|
|
343
|
+
|
|
344
|
+
# Exemplo real:
|
|
345
|
+
# pattern = "lancamentosabc.com.br/track*"
|
|
346
|
+
# zone_name = "lancamentosabc.com.br"
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
#### 3. Fazer o deploy com as rotas
|
|
350
|
+
```bash
|
|
351
|
+
wrangler deploy
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### 4. Resolver conflitos de rotas (se ocorrer erro)
|
|
355
|
+
|
|
356
|
+
Se aparecer erro: `Can't deploy routes that are assigned to another worker`:
|
|
223
357
|
|
|
224
|
-
|
|
358
|
+
**SOLUÇÃO A - Via painel Cloudflare:**
|
|
359
|
+
1. Acesse: https://dash.cloudflare.com/[ID_DA_CONTA]/workers/overview
|
|
360
|
+
2. Clique no worker que está usando as rotas do seu domínio
|
|
361
|
+
3. Vá em Settings → Triggers → Routes
|
|
362
|
+
4. Clique "Delete" nas rotas do domínio
|
|
363
|
+
5. Repita o `wrangler deploy`
|
|
225
364
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
365
|
+
**SOLUÇÃO B - Via API (rápido):**
|
|
366
|
+
```bash
|
|
367
|
+
# Listar workers para encontrar o ID
|
|
368
|
+
wrangler deployments list
|
|
369
|
+
|
|
370
|
+
# Remover rotas do worker conflitante (substituir pelo ID correto)
|
|
371
|
+
wrangler deployment delete --id <ID_DO_DEPLOYMENT>
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
#### 5. Verificar se funcionou
|
|
375
|
+
```bash
|
|
376
|
+
# Testar endpoint de health
|
|
377
|
+
curl "https://SEU_DOMINIO/track/health"
|
|
378
|
+
|
|
379
|
+
# Deve retornar:
|
|
380
|
+
# {"status": "ok", "bindings": {...}}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
#### 6. Testar endpoint de tracking
|
|
384
|
+
```bash
|
|
385
|
+
curl -X POST "https://SEU_DOMINIO/track" \
|
|
386
|
+
-H "Content-Type: application/json" \
|
|
387
|
+
-H "Origin: https://SEU_DOMINIO" \
|
|
388
|
+
-d '{"eventName":"Test","pageUrl":"https://SEU_DOMINIO/teste"}'
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**URL FINAL DO TRACKING:**
|
|
392
|
+
- ✅ `https://SEU_DOMINIO/track` (CORRETO - produção)
|
|
393
|
+
- ❌ `https://seu-worker.workers.dev/track` (ERRADO - teste apenas)
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
### DOMÍNIOS SUPOSTOS (.workers.dev) — Apenas para testes locais:
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
# Para testar localmente sem domínio real:
|
|
401
|
+
wrangler dev
|
|
402
|
+
|
|
403
|
+
# Acesso temporário: http://localhost:8787/track
|
|
404
|
+
```
|
|
230
405
|
|
|
231
406
|
---
|
|
232
407
|
|
|
233
|
-
## PASSO
|
|
408
|
+
## PASSO 13 — Configurar webhooks nas plataformas
|
|
234
409
|
|
|
235
410
|
### Ticto (plataforma principal):
|
|
236
411
|
|
|
@@ -243,8 +418,8 @@ Preencher:
|
|
|
243
418
|
- **Formato:** `JSON`
|
|
244
419
|
- **Evento:** marcar **Venda Realizada** (status `paid`)
|
|
245
420
|
|
|
246
|
-
> Se usar domínio personalizado (ex: `track.
|
|
247
|
-
> URL fica: `https://track.
|
|
421
|
+
> Se usar domínio personalizado (ex: `track.SEU_DOMINIO`):
|
|
422
|
+
> URL fica: `https://track.SEU_DOMINIO/webhook/ticto`
|
|
248
423
|
|
|
249
424
|
**Testar:** na tela de webhook da Ticto há um botão **"Enviar teste"**. Ao clicar, a Ticto envia um POST simulado. Confirme que o evento aparece no Gerenciador de Eventos do Meta como `Purchase` e que o dado foi registrado no banco D1 (ver comando no final deste guia).
|
|
250
425
|
|
|
@@ -296,7 +471,7 @@ Preencher:
|
|
|
296
471
|
"userId": "usr_abc123",
|
|
297
472
|
"gaClientId": "GA1.1.123456789.1234567890",
|
|
298
473
|
"eventId": "CDP_1234567890_abc123",
|
|
299
|
-
"pageUrl": "https://
|
|
474
|
+
"pageUrl": "https://SEU_DOMINIO/obrigado",
|
|
300
475
|
"value": 297,
|
|
301
476
|
"currency": "BRL",
|
|
302
477
|
"utmSource": "facebook",
|