cdp-edge 2.5.6 → 2.5.7

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.
Files changed (60) hide show
  1. package/README.md +5 -8
  2. package/contracts/agent-versions.json +2 -2
  3. package/contracts/api-versions.json +8 -8
  4. package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +2 -2
  5. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +3 -3
  6. package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +1 -1
  7. package/extracted-skill/tracking-events-generator/SKILL.md +4 -4
  8. package/extracted-skill/tracking-events-generator/advanced-matching.js +1 -1
  9. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +3 -3
  10. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +2 -2
  11. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +2 -2
  12. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1 -1
  13. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +6 -6
  14. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +12 -12
  15. package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +1 -1
  16. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +8 -8
  17. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +8 -8
  18. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +1 -1
  19. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +1 -1
  20. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1 -1
  21. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +9 -9
  22. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +1 -1
  23. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +5 -5
  24. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +8 -8
  25. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +4 -4
  26. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +7 -7
  27. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +16 -16
  28. package/extracted-skill/tracking-events-generator/agents/zapman-agent.md +189 -0
  29. package/extracted-skill/tracking-events-generator/cdpTrack.js +1 -1
  30. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +8 -8
  31. package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +2 -2
  32. package/extracted-skill/tracking-events-generator/evals/evals.json +5 -5
  33. package/extracted-skill/tracking-events-generator/knowledge-base.md +5 -5
  34. package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +1 -1
  35. package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +1 -1
  36. package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +1 -1
  37. package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +5 -5
  38. package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +1 -1
  39. package/extracted-skill/tracking-events-generator/models/trafego-direto.md +4 -4
  40. package/extracted-skill/tracking-events-generator/models/webinar-registration.md +1 -1
  41. package/package.json +1 -1
  42. package/server-edge-tracker/INSTALAR.md +3 -3
  43. package/server-edge-tracker/index.ts +37 -36
  44. package/server-edge-tracker/modules/db.ts +1 -1
  45. package/server-edge-tracker/modules/dispatch/crm.ts +26 -363
  46. package/server-edge-tracker/modules/dispatch/meta.ts +2 -2
  47. package/server-edge-tracker/modules/dispatch/whatsapp.ts +7 -18
  48. package/server-edge-tracker/modules/intelligence.ts +4 -4
  49. package/server-edge-tracker/modules/nurture.ts +1 -1
  50. package/server-edge-tracker/schema.sql +1 -1
  51. package/server-edge-tracker/types.ts +6 -8
  52. package/server-edge-tracker/wrangler.toml +143 -140
  53. package/templates/captura-de-lead.md +1 -1
  54. package/templates/checkout-proprio.md +1 -1
  55. package/templates/lancamento-imobiliario.md +1 -1
  56. package/templates/multi-step-checkout.md +5 -5
  57. package/templates/pagina-obrigado.md +1 -1
  58. package/templates/trafego-direto.md +4 -4
  59. package/templates/webinar-registration.md +1 -1
  60. package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +0 -253
@@ -145,7 +145,7 @@
145
145
  "id": 4,
146
146
  "group": "tier10",
147
147
  "note": "Eval Quantum Tier — verifica padrões Cloudflare Native (cdpTrack SDK + Worker server-side).",
148
- "prompt": "Cria o tracking completo Quantum Tier para uma página de vendas de curso online (R$997). Preciso de Meta CAPI v22.0 + GA4 + TikTok, com Worker Cloudflare. O botão de compra vai para o checkout da Hotmart.",
148
+ "prompt": "Cria o tracking completo Quantum Tier para uma página de vendas de curso online (R$997). Preciso de Meta CAPI v25.0 + GA4 + TikTok, com Worker Cloudflare. O botão de compra vai para o checkout da Hotmart.",
149
149
  "expected_output": "tracking.js com cdpTrack.track(), worker.js com endpoints /track e /webhook/hotmart, deduplicação por event_id, SHA-256 via crypto.subtle, D1 para persistência, event_id idêntico entre browser e servidor.",
