cdp-edge 2.5.5 → 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.
- package/README.md +5 -8
- package/contracts/agent-versions.json +3 -3
- package/contracts/api-versions.json +8 -8
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +2 -2
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +3 -3
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +1 -1
- package/extracted-skill/tracking-events-generator/SKILL.md +4 -4
- package/extracted-skill/tracking-events-generator/advanced-matching.js +1 -1
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +3 -3
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +2 -2
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +6 -6
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +19 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +312 -21
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +8 -8
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +8 -8
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +20 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +9 -9
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +5 -5
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +8 -8
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +4 -4
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +16 -16
- package/extracted-skill/tracking-events-generator/agents/zapman-agent.md +189 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +1 -1
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +8 -8
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +2 -2
- package/extracted-skill/tracking-events-generator/evals/evals.json +5 -5
- package/extracted-skill/tracking-events-generator/knowledge-base.md +5 -5
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +1 -1
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +1 -1
- package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +1 -1
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +5 -5
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +1 -1
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +4 -4
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +1 -1
- package/package.json +1 -1
- package/server-edge-tracker/INSTALAR.md +3 -3
- package/server-edge-tracker/index.ts +37 -36
- package/server-edge-tracker/modules/db.ts +1 -1
- package/server-edge-tracker/modules/dispatch/crm.ts +26 -363
- package/server-edge-tracker/modules/dispatch/meta.ts +2 -2
- package/server-edge-tracker/modules/dispatch/whatsapp.ts +7 -18
- package/server-edge-tracker/modules/intelligence.ts +4 -4
- package/server-edge-tracker/modules/ml/fraud.ts +15 -3
- package/server-edge-tracker/modules/nurture.ts +1 -1
- package/server-edge-tracker/schema.sql +1 -1
- package/server-edge-tracker/types.ts +12 -8
- package/server-edge-tracker/wrangler.toml +143 -140
- package/templates/captura-de-lead.md +1 -1
- package/templates/checkout-proprio.md +1 -1
- package/templates/lancamento-imobiliario.md +1 -1
- package/templates/multi-step-checkout.md +5 -5
- package/templates/pagina-obrigado.md +1 -1
- package/templates/trafego-direto.md +4 -4
- package/templates/webinar-registration.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +0 -244
|
@@ -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
|
|
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": "
|
|
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
|
|
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
|
|
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": "
|
|
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/
|
|
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/
|
|
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/
|
|
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) │ │
|
|
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)** |
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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/
|
|
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
|
|
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 (
|
|
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 (
|
|
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,5 +1,5 @@
|
|
|
1
1
|
# Setup Completo — server-edge-tracker
|
|
2
|
-
## SEU_DOMINIO | Meta CAPI
|
|
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
|
|
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
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
//
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
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
|
-
|
|
808
|
-
phone:
|
|
809
|
-
name:
|
|
810
|
-
email:
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
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
|
|
1133
|
-
|
|
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/
|
|
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' },
|