cdp-edge 1.13.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 +172 -172
- 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/devops-agent.md +9 -1
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +6 -0
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +142 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +11 -1
- 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 +189 -14
- 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/worker.js +1461 -18
- package/server-edge-tracker/wrangler.toml +3 -3
|
@@ -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
|
@@ -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
|
|
@@ -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`:
|
|
357
|
+
|
|
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`
|
|
364
|
+
|
|
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:
|
|
223
398
|
|
|
224
|
-
|
|
399
|
+
```bash
|
|
400
|
+
# Para testar localmente sem domínio real:
|
|
401
|
+
wrangler dev
|
|
225
402
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
3. Digite: `track.SEU_DOMINIO`
|
|
229
|
-
4. Cloudflare configura o DNS automaticamente (como o domínio já está na Cloudflare)
|
|
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
|
|