150
150
  "assertions": [
151
151
  {
@@ -166,7 +166,7 @@
166
166
  {
167
167
  "name": "contem_capi_v22",
168
168
  "type": "contains",
169
- "value": "v22.0"
169
+ "value": "v25.0"
170
170
  },
171
171
  {
172
172
  "name": "contem_sha256_webcrypto",
@@ -195,8 +195,8 @@
195
195
  "id": 5,
196
196
  "group": "tier10",
197
197
  "note": "Eval Quantum Tier — verifica tratamento correto de webhook de compra com D1 match.",
198
- "prompt": "Meu Worker Cloudflare recebe webhook da Kiwify. Preciso que ele recupere o fbp/fbc do D1 pelo email do comprador e dispare o Purchase para Meta CAPI v22.0 e TikTok Events API v1.3.",
199
- "expected_output": "Worker com handler /webhook/kiwify, lookup de user_profiles no D1 por email, payload com fbp/fbc recuperados, SHA-256 de email e telefone, event_id = kiwify_{order_id}, endpoint Meta v22.0, endpoint TikTok v1.3.",
198
+ "prompt": "Meu Worker Cloudflare recebe webhook da Kiwify. Preciso que ele recupere o fbp/fbc do D1 pelo email do comprador e dispare o Purchase para Meta CAPI v25.0 e TikTok Events API v1.3.",
199
+ "expected_output": "Worker com handler /webhook/kiwify, lookup de user_profiles no D1 por email, payload com fbp/fbc recuperados, SHA-256 de email e telefone, event_id = kiwify_{order_id}, endpoint Meta v25.0, endpoint TikTok v1.3.",
200
200
  "assertions": [
201
201
  {
202
202
  "name": "contem_webhook_kiwify",
@@ -211,7 +211,7 @@
211
211
  {
212
212
  "name": "usa_capi_v22",
213
213
  "type": "contains",
214
- "value": "v22.0"
214
+ "value": "v25.0"
215
215
  },
216
216
  {
217
217
  "name": "usa_tiktok_v13",
@@ -1798,7 +1798,7 @@ async function sendMetaCapi(p) {
1798
1798
  custom_data,
1799
1799
  };
1800
1800
 
1801
- const url = `https://graph.facebook.com/v22.0/${CONFIG.metaPixelId}/events`;
1801
+ const url = `https://graph.facebook.com/v25.0/${CONFIG.metaPixelId}/events`;
1802
1802
  const params = new URLSearchParams({ access_token: CONFIG.server.metaCapi.accessToken });
1803
1803
  if (CONFIG.server.metaCapi.testEventCode) {
1804
1804
  serverEvent.test_event_code = CONFIG.server.metaCapi.testEventCode;
@@ -2326,7 +2326,7 @@ async function sendMetaCapi(p, env) {
2326
2326
  if (env.META_TEST_EVENT_CODE) serverEvent.test_event_code = env.META_TEST_EVENT_CODE;
2327
2327
 
2328
2328
  await fetch(
2329
- `https://graph.facebook.com/v22.0/${env.META_PIXEL_ID}/events?access_token=${env.META_ACCESS_TOKEN}`,
2329
+ `https://graph.facebook.com/v25.0/${env.META_PIXEL_ID}/events?access_token=${env.META_ACCESS_TOKEN}`,
2330
2330
  {
2331
2331
  method: 'POST',
2332
2332
  headers: { 'Content-Type': 'application/json' },
@@ -2626,7 +2626,7 @@ async function sendMetaCapi(lead, env, hashedPhone) {
2626
2626
  };
2627
2627
 
2628
2628
  await fetch(
2629
- `https://graph.facebook.com/v22.0/${env.META_PIXEL_ID}/events?access_token=${env.META_CAPI_TOKEN}`,
2629
+ `https://graph.facebook.com/v25.0/${env.META_PIXEL_ID}/events?access_token=${env.META_CAPI_TOKEN}`,
2630
2630
  {
2631
2631
  method: 'POST',
2632
2632
  headers: { 'Content-Type': 'application/json' },
@@ -2761,7 +2761,7 @@ wrangler secret put META_MESSAGING_TOKEN
2761
2761
  │ │ │
2762
2762
  ┌──────────▼──┐ ┌────────▼────────┐ ┌─────▼──────────┐
2763
2763
  │ WhatsApp │ │ Meta CAPI │ │ A/B Edge │
2764
- │ (Cloud API) │ │ v22.0 │ │ Routing │
2764
+ │ (Cloud API) │ │ v25.0 │ │ Routing │
2765
2765
  └─────────────┘ └─────────────────┘ └────────────────┘
2766
2766
  ```
2767
2767
 
@@ -2877,7 +2877,7 @@ async function sha256(data) {
2877
2877
 
2878
2878
  | Plataforma | Versão | Endpoint Principal |
2879
2879
  |---|---|---|
2880
- | **Meta (CAPI)** | v22.0 | `https://graph.facebook.com/v22.0/{PIXEL_ID}/events` |
2880
+ | **Meta (CAPI)** | v25.0 | `https://graph.facebook.com/v25.0/{PIXEL_ID}/events` |
2881
2881
  | **TikTok (Events)** | v1.3 | `https://business-api.tiktok.com/open_api/v1.3/event/track/` |
2882
2882
  | **Google (GA4)** | MP | `https://www.google-analytics.com/mp/collect` |
2883
2883
  | **Spotify (Ads)** | v1 | `https://advertising-api.spotify.com/conversion/v1/accounts/{ACC_ID}/events` |
@@ -67,7 +67,7 @@ O PlayerBuilder Quantum Tier processa o evento via Cloudflare Worker:
67
67
  1. **Deduplicação**: Utiliza o `event_id` do browser para 100% de precisão na Meta CAPI.
68
68
  2. **Advanced Matching**: Aplica SHA256 em `email`, `phone`, `first_name` e `last_name` (WebCrypto native).
69
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).
70
+ 4. **API Dispatch**: Envia assincronamente para Meta CAPI (v25.0) e TikTok Events API (v1.3).
71
71
 
72
72
  ---
73
73
 
@@ -73,7 +73,7 @@ O Worker gerencia o estado da transação e a persistência.
73
73
  Ao receber o evento `Purchase`, o Worker salva na tabela `leads` com o status correspondente.
74
74
 
75
75
  ### 2.2 Despacho para APIs
76
- - O Worker envia `Purchase` para as APIs (Meta CAPI v22.0, TikTok v1.3).
76
+ - O Worker envia `Purchase` para as APIs (Meta CAPI v25.0, TikTok v1.3).
77
77
  - O `InitiateCheckout` prévio no D1 permite automação de recuperação de carrinho.
78
78
 
79
79
  ---
@@ -23,7 +23,7 @@ Browser (cdpTrack.js)
23
23
  ├─ Fraud Gate
24
24
  ├─ LTV Prediction (Granite 4.0 Micro) + score por eventType
25
25
  ├─ D1: upsertProfile, identity graph, distanceKm
26
- └─ CAPI dispatch: Meta v22.0 + GA4 + TikTok v1.3
26
+ └─ CAPI dispatch: Meta v25.0 + GA4 + TikTok v1.3
27
27
  ```
28
28
 
29
29
  ---
@@ -3,7 +3,7 @@
3
3
  > ✅ **STATUS: Quantum Tier (Server-Side Completo)**
4
4
  >
5
5
  > Checkout multi-etapa com rastreamento 100% Cloudflare Native (Workers + D1).
6
- > Inclui enriquecimento progressivo de identidade, deduplicação e dispatch server-side para Meta CAPI v22.0, GA4 MP e TikTok API v1.3.
6
+ > Inclui enriquecimento progressivo de identidade, deduplicação e dispatch server-side para Meta CAPI v25.0, GA4 MP e TikTok API v1.3.
7
7
 
8
8
  Checkout próprio dividido em múltiplas etapas: dados pessoais → endereço → pagamento → confirmação.
9
9
 
@@ -373,7 +373,7 @@ async function dispatchEvents(eventBody, sessionData, env) {
373
373
  }
374
374
  ```
375
375
 
376
- ### 2.4 Meta CAPI v22.0
376
+ ### 2.4 Meta CAPI v25.0
377
377
  ```javascript
378
378
  async function dispatchMeta(eventName, sessionData, env, customData = {}) {
379
379
  if (!env.META_ACCESS_TOKEN || !env.META_PIXEL_ID) return;
@@ -407,7 +407,7 @@ async function dispatchMeta(eventName, sessionData, env, customData = {}) {
407
407
  };
408
408
 
409
409
  const res = await fetch(
410
- `https://graph.facebook.com/v22.0/${env.META_PIXEL_ID}/events?access_token=${env.META_ACCESS_TOKEN}`,
410
+ `https://graph.facebook.com/v25.0/${env.META_PIXEL_ID}/events?access_token=${env.META_ACCESS_TOKEN}`,
411
411
  {
412
412
  method: 'POST',
413
413
  headers: { 'Content-Type': 'application/json' },
@@ -591,7 +591,7 @@ CREATE INDEX IF NOT EXISTS idx_events_created ON events_log(created_at);
591
591
  ### Cloudflare Worker
592
592
  - [ ] Endpoint `/api/tracking` configurado como Route no Cloudflare
593
593
  - [ ] Identity Graph atualizado progressivamente conforme usuário preenche campos
594
- - [ ] Meta CAPI v22.0 endpoint correto
594
+ - [ ] Meta CAPI v25.0 endpoint correto
595
595
  - [ ] TikTok Events API v1.3 endpoint correto
596
596
  - [ ] GA4 Measurement Protocol configurado
597
597
  - [ ] CheckoutAbandonment logado apenas no D1 (não dispara para APIs)
@@ -628,7 +628,7 @@ CREATE INDEX IF NOT EXISTS idx_events_created ON events_log(created_at);
628
628
  └── Gateway: callback de sucesso → trackPurchaseConfirmed()
629
629
  └── JS: dispara Purchase → Worker
630
630
  └── Worker: recupera Identity Graph completa (todos os hashes)
631
- └── Worker: dispatch → Meta Purchase CAPI (v22.0)
631
+ └── Worker: dispatch → Meta Purchase CAPI (v25.0)
632
632
  └── Worker: dispatch → GA4 Purchase (MP)
633
633
  └── Worker: dispatch → TikTok CompletePayment (v1.3)
634
634
 
@@ -43,7 +43,7 @@ cdpTrack.track('ViewContent', {
43
43
  ## 🖥️ PASSO 2: SERVIDOR (CLOUDFLARE WORKER)
44
44
 
45
45
  O Worker realiza a verificação de duplicidade:
46
- - **D1 Cross-Check**: Verifica se o `transaction_id` já existe no banco antes de enviar para Meta CAPI (v22.0) e TikTok (v1.3).
46
+ - **D1 Cross-Check**: Verifica se o `transaction_id` já existe no banco antes de enviar para Meta CAPI (v25.0) e TikTok (v1.3).
47
47
  - **Match Quality**: Recupera os identificadores originais do banco de dados para enriquecer o evento.
48
48
 
49
49
  ---
@@ -323,7 +323,7 @@ async function handleWebhook(request, env, url) {
323
323
  }
324
324
  ```
325
325
 
326
- ### 2.3 Meta CAPI v22.0
326
+ ### 2.3 Meta CAPI v25.0
327
327
  ```javascript
328
328
  async function dispatchMeta(eventName, data, env, customData = {}) {
329
329
  if (!env.META_ACCESS_TOKEN || !env.META_PIXEL_ID) return;
@@ -356,7 +356,7 @@ async function dispatchMeta(eventName, data, env, customData = {}) {
356
356
  };
357
357
 
358
358
  const res = await fetch(
359
- `https://graph.facebook.com/v22.0/${env.META_PIXEL_ID}/events?access_token=${env.META_ACCESS_TOKEN}`,
359
+ `https://graph.facebook.com/v25.0/${env.META_PIXEL_ID}/events?access_token=${env.META_ACCESS_TOKEN}`,
360
360
  {
361
361
  method: 'POST',
362
362
  headers: { 'Content-Type': 'application/json' },
@@ -510,7 +510,7 @@ CREATE INDEX IF NOT EXISTS idx_fbc ON identity_graph(fbc);
510
510
  - [ ] Endpoint `/api/wh/{plataforma}` para webhooks
511
511
  - [ ] Salvar sessão no D1 com todos os cookies
512
512
  - [ ] D1 lookup pelo cdp_uid ao receber webhook
513
- - [ ] Meta CAPI v22.0 endpoint correto
513
+ - [ ] Meta CAPI v25.0 endpoint correto
514
514
  - [ ] TikTok Events API v1.3 endpoint correto
515
515
  - [ ] GA4 Measurement Protocol configurado
516
516
 
@@ -543,7 +543,7 @@ CREATE INDEX IF NOT EXISTS idx_fbc ON identity_graph(fbc);
543
543
  └── Plataforma envia webhook → /api/wh/{plataforma}
544
544
  └── Worker: extrai cdp_uid do webhook (xcod/sck/src)
545
545
  └── Worker: D1 lookup → recupera fbp, fbc, ttp, UTMs, IP
546
- └── Worker: dispatch → Meta Purchase CAPI (v22.0)
546
+ └── Worker: dispatch → Meta Purchase CAPI (v25.0)
547
547
  └── Worker: dispatch → GA4 Purchase (MP)
548
548
  └── Worker: dispatch → TikTok CompletePayment (v1.3)
549
549
  ```
@@ -52,7 +52,7 @@ document.querySelector('#form-webinar').addEventListener('submit', async (e) =>
52
52
  O Worker executa:
53
53
  - **Hashing**: Proteção de dados via SHA-256.
54
54
  - **D1 Store**: Gravação do lead e vinculação de UTMs para análise de ROI.
55
- - **API Dispatch**: Envio para Meta CAPI (v22.0) e TikTok Events API (v1.3).
55
+ - **API Dispatch**: Envio para Meta CAPI (v25.0) e TikTok Events API (v1.3).
56
56
 
57
57
  ---
58
58
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdp-edge",
3
- "version": "2.5.6",
3
+ "version": "2.5.7",
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",
@@ -1,5 +1,5 @@
1
1
  # Setup Completo — server-edge-tracker
2
- ## SEU_DOMINIO | Meta CAPI v22.0 + GA4 Measurement Protocol + D1 Database
2
+ ## SEU_DOMINIO | Meta CAPI v25.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.
@@ -149,7 +149,7 @@ wrangler secret put WA_WEBHOOK_VERIFY_TOKEN
149
149
  > Token de verificação do webhook WhatsApp (obrigatório para CTWA). Meta exige este token para registrar o webhook.
150
150
  > Defina qualquer string segura, ex: `cdp-edge-webhook-2026-secret-xyz`.
151
151
 
152
- ### WhatsApp — Meta Cloud API v22.0 (mensagens automáticas - OPCIONAL):
152
+ ### WhatsApp — Meta Cloud API v25.0 (mensagens automáticas - OPCIONAL):
153
153
  > ⚠️ Estes secrets são **OPCIONAIS**. Se você precisa apenas de tracking de dados (ctwaclid), não configure-os.
154
154
 
155
155
  ```bash
@@ -178,7 +178,7 @@ wrangler secret put CALLMEBOT_APIKEY
178
178
  ```
179
179
  > API Key gerada pelo CallMeBot após ativação (você recebe via WhatsApp após enviar a mensagem de ativação).
180
180
 
181
- > **Nota:** CallMeBot é usado exclusivamente para alertas críticos do sistema (Worker com erro, API falhando, token expirado). Notificações de venda/lead usam a Meta Cloud API v22.0.
181
+ > **Nota:** CallMeBot é usado exclusivamente para alertas críticos do sistema (Worker com erro, API falhando, token expirado). Notificações de venda/lead usam a Meta Cloud API v25.0.
182
182
 
183
183
  ---
184
184
 
@@ -52,6 +52,7 @@ import {
52
52
  import { sendMetaCapi } from './modules/dispatch/meta';
53
53
  import { sendGA4Mp } from './modules/dispatch/ga4';
54
54
  import { sendTikTokApi } from './modules/dispatch/tiktok';
55
+ import { pushLeadToZapmanCrm } from './modules/dispatch/crm';
55
56
  import {
56
57
  sendPinterestCapi,
57
58
  sendRedditCapi,
@@ -63,9 +64,6 @@ import {
63
64
  processWhatsAppWebhook,
64
65
  verifyHmac,
65
66
  } from './modules/dispatch/whatsapp';
66
- import {
67
- pushLeadToCrm,
68
- } from './modules/dispatch/crm';
69
67
 
70
68
  // ── ML — LTV + A/B Testing ────────────────────────────────────────────────────
71
69
  import {
@@ -242,9 +240,9 @@ export default {
242
240
  WA_NOTIFY_NUMBER: env.WA_NOTIFY_NUMBER ? 'set' : 'not set (optional - only for auto-reply)',
243
241
  TIKTOK_ACCESS_TOKEN: env.TIKTOK_ACCESS_TOKEN ? 'set' : 'not set (optional)',
244
242
  CALLMEBOT_PHONE: env.CALLMEBOT_PHONE ? 'set' : 'not set (optional)',
245
- EVO_CRM_BASE_URL: env.EVO_CRM_BASE_URL ? 'set' : 'not set (optional - EVO CRM)',
246
- EVO_CRM_CLIENT_ID: env.EVO_CRM_CLIENT_ID ? 'set' : 'not set (optional - EVO CRM)',
247
- EVO_CRM_INBOX_ID: env.EVO_CRM_INBOX_ID ? 'set' : 'not set (optional - EVO CRM)',
243
+ ZAPMAN_API_URL: env.ZAPMAN_API_URL ? 'set' : 'not set (optional - ZapMan SDR)',
244
+ ZAPMAN_API_KEY: env.ZAPMAN_API_KEY ? 'set' : 'not set (optional - ZapMan SDR)',
245
+ ZAPMAN_WEBHOOK_URL: env.ZAPMAN_WEBHOOK_URL ? 'set' : 'not set (optional - ZapMan SDR)',
248
246
  };
249
247
 
250
248
  const hasMissing =
@@ -799,35 +797,18 @@ export default {
799
797
  : []),
800
798
  ]);
801
799
 
802
- // ── EVO CRM — cria contato + conversa + nota interna ─────────────────
803
- // Silencioso se EVO_CRM_BASE_URL / EVO_CRM_CLIENT_ID não estiverem configurados.
804
- const CRM_EVENTS = ['Lead', 'Contact', 'CompleteRegistration'];
805
- if (CRM_EVENTS.includes(eventName) && trackPayload.phone) {
800
+ // ZapMan CRM — push automático quando Lead ou Contact
801
+ if (['Lead', 'Contact'].includes(eventName) && payload.phone) {
802
+ const phoneNorm = String(payload.phone).replace(/\D/g, '');
803
+ const e164 = phoneNorm.startsWith('55') ? phoneNorm : `55${phoneNorm}`;
806
804
  ctx.waitUntil(
807
- pushLeadToCrm(env, {
808
- phone: trackPayload.phone,
809
- name: [trackPayload.firstName, trackPayload.lastName].filter(Boolean).join(' ') || null,
810
- email: trackPayload.email || null,
811
- fbclid: trackPayload.fbclid || null,
812
- fbc: trackPayload.fbc || null,
813
- fbp: trackPayload.fbp || null,
814
- utmSource: trackPayload.utmSource || null,
815
- utmMedium: trackPayload.utmMedium || null,
816
- utmCampaign: trackPayload.utmCampaign || null,
817
- utmContent: trackPayload.utmContent || null,
818
- utmTerm: trackPayload.utmTerm || null,
819
- pageUrl: trackPayload.pageUrl || null,
820
- formName: trackPayload.contentName || trackPayload.productName || eventName,
821
- eventName,
822
- intentScore: typeof trackPayload.intent_score === 'number'
823
- ? trackPayload.intent_score
824
- : typeof trackPayload.intentScoreNum === 'number'
825
- ? trackPayload.intentScoreNum
826
- : null,
827
- ltvClass: trackPayload.ltvClass || null,
828
- funnelStage: trackPayload.funnel_stage || trackPayload.funnelDepth || null,
829
- value: trackPayload.value ?? null,
830
- currency: trackPayload.currency || null,
805
+ pushLeadToZapmanCrm(env, {
806
+ phone: e164,
807
+ name: payload.firstName ? `${payload.firstName} ${payload.lastName || ''}`.trim() : undefined,
808
+ email: payload.email || '',
809
+ empresa: payload.company || '',
810
+ campanha: payload.utmCampaign || payload.utm_campaign || '',
811
+ origem: 'meta_api',
831
812
  })
832
813
  );
833
814
  }
@@ -1129,12 +1110,32 @@ export default {
1129
1110
 
1130
1111
  // ── POST /webhook/whatsapp — mensagens recebidas (CTWA) ──────────────────
1131
1112
  if (request.method === 'POST' && url.pathname === '/webhook/whatsapp') {
1132
- let body;
1133
- try { body = await request.json(); } catch {
1113
+ let rawBody: string;
1114
+ let body: any;
1115
+ try {
1116
+ rawBody = await request.text();
1117
+ body = JSON.parse(rawBody);
1118
+ } catch {
1134
1119
  return new Response('JSON inválido', { status: 400 });
1135
1120
  }
1136
1121
 
1137
1122
  const result = await processWhatsAppWebhook(env, body, request, ctx);
1123
+
1124
+ // Forward para ZapMan SDR — qualificação de leads via IA
1125
+ if (env.ZAPMAN_WEBHOOK_URL) {
1126
+ const sig = request.headers.get('x-hub-signature-256') || '';
1127
+ ctx.waitUntil(
1128
+ fetch(env.ZAPMAN_WEBHOOK_URL, {
1129
+ method: 'POST',
1130
+ headers: {
1131
+ 'Content-Type': 'application/json',
1132
+ ...(sig && { 'x-hub-signature-256': sig }),
1133
+ },
1134
+ body: rawBody,
1135
+ }).catch(() => {})
1136
+ );
1137
+ }
1138
+
1138
1139
  return new Response(JSON.stringify({ ok: true, ...result }), { status: 200, headers });
1139
1140
  }
1140
1141
 
@@ -277,7 +277,7 @@ export async function fireAutomation(env: Env, eventName: string, leadId: number
277
277
  const digits = String(payload.phone).replace(/\D/g, '');
278
278
  const e164 = digits.startsWith('55') ? `+${digits}` : `+55${digits}`;
279
279
  const waRes = await fetch(
280
- `https://graph.facebook.com/v22.0/${env.WHATSAPP_PHONE_NUMBER_ID}/messages`,
280
+ `https://graph.facebook.com/v25.0/${env.WHATSAPP_PHONE_NUMBER_ID}/messages`,
281
281
  {
282
282
  method: 'POST',
283
283
  headers: { 'Authorization': `Bearer ${env.WHATSAPP_ACCESS_TOKEN}`, 'Content-Type': 'application/json' },