cdp-edge 1.2.2 → 1.4.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 +153 -306
- package/bin/cdp-edge.js +71 -61
- package/contracts/agent-versions.json +682 -0
- package/contracts/api-versions.json +372 -368
- package/contracts/types.ts +81 -0
- package/dist/commands/analyze.js +52 -52
- package/dist/commands/infra.js +54 -54
- package/dist/commands/install.js +26 -3
- package/dist/commands/server.js +174 -174
- package/dist/commands/setup.js +332 -100
- package/dist/commands/validate.js +248 -84
- package/dist/index.js +12 -12
- package/dist/sdk/cdpTrack.js +2095 -0
- package/dist/sdk/cdpTrack.min.js +64 -0
- package/dist/sdk/install-snippet.html +10 -0
- package/docs/whatsapp-ctwa.md +5 -4
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +89 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +101 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -364
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +41 -41
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +40 -50
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +174 -74
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +25 -5
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +10 -10
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +43 -42
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +22 -22
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +23 -9
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +28 -1
- package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +253 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +206 -1
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +128 -2
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +191 -31
- package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +145 -34
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +24 -5
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +588 -93
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +190 -15
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +10 -2
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +769 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +21 -4
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +41 -31
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +18 -8
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +14 -6
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +7 -7
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +16 -8
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +15 -7
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +157 -48
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +35 -35
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +15 -7
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +73 -2
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +104 -9
- package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +13 -9
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +112 -4
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +58 -5
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +26 -18
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +152 -37
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -285
- package/extracted-skill/tracking-events-generator/cdpTrack.js +642 -641
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +14 -10
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -226
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -235
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -497
- package/extracted-skill/tracking-events-generator/knowledge-base.md +172 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -992
- package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -144
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -48
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -28
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -205
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -56
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -19
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -425
- package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
- package/package.json +89 -75
- package/scripts/build-sdk.js +106 -0
- package/server-edge-tracker/.client.env.example +14 -0
- package/server-edge-tracker/INSTALAR.md +222 -23
- package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
- package/server-edge-tracker/config/utm-mapping.json +64 -0
- package/server-edge-tracker/deploy-client.cjs +76 -0
- package/server-edge-tracker/index.ts +1230 -0
- package/server-edge-tracker/migrate-v7.sql +64 -0
- package/server-edge-tracker/modules/db.ts +710 -0
- package/server-edge-tracker/modules/dispatch/crm.ts +382 -0
- package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
- package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
- package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
- package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
- package/server-edge-tracker/modules/dispatch/whatsapp.ts +296 -0
- package/server-edge-tracker/modules/intelligence.ts +589 -0
- package/server-edge-tracker/modules/ml/bidding.ts +247 -0
- package/server-edge-tracker/modules/ml/fraud.ts +302 -0
- package/server-edge-tracker/modules/ml/logistic.ts +226 -0
- package/server-edge-tracker/modules/ml/ltv.ts +531 -0
- package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
- package/server-edge-tracker/modules/ml/quiz.ts +343 -0
- package/server-edge-tracker/modules/ml/roas.ts +255 -0
- package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
- package/server-edge-tracker/modules/nurture.ts +257 -0
- package/server-edge-tracker/modules/utils.ts +311 -0
- package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -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-indexes.sql +67 -0
- package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
- package/server-edge-tracker/schema-quiz.sql +52 -0
- package/server-edge-tracker/schema-sales-engine.sql +113 -0
- package/server-edge-tracker/schema-segmentation.sql +219 -0
- package/server-edge-tracker/schema-utm.sql +82 -0
- package/server-edge-tracker/schema.sql +281 -265
- package/server-edge-tracker/types.ts +275 -0
- package/server-edge-tracker/wrangler.toml +140 -85
- package/templates/lancamento-imobiliario.md +344 -0
- package/templates/multi-step-checkout.md +3 -4
- package/templates/pinterest/conversions-api-template.js +144 -144
- package/templates/pinterest/event-mappings.json +48 -48
- package/templates/pinterest/tag-template.js +28 -28
- package/templates/quiz-funnel.md +83 -19
- package/templates/reddit/conversions-api-template.js +205 -205
- package/templates/reddit/event-mappings.json +56 -56
- package/templates/reddit/pixel-template.js +12 -39
- package/templates/scenarios/behavior-engine.js +45 -22
- package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
- package/docs/installation.md +0 -155
- package/docs/quick-start.md +0 -185
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +0 -1419
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -643
- package/server-edge-tracker/worker.js +0 -2574
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# UTM Agent — CDP Edge
|
|
2
|
+
|
|
3
|
+
**Papel:** Gerador automático de UTMs completas — usa o contexto já coletado pelo CDP Edge para produzir cada string de UTM pronta, por plataforma e por formato de anúncio. O cliente copia e cola.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Princípio Fundamental
|
|
8
|
+
|
|
9
|
+
O CDP Edge já sabe tudo que precisa para gerar as UTMs. Nenhuma informação adicional do cliente é necessária além do que já foi coletado nas fases anteriores:
|
|
10
|
+
|
|
11
|
+
| O que o CDP Edge já sabe | De onde vem |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Quais plataformas serão usadas | FASE 0-B (seleção de plataformas) |
|
|
14
|
+
| Se tem vídeo no funil | Page Analyzer (detecta VSL, videos, players) |
|
|
15
|
+
| Se tem quiz | Lead Scoring Agent (configurado na FASE 6) |
|
|
16
|
+
| Se tem formulário / landing page | Page Analyzer (detecta forms, CTAs) |
|
|
17
|
+
| Se tem Click-to-WhatsApp | Meta selecionado + CTWA habilitado automaticamente |
|
|
18
|
+
| Nicho e categoria do produto | Page Analyzer |
|
|
19
|
+
| Faixa de valor do produto | Pergunta feita pelo próprio UTM Agent na FASE 2-B |
|
|
20
|
+
|
|
21
|
+
**Com tudo isso, o UTM Agent gera uma tabela completa de UTMs prontas — o cliente não precisa inventar nenhum parâmetro.**
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## O Que São as 5 Dimensões
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
utm_source → PLATAFORMA — de qual rede de anúncio veio o lead
|
|
29
|
+
utm_medium → FORMATO — qual tipo de anúncio foi usado
|
|
30
|
+
utm_campaign → PRODUTO/FAIXA — qual produto e faixa de valor (obfuscado)
|
|
31
|
+
utm_content → ORIGEM — qual criativo/página/funil gerou o lead
|
|
32
|
+
utm_term → QUALIFICAÇÃO — classificação do quiz (preenchida pelo Worker)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`utm_term` é o único campo que o cliente **nunca** configura nos anúncios — o Worker injeta automaticamente após o Quiz Scoring Engine classificar o lead.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Quando Este Agente Roda
|
|
40
|
+
|
|
41
|
+
Após o **Lead Scoring Agent** (se quiz habilitado) e antes do **Browser Tracking Agent**.
|
|
42
|
+
|
|
43
|
+
Inputs que o agente já possui ao ser chamado:
|
|
44
|
+
- `SELECTED_PLATFORMS` — plataformas selecionadas na FASE 0-B
|
|
45
|
+
- `page_analysis` — saída do Page Analyzer (tem video? tem quiz? tem form? tem CTWA?)
|
|
46
|
+
- `lead_scoring_config` — quiz configurado? quais perguntas? qual nome do quiz?
|
|
47
|
+
- `utm_value_range` — faixa de valor do produto (perguntada na FASE 2-B)
|
|
48
|
+
- `product_category` — nicho detectado pelo Page Analyzer
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Processo de Geração
|
|
53
|
+
|
|
54
|
+
### PASSO 1 — Mapear o que foi implementado no funil
|
|
55
|
+
|
|
56
|
+
O agente lê os outputs das fases anteriores e monta um inventário de origens:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
INVENTÁRIO DE ORIGENS (montado automaticamente):
|
|
60
|
+
|
|
61
|
+
Plataformas ativas: [facebook, google, tiktok]
|
|
62
|
+
Formatos por plataforma:
|
|
63
|
+
facebook → [reels, stories, video, cpc, ctwa] ← detectado: tem VSL + tem CTWA
|
|
64
|
+
google → [cpc] ← search only
|
|
65
|
+
tiktok → [video] ← video in-feed
|
|
66
|
+
Tipos de página:
|
|
67
|
+
→ quiz habilitado → utm_content inclui quiz_{nome_quiz}
|
|
68
|
+
→ landing com VSL → utm_content inclui video_{tipo}
|
|
69
|
+
→ formulário direto → utm_content inclui landing_principal
|
|
70
|
+
→ CTWA ativo → utm_content inclui ctwa_direto
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### PASSO 2 — Gerar o valor obfuscado da campanha
|
|
74
|
+
|
|
75
|
+
Com a faixa de valor informada (ex: "700k-1M"):
|
|
76
|
+
```
|
|
77
|
+
SHA256("700k-1M" + "CDP_EDGE_UTM_SALT") → primeiros 8 chars → "8a3f1d2b"
|
|
78
|
+
utm_campaign = imovel_8a3f1d2b
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Registrar no `utm-mapping.json` para de-obfuscação no Worker.
|
|
82
|
+
|
|
83
|
+
### PASSO 3 — Gerar a tabela completa de UTMs prontas
|
|
84
|
+
|
|
85
|
+
Para CADA combinação de plataforma × formato × origem que existe no funil:
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Saída — Tabela de UTMs Prontas para o Cliente
|
|
90
|
+
|
|
91
|
+
O agente entrega uma tabela assim, gerada automaticamente com base no que foi implementado:
|
|
92
|
+
|
|
93
|
+
```markdown
|
|
94
|
+
# UTMs do Projeto [NOME DO CLIENTE]
|
|
95
|
+
# Geradas pelo CDP Edge — copie e cole em cada campanha
|
|
96
|
+
|
|
97
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
98
|
+
## META ADS
|
|
99
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
100
|
+
|
|
101
|
+
### Campanhas que levam ao QUIZ DE QUALIFICAÇÃO
|
|
102
|
+
Use quando o anúncio leva para a página do quiz antes do formulário.
|
|
103
|
+
|
|
104
|
+
Reels:
|
|
105
|
+
utm_source=facebook&utm_medium=reels&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
|
|
106
|
+
|
|
107
|
+
Stories:
|
|
108
|
+
utm_source=facebook&utm_medium=stories&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
|
|
109
|
+
|
|
110
|
+
Vídeo in-feed:
|
|
111
|
+
utm_source=facebook&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
|
|
112
|
+
|
|
113
|
+
Feed (imagem/carrossel):
|
|
114
|
+
utm_source=facebook&utm_medium=cpc&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
|
|
115
|
+
|
|
116
|
+
### Campanhas que levam ao VÍDEO DE VENDAS (VSL)
|
|
117
|
+
Use quando o anúncio leva direto para a landing page com vídeo.
|
|
118
|
+
|
|
119
|
+
Reels:
|
|
120
|
+
utm_source=facebook&utm_medium=reels&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
|
|
121
|
+
|
|
122
|
+
Stories:
|
|
123
|
+
utm_source=facebook&utm_medium=stories&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
|
|
124
|
+
|
|
125
|
+
Vídeo in-feed:
|
|
126
|
+
utm_source=facebook&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
|
|
127
|
+
|
|
128
|
+
### Campanhas Click-to-WhatsApp (CTWA)
|
|
129
|
+
Use quando o anúncio abre diretamente o WhatsApp.
|
|
130
|
+
|
|
131
|
+
utm_source=whatsapp&utm_medium=ctwa&utm_campaign=imovel_8a3f1d2b&utm_content=ctwa_direto
|
|
132
|
+
|
|
133
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
134
|
+
## GOOGLE ADS
|
|
135
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
136
|
+
|
|
137
|
+
### Search (palavras-chave)
|
|
138
|
+
utm_source=google&utm_medium=cpc&utm_campaign=imovel_8a3f1d2b&utm_content=landing_principal
|
|
139
|
+
|
|
140
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
141
|
+
## TIKTOK ADS
|
|
142
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
143
|
+
|
|
144
|
+
### Vídeo In-Feed (quiz)
|
|
145
|
+
utm_source=tiktok&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
|
|
146
|
+
|
|
147
|
+
### Vídeo In-Feed (VSL)
|
|
148
|
+
utm_source=tiktok&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
|
|
149
|
+
|
|
150
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
151
|
+
## OBSERVAÇÕES
|
|
152
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
153
|
+
|
|
154
|
+
utm_term NÃO é configurado nos anúncios.
|
|
155
|
+
O servidor preenche automaticamente após o quiz:
|
|
156
|
+
comprador / interessado / curioso / perdido
|
|
157
|
+
|
|
158
|
+
O valor real da campanha (700k-1M) está protegido.
|
|
159
|
+
Apenas o CDP Edge sabe a correspondência real.
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Lógica de utm_content por Tipo de Funil
|
|
165
|
+
|
|
166
|
+
O agente detecta automaticamente e gera os valores corretos:
|
|
167
|
+
|
|
168
|
+
| O que o Page Analyzer encontrou | utm_content gerado |
|
|
169
|
+
|---|---|
|
|
170
|
+
| Quiz configurado pelo Lead Scoring Agent | `quiz_{nome_do_quiz}` |
|
|
171
|
+
| Player de vídeo / VSL na landing | `video_vsl_principal` |
|
|
172
|
+
| Vídeo de depoimento identificado | `video_depoimento` |
|
|
173
|
+
| Apenas formulário, sem vídeo, sem quiz | `landing_principal` |
|
|
174
|
+
| CTWA ativo (Meta selecionado) | `ctwa_direto` |
|
|
175
|
+
| Webinar / evento ao vivo detectado | `webinar_{nome}` |
|
|
176
|
+
| Múltiplos formatos | gera uma linha para cada |
|
|
177
|
+
|
|
178
|
+
**Regra:** se o funil tem quiz E vídeo, gera UTMs separadas para cada origem — porque o ROAS Feedback vai poder comparar qual converte mais.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Lógica de utm_medium por Plataforma
|
|
183
|
+
|
|
184
|
+
O agente gera formatos com base nas plataformas selecionadas na FASE 0-B. Não pergunta ao cliente — usa o que já foi selecionado:
|
|
185
|
+
|
|
186
|
+
| Plataforma selecionada | utm_medium gerados automaticamente |
|
|
187
|
+
|---|---|
|
|
188
|
+
| Meta Ads | reels, stories, video, cpc |
|
|
189
|
+
| Meta Ads + CTWA | reels, stories, video, cpc, ctwa |
|
|
190
|
+
| Google Ads | cpc |
|
|
191
|
+
| Google Ads + Display | cpc, display |
|
|
192
|
+
| TikTok Ads | video |
|
|
193
|
+
| YouTube Ads | instream, bumper |
|
|
194
|
+
| Pinterest Ads | cpc |
|
|
195
|
+
| LinkedIn Ads | cpc |
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## utm_campaign — Geração da Faixa Obfuscada
|
|
200
|
+
|
|
201
|
+
Esta é a única pergunta que o UTM Agent faz ao cliente (já feita na FASE 2-B durante o master orchestrator):
|
|
202
|
+
|
|
203
|
+
> "Qual o valor/faixa de preço do produto?" (ex: 700k-1M, 297-997, etc.)
|
|
204
|
+
|
|
205
|
+
Com a resposta, gera:
|
|
206
|
+
```
|
|
207
|
+
SHA256("700k-1M" + salt) → "8a3f1d2b"
|
|
208
|
+
utm_campaign = imovel_8a3f1d2b
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Se o cliente **não** tiver segmentação por valor (produto de preço único), o agente usa:
|
|
212
|
+
```
|
|
213
|
+
utm_campaign = {categoria}_geral
|
|
214
|
+
```
|
|
215
|
+
Ex: `imovel_geral`, `curso_geral`, `servico_geral` — sem obfuscação.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## utm-mapping.json — Gerado Automaticamente
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{
|
|
223
|
+
"obfuscation_config": {
|
|
224
|
+
"method": "sha256",
|
|
225
|
+
"salt": "CDP_EDGE_UTM_SALT",
|
|
226
|
+
"truncated_length": 8
|
|
227
|
+
},
|
|
228
|
+
"mappings": [
|
|
229
|
+
{
|
|
230
|
+
"obfuscated": "8a3f1d2b",
|
|
231
|
+
"original": "700k-1M",
|
|
232
|
+
"category": "imovel",
|
|
233
|
+
"platform_specific": {
|
|
234
|
+
"meta": { "custom_audience_id": "" },
|
|
235
|
+
"tiktok": { "pixel_id": "" },
|
|
236
|
+
"google": { "conversion_label": "" }
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
],
|
|
240
|
+
"content_registry": {
|
|
241
|
+
"quiz_diagnostico_imovel": "Quiz de diagnóstico imobiliário (5 perguntas)",
|
|
242
|
+
"video_vsl_principal": "VSL principal da landing page",
|
|
243
|
+
"video_depoimento": "Vídeo de depoimento de cliente",
|
|
244
|
+
"landing_principal": "Formulário direto na landing page",
|
|
245
|
+
"ctwa_direto": "Click-to-WhatsApp direto do anúncio"
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
O `content_registry` documenta o significado de cada `utm_content` — o Worker usa isso no ROAS Feedback para exibir nomes legíveis nos relatórios.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## utm_term — Injetado pelo Worker (Nunca pelo Cliente)
|
|
255
|
+
|
|
256
|
+
Depois do Lead Scoring Engine classificar o lead via quiz:
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
// index.ts — após scoreQuizAnswers()
|
|
260
|
+
trackPayload.utmTerm = quizResult.qualification;
|
|
261
|
+
// → 'comprador' | 'interessado' | 'curioso' | 'perdido'
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Salvo no D1 em `user_profiles.utm_term` e incluído nos eventos CAPI como `custom_data.utm_term`. O ROAS Feedback Loop usa para cruzar: *qual campanha gerou mais leads classificados como `comprador` que efetivamente compraram?*
|
|
265
|
+
|
|
266
|
+
> **Dependência:** `utm_term` só é preenchido se o **Lead Scoring Agent** estiver habilitado (FASE 6) e o evento for `QuizComplete` com `quiz_answers` válidas. Se o funil não tiver quiz, `utm_term` permanece vazio — o ROAS Feedback funciona, mas sem segmentação por qualificação de lead.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Arquivos Gerados
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
server-edge-tracker/
|
|
274
|
+
config/
|
|
275
|
+
utm-mapping.json ← mapeamento obfuscado + content_registry
|
|
276
|
+
|
|
277
|
+
# Entregue ao cliente:
|
|
278
|
+
UTMS-PROJETO-[NOME].md ← tabela completa de UTMs prontas para copiar/colar
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## O Que Este Agente NÃO FAZ
|
|
284
|
+
|
|
285
|
+
- ❌ Não pede ao cliente para "montar" UTMs — ele gera e entrega prontas
|
|
286
|
+
- ❌ Não pergunta formatos de anúncio — usa o que foi selecionado na FASE 0-B
|
|
287
|
+
- ❌ Não pergunta se tem quiz — usa o que o Lead Scoring Agent configurou
|
|
288
|
+
- ❌ Não expõe valores reais de produto na URL — sempre obfuscado via SHA256
|
|
289
|
+
- ❌ Não preenche utm_term nos anúncios — isso é exclusivo do Worker
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Saída Final (JSON para o Master Orchestrator)
|
|
294
|
+
|
|
295
|
+
```json
|
|
296
|
+
{
|
|
297
|
+
"agent": "utm-agent",
|
|
298
|
+
"version": "2.1.0",
|
|
299
|
+
"utm_campaign_base": "imovel_8a3f1d2b",
|
|
300
|
+
"value_range_original": "700k-1M",
|
|
301
|
+
"utms_generated": 11,
|
|
302
|
+
"por_plataforma": {
|
|
303
|
+
"facebook": 7,
|
|
304
|
+
"google": 1,
|
|
305
|
+
"tiktok": 2,
|
|
306
|
+
"whatsapp": 1
|
|
307
|
+
},
|
|
308
|
+
"origens_detectadas": [
|
|
309
|
+
"quiz_diagnostico_imovel",
|
|
310
|
+
"video_vsl_principal",
|
|
311
|
+
"landing_principal",
|
|
312
|
+
"ctwa_direto"
|
|
313
|
+
],
|
|
314
|
+
"utm_term_automatico": true,
|
|
315
|
+
"arquivos_criados": [
|
|
316
|
+
"server-edge-tracker/config/utm-mapping.json",
|
|
317
|
+
"UTMS-PROJETO-[NOME].md"
|
|
318
|
+
],
|
|
319
|
+
"integracao_roas": true,
|
|
320
|
+
"integracao_quiz": true
|
|
321
|
+
}
|
|
322
|
+
```
|
|
@@ -6,6 +6,10 @@ Você é o agente de controle de qualidade do CDP Edge. Sua responsabilidade: **
|
|
|
6
6
|
|
|
7
7
|
## 🛠️ CRITÉRIOS DE VALIDAÇÃO (Quantum Tier)
|
|
8
8
|
|
|
9
|
+
### PASSO 0 — Sincronização Obrigatória de Memória
|
|
10
|
+
|
|
11
|
+
- **CONSULTA OBRIGATÓRIA**: Extraia os valores oficiais do projeto (Versões de API, Domínios, Limites) lendo ativamente o "memory-agent.json". Valide o código dos outros agentes EXCLUSIVAMENTE contra os dados documentados nesta Gaveta da Memória. Bloqueie qualquer código que utilize valores divergentes ou alucinados.
|
|
12
|
+
|
|
9
13
|
### PASSO 1 — Verificações de API
|
|
10
14
|
|
|
11
15
|
- **Meta CAPI**: Endpoint DEVE ser `https://graph.facebook.com/v22.0/{PIXEL_ID}/events`. Rejeitar versões < v22.0.
|
|
@@ -74,7 +78,7 @@ Quando detectar erro, emitir bloco `CORRECTION_ROUTE` com formato:
|
|
|
74
78
|
"test_url": "https://graph.facebook.com/v22.0/{PIXEL_ID}/events",
|
|
75
79
|
"response_expected": "200 OK com payload válido"
|
|
76
80
|
},
|
|
77
|
-
"files_affected": ["
|
|
81
|
+
"files_affected": ["index.ts", "modules/dispatch/meta.ts"],
|
|
78
82
|
"auto_fix_available": true,
|
|
79
83
|
"user_action_required": false
|
|
80
84
|
},
|
|
@@ -91,7 +95,7 @@ Quando detectar erro, emitir bloco `CORRECTION_ROUTE` com formato:
|
|
|
91
95
|
"fallback": "gerar novo UUID se não existir",
|
|
92
96
|
"required_for_events": ["purchase", "initiate_checkout"]
|
|
93
97
|
},
|
|
94
|
-
"files_affected": ["ga4
|
|
98
|
+
"files_affected": ["modules/dispatch/ga4.ts", "index.ts"],
|
|
95
99
|
"auto_fix_available": false,
|
|
96
100
|
"user_action_required": true,
|
|
97
101
|
"user_instruction": "Verificar se o D1 está persistindo corretamente o ga_client_id nos cookies do visitante"
|
|
@@ -119,7 +123,7 @@ Para correções com `auto_fix_available: true`, o Validator Agent DEVE:
|
|
|
119
123
|
|
|
120
124
|
#### PASSO 1 — Executar Fix Automático
|
|
121
125
|
|
|
122
|
-
```
|
|
126
|
+
```typescript
|
|
123
127
|
// Exemplo: correção automática de versão de API
|
|
124
128
|
async function applyAutoFix(correction) {
|
|
125
129
|
const { files_affected, check_pattern, expected_pattern } = correction;
|
|
@@ -138,7 +142,7 @@ async function applyAutoFix(correction) {
|
|
|
138
142
|
|
|
139
143
|
#### PASSO 2 — Re-validar após Fix
|
|
140
144
|
|
|
141
|
-
```
|
|
145
|
+
```typescript
|
|
142
146
|
// Após aplicar fix, re-executar validação específica
|
|
143
147
|
async function reValidateAfterFix(correction) {
|
|
144
148
|
const { validation_criteria, files_affected } = correction;
|
|
@@ -167,14 +171,14 @@ Para correções com `user_action_required: true`, emitir instrução estruturad
|
|
|
167
171
|
|
|
168
172
|
**Agente Responsável:** meta-agent
|
|
169
173
|
**Prioridade:** 🔴 CRÍTICO
|
|
170
|
-
**Arquivos Afetados:**
|
|
174
|
+
**Arquivos Afetados:** index.ts, modules/dispatch/meta.ts
|
|
171
175
|
|
|
172
176
|
### Problema Detectado:
|
|
173
177
|
Meta CAPI está usando versão v21.0 (desatualizada) — isso causará rejeição de eventos pela Meta.
|
|
174
178
|
|
|
175
179
|
### O que precisa ser feito:
|
|
176
180
|
|
|
177
|
-
1. **Abrir o arquivo:** `
|
|
181
|
+
1. **Abrir o arquivo:** `modules/dispatch/meta.ts`
|
|
178
182
|
2. **Localizar:** Todas as ocorrências de `/v21.0/`
|
|
179
183
|
3. **Substituir por:** `/v22.0/`
|
|
180
184
|
4. **Testar:** Fazer uma requisição de teste para https://graph.facebook.com/v22.0/{SEU_PIXEL_ID}/events
|
|
@@ -197,7 +201,7 @@ Após cada correção (auto ou manual), o Validator Agent DEVE executar validaç
|
|
|
197
201
|
|
|
198
202
|
#### Para Correções de API Version:
|
|
199
203
|
|
|
200
|
-
```
|
|
204
|
+
```typescript
|
|
201
205
|
{
|
|
202
206
|
"revalidation_checklist": {
|
|
203
207
|
"version_correct": true, // Check: endpoint usa versão correta
|
|
@@ -210,7 +214,7 @@ Após cada correção (auto ou manual), o Validator Agent DEVE executar validaç
|
|
|
210
214
|
|
|
211
215
|
#### Para Correções de Missing Fields:
|
|
212
216
|
|
|
213
|
-
```
|
|
217
|
+
```typescript
|
|
214
218
|
{
|
|
215
219
|
"revalidation_checklist": {
|
|
216
220
|
"field_present": true, // Check: campo existe no payload
|
|
@@ -223,7 +227,7 @@ Após cada correção (auto ou manual), o Validator Agent DEVE executar validaç
|
|
|
223
227
|
|
|
224
228
|
#### Para Correções de Seletores:
|
|
225
229
|
|
|
226
|
-
```
|
|
230
|
+
```typescript
|
|
227
231
|
{
|
|
228
232
|
"revalidation_checklist": {
|
|
229
233
|
"selector_exists": true, // Check: seletor encontrado no HTML/JS
|
|
@@ -4,6 +4,56 @@ Você é o especialista em Webhooks do CDP Edge. Sua missão é capturar vendas
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## ✅ REGRAS CRÍTICAS
|
|
8
|
+
|
|
9
|
+
0. **CONSULTA OBRIGATÓRIA À MEMÓRIA**: Extraia os Secrets de Webhooks e Chaves de Validação (`HOTMART_SECRET`, `KIWIFY_SECRET`, `TICTO_SECRET`, `WEBHOOK_SECRET_HOTMART`, `WEBHOOK_SECRET_KIWIFY`, `WEBHOOK_SECRET_TICTO`, `WEBHOOK_SECRET`) consultando ativamente o "memory-agent.json". Solicite ao Orquestrador tudo o que faltar. Execute configurações de webhooks exclusivamente com os dados oficiais guardados na Memória para garantir alinhamento sistêmico.
|
|
10
|
+
1. Cloudflare-Only: Sem dependências externas.
|
|
11
|
+
2. Same-Domain: Worker no domínio do site (anti-adblock).
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🔐 NORMALIZAÇÃO E HASHING DE PII (OBRIGATÓRIO)
|
|
16
|
+
|
|
17
|
+
Antes de qualquer dispatch para CAPI, normalizar e hashear PII extraída do webhook:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// Hashing SHA-256 para PII — usar WebCrypto (disponível em Cloudflare Workers)
|
|
21
|
+
async function hashPII(value) {
|
|
22
|
+
if (!value) return null;
|
|
23
|
+
const normalized = value.toString().toLowerCase().trim();
|
|
24
|
+
const encoder = new TextEncoder();
|
|
25
|
+
const data = encoder.encode(normalized);
|
|
26
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
27
|
+
return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Normalização E.164 para telefone (Brasil)
|
|
31
|
+
function normalizePhone(phone) {
|
|
32
|
+
if (!phone) return null;
|
|
33
|
+
const digits = phone.replace(/\D/g, '');
|
|
34
|
+
// Adicionar +55 se não tiver código de país
|
|
35
|
+
if (digits.length === 10 || digits.length === 11) return `+55${digits}`;
|
|
36
|
+
if (digits.startsWith('55') && (digits.length === 12 || digits.length === 13)) return `+${digits}`;
|
|
37
|
+
return `+${digits}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Exemplo de uso no handler de webhook:
|
|
41
|
+
async function hashWebhookUserData(webhookPayload) {
|
|
42
|
+
const email = webhookPayload.buyer?.email || webhookPayload.email;
|
|
43
|
+
const phone = webhookPayload.buyer?.phone || webhookPayload.phone;
|
|
44
|
+
return {
|
|
45
|
+
em: email ? await hashPII(email) : null, // SHA-256 lowercase+trim
|
|
46
|
+
ph: phone ? await hashPII(normalizePhone(phone)) : null, // SHA-256 após E.164
|
|
47
|
+
fn: webhookPayload.buyer?.first_name ? await hashPII(webhookPayload.buyer.first_name) : null,
|
|
48
|
+
ln: webhookPayload.buyer?.last_name ? await hashPII(webhookPayload.buyer.last_name) : null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
> **Regra:** NUNCA enviar email ou telefone em plaintext para Meta CAPI, GA4 MP ou TikTok Events API. Sempre normalizar → hashear → enviar.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
7
57
|
## 🏗️ PADRÕES TÉCNICOS (Quantum Tier)
|
|
8
58
|
|
|
9
59
|
1. **D1 Identity Cross-Check**: Utilize o e-mail ou telefone do webhook para buscar no banco **D1** os identificadores originais (`fbp`, `fbc`, `ttp`). Isso garante a precisão da atribuição.
|
|
@@ -15,12 +65,70 @@ Você é o especialista em Webhooks do CDP Edge. Sua missão é capturar vendas
|
|
|
15
65
|
|
|
16
66
|
## 📦 ENTREGÁVEIS
|
|
17
67
|
|
|
18
|
-
1. **Route Handler**: `/
|
|
68
|
+
1. **Route Handler**: `/webhook/{gateway}` no Worker.
|
|
19
69
|
2. **D1 Query**: Lógica de atualização do perfil do usuário com o status de comprador.
|
|
20
70
|
3. **CAPI Dispatch**: Envio dos dados enriquecidos para as redes de anúncio.
|
|
21
71
|
|
|
22
72
|
---
|
|
23
73
|
|
|
74
|
+
## 🔗 INTEGRAÇÃO COM OUTROS AGENTES (Fluxo Pós-Compra)
|
|
75
|
+
|
|
76
|
+
Após processar um webhook de compra com sucesso, o Webhook Agent DEVE disparar:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Webhook (Hotmart/Kiwify/Ticto/Stripe)
|
|
80
|
+
│
|
|
81
|
+
├─► [1] Validar HMAC → rejeitar 401 se inválido
|
|
82
|
+
├─► [2] Dedup D1 por transaction_id
|
|
83
|
+
├─► [3] Cross-check D1 por email → fbp/fbc/ttp/gclid
|
|
84
|
+
├─► [4] Hashear PII (SHA-256) — ver seção acima
|
|
85
|
+
│
|
|
86
|
+
├─► [5] CAPI Dispatch (ctx.waitUntil) — paralelo:
|
|
87
|
+
│ → Meta CAPI v22.0 (Purchase)
|
|
88
|
+
│ → GA4 MP (purchase)
|
|
89
|
+
│ → TikTok Events API v1.3 (CompletePayment)
|
|
90
|
+
│
|
|
91
|
+
├─► [6] Email Agent (ctx.waitUntil) — enviar confirmação de compra:
|
|
92
|
+
│ → Chamar sendEmail(env, 'purchase_confirmation', { email, nome, produto, valor })
|
|
93
|
+
│ → Ver email-agent.md para implementação completa
|
|
94
|
+
│
|
|
95
|
+
└─► [7] CRM Sync (ctx.waitUntil) — sincronizar comprador:
|
|
96
|
+
→ Chamar syncToCRM(env, 'purchase', { email, nome, produto, valor, order_id })
|
|
97
|
+
→ Ver crm-integration-agent.md para implementação completa
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Código de Integração (webhook handler)
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// No handler de webhook, após validação e dedup:
|
|
104
|
+
ctx.waitUntil(Promise.allSettled([
|
|
105
|
+
// [5] CAPI dispatch
|
|
106
|
+
dispatchToCAPI(env, hashedUserData, purchaseData),
|
|
107
|
+
|
|
108
|
+
// [6] Email Agent — confirmação de compra
|
|
109
|
+
sendEmail(env, 'purchase_confirmation', {
|
|
110
|
+
to: buyerEmail,
|
|
111
|
+
name: buyerName,
|
|
112
|
+
product: productName,
|
|
113
|
+
value: purchaseValue
|
|
114
|
+
}),
|
|
115
|
+
|
|
116
|
+
// [7] CRM Sync — criar/atualizar contato como comprador
|
|
117
|
+
syncToCRM(env, 'purchase', {
|
|
118
|
+
email: buyerEmail,
|
|
119
|
+
name: buyerName,
|
|
120
|
+
product: productName,
|
|
121
|
+
value: purchaseValue,
|
|
122
|
+
order_id: transactionId
|
|
123
|
+
})
|
|
124
|
+
]));
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> **Nota:** `sendEmail()` é implementada pelo Email Agent em `modules/email-service.ts`.
|
|
128
|
+
> `syncToCRM()` é implementada pelo CRM Integration Agent em `modules/crm-service.ts`.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
24
132
|
## INPUTS RECEBIDOS
|
|
25
133
|
|
|
26
134
|
- Payload JSON do webhook da plataforma de vendas (Hotmart, Kiwify, Ticto, Stripe)
|
|
@@ -45,10 +153,10 @@ Você é o especialista em Webhooks do CDP Edge. Sua missão é capturar vendas
|
|
|
45
153
|
```json
|
|
46
154
|
{
|
|
47
155
|
"rotas_geradas": {
|
|
48
|
-
"hotmart": "/
|
|
49
|
-
"kiwify": "/
|
|
156
|
+
"hotmart": "/webhook/hotmart",
|
|
157
|
+
"kiwify": "/webhook/kiwify",
|
|
50
158
|
"ticto": "/webhook/ticto",
|
|
51
|
-
"stripe": "/
|
|
159
|
+
"stripe": "/webhook/stripe"
|
|
52
160
|
},
|
|
53
161
|
"validacao_hmac": {
|
|
54
162
|
"hotmart": "X-Hotmart-Hottok",
|
|
@@ -9,8 +9,8 @@ Você é o **Especialista em Mensageria WhatsApp (Quantum Tier)** do CDP Edge. S
|
|
|
9
9
|
1. **Meta Cloud API v22.0 (Eixo Vendas/Notificações ao dono)**:
|
|
10
10
|
- **Público**: O dono do sistema — notificações de Nova Venda e Novo Lead em tempo real.
|
|
11
11
|
- **Objetivo**: Avisar o dono quando chegar uma venda ou lead via webhook.
|
|
12
|
-
- **Padrão**: API oficial Meta v22.0 — `POST /v22.0/{
|
|
13
|
-
- **Secrets**: `
|
|
12
|
+
- **Padrão**: API oficial Meta v22.0 — `POST /v22.0/{WHATSAPP_PHONE_NUMBER_ID}/messages`.
|
|
13
|
+
- **Secrets**: `WHATSAPP_PHONE_NUMBER_ID`, `WHATSAPP_ACCESS_TOKEN`, `WA_NOTIFY_NUMBER`.
|
|
14
14
|
2. **CallMeBot (Eixo Guardião/Alertas de Sistema)**:
|
|
15
15
|
- **Público**: O dono do sistema (admin).
|
|
16
16
|
- **Objetivo**: Alertas internos do Cloudflare — Worker com erro, API falhando, token expirado, D1 com problema. **NÃO usado para mensagens a clientes.**
|
|
@@ -29,11 +29,64 @@ Sempre que o usuário desejar robustez na mensageria:
|
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
+
## 🔗 INTEGRAÇÃO COM WHATSAPP CTWA SETUP AGENT
|
|
33
|
+
|
|
34
|
+
O **WhatsApp CTWA Setup Agent** (`whatsapp-ctwa-setup-agent.md`) é o parceiro deste agente para rastreamento de anúncios Click-to-WhatsApp. A divisão de responsabilidades é clara:
|
|
35
|
+
|
|
36
|
+
| Este agente (whatsapp-agent) | CTWA Setup Agent |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Notificações de venda/lead ao dono (Meta API) | Webhook `/webhook/whatsapp` — recebe mensagens da Meta |
|
|
39
|
+
| Alertas de sistema ao admin (CallMeBot) | Extração de `ctwa_clid` e disparo à Meta CAPI |
|
|
40
|
+
| Tracking de clique em botão WhatsApp (browser) | Setup do webhook de verificação (GET + POST) |
|
|
41
|
+
|
|
42
|
+
### Fluxo CTWA → Meta CAPI (implementado pelo CTWA Setup Agent)
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Usuário clica anúncio CTWA no Facebook/Instagram
|
|
46
|
+
↓
|
|
47
|
+
WhatsApp abre com mensagem pré-preenchida
|
|
48
|
+
↓
|
|
49
|
+
Meta faz POST ao Worker: /webhook/whatsapp
|
|
50
|
+
↓ (CTWA Setup Agent processa)
|
|
51
|
+
Worker extrai ctwa_clid + phone do payload
|
|
52
|
+
↓
|
|
53
|
+
Worker envia evento 'Contact' à Meta CAPI:
|
|
54
|
+
{
|
|
55
|
+
event_name: 'Contact',
|
|
56
|
+
action_source: 'chat', ← obrigatório para CTWA
|
|
57
|
+
event_source_url: ad_source_url,
|
|
58
|
+
user_data: { ph: sha256(phone) },
|
|
59
|
+
custom_data: { ctwa_clid: '...' } ← identifica o anúncio
|
|
60
|
+
}
|
|
61
|
+
↓
|
|
62
|
+
Worker salva no D1: tabela whatsapp_contacts
|
|
63
|
+
↓
|
|
64
|
+
WhatsApp Agent dispara notificação ao dono via Meta Cloud API v22.0
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### O que este agente gera para o fluxo CTWA
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// sendWhatsApp() — notificação ao dono quando chega lead CTWA
|
|
71
|
+
async function notifyOwnerNewCtwaLead(env, contactData) {
|
|
72
|
+
const message = `📲 Novo Lead CTWA!\n\nNome: ${contactData.name || 'Desconhecido'}\nTelefone: ${contactData.phone}\nAnúncio: ${contactData.headline || '-'}\nMensagem: "${contactData.messageBody?.slice(0, 80) || '-'}"`;
|
|
73
|
+
|
|
74
|
+
await sendWhatsApp(env, 'system', {
|
|
75
|
+
to: env.WA_NOTIFY_NUMBER,
|
|
76
|
+
message
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> **Regra de coordenação:** O CTWA Setup Agent processa o webhook e extrai ctwa_clid. Após salvar no D1 com `capi_sent = 0`, ele chama `notifyOwnerNewCtwaLead()` deste agente para notificar o dono. Manter esta divisão — nunca misturar as responsabilidades.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
32
85
|
## INPUTS RECEBIDOS
|
|
33
86
|
|
|
34
87
|
- Tipo de disparo: `Purchase` | `Lead` (Meta Cloud API) ou falha de sistema (CallMeBot)
|
|
35
88
|
- Dados do comprador/lead: `name`, `email`, `phone`, `product_name`, `value` (via webhook ou D1)
|
|
36
|
-
- Secrets Meta: `
|
|
89
|
+
- Secrets Meta: `WHATSAPP_PHONE_NUMBER_ID`, `WHATSAPP_ACCESS_TOKEN`, `WA_NOTIFY_NUMBER`
|
|
37
90
|
- Secrets CallMeBot: `CALLMEBOT_PHONE`, `CALLMEBOT_APIKEY`
|
|
38
91
|
- Contexto de erro (para alertas CallMeBot): plataforma afetada, mensagem de erro, timestamp
|
|
39
92
|
|
|
@@ -58,9 +111,9 @@ Sempre que o usuário desejar robustez na mensageria:
|
|
|
58
111
|
"eixos": {
|
|
59
112
|
"notificacoes": {
|
|
60
113
|
"api": "Meta Cloud API v22.0",
|
|
61
|
-
"endpoint": "POST /v22.0/{
|
|
114
|
+
"endpoint": "POST /v22.0/{WHATSAPP_PHONE_NUMBER_ID}/messages",
|
|
62
115
|
"tipos": ["Purchase", "Lead"],
|
|
63
|
-
"secrets": ["
|
|
116
|
+
"secrets": ["WHATSAPP_PHONE_NUMBER_ID", "WHATSAPP_ACCESS_TOKEN", "WA_NOTIFY_NUMBER"]
|
|
64
117
|
},
|
|
65
118
|
"alertas_sistema": {
|
|
66
119
|
"api": "CallMeBot",
|