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.
Files changed (141) hide show
  1. package/README.md +153 -306
  2. package/bin/cdp-edge.js +71 -61
  3. package/contracts/agent-versions.json +682 -0
  4. package/contracts/api-versions.json +372 -368
  5. package/contracts/types.ts +81 -0
  6. package/dist/commands/analyze.js +52 -52
  7. package/dist/commands/infra.js +54 -54
  8. package/dist/commands/install.js +26 -3
  9. package/dist/commands/server.js +174 -174
  10. package/dist/commands/setup.js +332 -100
  11. package/dist/commands/validate.js +248 -84
  12. package/dist/index.js +12 -12
  13. package/dist/sdk/cdpTrack.js +2095 -0
  14. package/dist/sdk/cdpTrack.min.js +64 -0
  15. package/dist/sdk/install-snippet.html +10 -0
  16. package/docs/whatsapp-ctwa.md +5 -4
  17. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +89 -0
  18. package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +101 -0
  19. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -364
  20. package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
  21. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
  22. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +41 -41
  23. package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
  24. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +40 -50
  25. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +174 -74
  26. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
  27. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +25 -5
  28. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +10 -10
  29. package/extracted-skill/tracking-events-generator/agents/database-agent.md +43 -42
  30. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +22 -22
  31. package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
  32. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +23 -9
  33. package/extracted-skill/tracking-events-generator/agents/email-agent.md +28 -1
  34. package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +253 -0
  35. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +206 -1
  36. package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
  37. package/extracted-skill/tracking-events-generator/agents/google-agent.md +128 -2
  38. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +191 -31
  39. package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
  40. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +145 -34
  41. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
  42. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +24 -5
  43. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
  44. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +588 -93
  45. package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
  46. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +190 -15
  47. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +10 -2
  48. package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +769 -0
  49. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +21 -4
  50. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +41 -31
  51. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +18 -8
  52. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +14 -6
  53. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +7 -7
  54. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +16 -8
  55. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +15 -7
  56. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +157 -48
  57. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +35 -35
  58. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +15 -7
  59. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +73 -2
  60. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +104 -9
  61. package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
  62. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +13 -9
  63. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +112 -4
  64. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +58 -5
  65. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +26 -18
  66. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +152 -37
  67. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -285
  68. package/extracted-skill/tracking-events-generator/cdpTrack.js +642 -641
  69. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +14 -10
  70. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -226
  71. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -235
  72. package/extracted-skill/tracking-events-generator/integration-test.js +497 -497
  73. package/extracted-skill/tracking-events-generator/knowledge-base.md +172 -0
  74. package/extracted-skill/tracking-events-generator/micro-events.js +992 -992
  75. package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
  76. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -144
  77. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -48
  78. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -28
  79. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
  80. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -205
  81. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -56
  82. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -19
  83. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -425
  84. package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
  85. package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
  86. package/package.json +89 -75
  87. package/scripts/build-sdk.js +106 -0
  88. package/server-edge-tracker/.client.env.example +14 -0
  89. package/server-edge-tracker/INSTALAR.md +222 -23
  90. package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
  91. package/server-edge-tracker/config/utm-mapping.json +64 -0
  92. package/server-edge-tracker/deploy-client.cjs +76 -0
  93. package/server-edge-tracker/index.ts +1230 -0
  94. package/server-edge-tracker/migrate-v7.sql +64 -0
  95. package/server-edge-tracker/modules/db.ts +710 -0
  96. package/server-edge-tracker/modules/dispatch/crm.ts +382 -0
  97. package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
  98. package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
  99. package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
  100. package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
  101. package/server-edge-tracker/modules/dispatch/whatsapp.ts +296 -0
  102. package/server-edge-tracker/modules/intelligence.ts +589 -0
  103. package/server-edge-tracker/modules/ml/bidding.ts +247 -0
  104. package/server-edge-tracker/modules/ml/fraud.ts +302 -0
  105. package/server-edge-tracker/modules/ml/logistic.ts +226 -0
  106. package/server-edge-tracker/modules/ml/ltv.ts +531 -0
  107. package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
  108. package/server-edge-tracker/modules/ml/quiz.ts +343 -0
  109. package/server-edge-tracker/modules/ml/roas.ts +255 -0
  110. package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
  111. package/server-edge-tracker/modules/nurture.ts +257 -0
  112. package/server-edge-tracker/modules/utils.ts +311 -0
  113. package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -0
  114. package/server-edge-tracker/schema-ab-ltv.sql +97 -0
  115. package/server-edge-tracker/schema-bidding.sql +86 -0
  116. package/server-edge-tracker/schema-fraud.sql +90 -0
  117. package/server-edge-tracker/schema-indexes.sql +67 -0
  118. package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
  119. package/server-edge-tracker/schema-quiz.sql +52 -0
  120. package/server-edge-tracker/schema-sales-engine.sql +113 -0
  121. package/server-edge-tracker/schema-segmentation.sql +219 -0
  122. package/server-edge-tracker/schema-utm.sql +82 -0
  123. package/server-edge-tracker/schema.sql +281 -265
  124. package/server-edge-tracker/types.ts +275 -0
  125. package/server-edge-tracker/wrangler.toml +140 -85
  126. package/templates/lancamento-imobiliario.md +344 -0
  127. package/templates/multi-step-checkout.md +3 -4
  128. package/templates/pinterest/conversions-api-template.js +144 -144
  129. package/templates/pinterest/event-mappings.json +48 -48
  130. package/templates/pinterest/tag-template.js +28 -28
  131. package/templates/quiz-funnel.md +83 -19
  132. package/templates/reddit/conversions-api-template.js +205 -205
  133. package/templates/reddit/event-mappings.json +56 -56
  134. package/templates/reddit/pixel-template.js +12 -39
  135. package/templates/scenarios/behavior-engine.js +45 -22
  136. package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
  137. package/docs/installation.md +0 -155
  138. package/docs/quick-start.md +0 -185
  139. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +0 -1419
  140. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -643
  141. 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": ["worker.js", "meta-capi-dispatcher.js"],
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-dispatcher.js", "worker.js"],
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
- ```javascript
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
- ```javascript
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:** worker.js, meta-capi-dispatcher.js
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:** `worker.js`
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
- ```javascript
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
- ```javascript
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
- ```javascript
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**: `/api/wh/{gateway}` no Worker.
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": "/api/wh/hotmart",
49
- "kiwify": "/api/wh/kiwify",
156
+ "hotmart": "/webhook/hotmart",
157
+ "kiwify": "/webhook/kiwify",
50
158
  "ticto": "/webhook/ticto",
51
- "stripe": "/api/wh/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/{WA_PHONE_ID}/messages`.
13
- - **Secrets**: `WA_PHONE_ID`, `WA_ACCESS_TOKEN`, `WA_NOTIFY_NUMBER`.
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: `WA_PHONE_ID`, `WA_ACCESS_TOKEN`, `WA_NOTIFY_NUMBER`
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/{WA_PHONE_ID}/messages",
114
+ "endpoint": "POST /v22.0/{WHATSAPP_PHONE_NUMBER_ID}/messages",
62
115
  "tipos": ["Purchase", "Lead"],
63
- "secrets": ["WA_PHONE_ID", "WA_ACCESS_TOKEN", "WA_NOTIFY_NUMBER"]
116
+ "secrets": ["WHATSAPP_PHONE_NUMBER_ID", "WHATSAPP_ACCESS_TOKEN", "WA_NOTIFY_NUMBER"]
64
117
  },
65
118
  "alertas_sistema": {
66
119
  "api": "CallMeBot",