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.
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "cdp-edge",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "CDP Edge - Quantum Tracking - Sistema multi-agente para tracking digital Cloudflare Native (Workers + D1)",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -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 — Meta Cloud API v22.0 (notificações de venda/lead):
121
+ ### WhatsApp — Webhook Verification (CTWA Tracking):
122
122
  ```bash
123
- wrangler secret put WA_PHONE_ID
123
+ wrangler secret put WA_WEBHOOK_VERIFY_TOKEN
124
124
  ```
125
- > Phone Number ID do WhatsApp Business. Encontrar em: developers.facebook.com App WhatsApp Configuração da API.
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 WA_ACCESS_TOKEN
132
+ wrangler secret put WHATSAPP_PHONE_NUMBER_ID
129
133
  ```
130
- > Token de acesso permanente do WhatsApp Business (Meta Developers Token de acesso).
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. Ex: `5511999998888` (com código do país, sem `+`).
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 — Remover o Test Code antes de ir ao ar
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 11 — Configurar domínio personalizado (opcional)
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
- Se quiser usar `track.SEU_DOMINIO` em vez do domínio `.workers.dev`:
399
+ ```bash
400
+ # Para testar localmente sem domínio real:
401
+ wrangler dev
225
402
 
226
- 1. No painel da Cloudflare → Workers & Pages → seu Worker → Settings → Domains & Routes
227
- 2. Clique "Add Custom Domain"
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 12 — Configurar webhooks nas plataformas
408
+ ## PASSO 13 — Configurar webhooks nas plataformas
234
409
 
235
410
  ### Ticto (plataforma principal):
236
411