cdp-edge 1.2.2 → 1.3.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 +244 -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 +5 -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 +313 -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 +749 -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,513 @@
1
+ # API de Segmentação Dinâmica ML — Documentação Completa
2
+
3
+ ## Visão Geral
4
+
5
+ API REST para segmentação dinâmica de leads via Machine Learning (K-means, DBSCAN, Hierarchical).
6
+
7
+ ---
8
+
9
+ ## Endpoints Disponíveis
10
+
11
+ | Método | Endpoint | Descrição |
12
+ |---|---|---|
13
+ | **POST** | `/api/segmentation/cluster` | Executar clustering K-means |
14
+ | **GET** | `/api/segmentation/list` | Listar todos os segmentos ativos |
15
+ | **GET** | `/api/segmentation/outliers` | Listar leads anômalos (outliers) |
16
+ | **PUT** | `/api/segmentation/update` | Atualizar recomendações de segmento |
17
+
18
+ ---
19
+
20
+ ## 1. POST /api/segmentation/cluster — Executar Clustering
21
+
22
+ Executa clustering K-means via Workers AI para criar segmentos de leads.
23
+
24
+ ### Request Body
25
+
26
+ ```json
27
+ {
28
+ "algorithm": "kmeans", // Opcional: 'kmeans', 'dbscan', 'hierarchical'
29
+ "n_clusters": 5, // Opcional: 3-10 (padrão: 5)
30
+ "vertical": "curso-online", // Opcional: vertical do cliente
31
+ "force": false // Opcional: forçar novo clustering
32
+ }
33
+ ```
34
+
35
+ ### Response
36
+
37
+ ```json
38
+ {
39
+ "success": true,
40
+ "cluster_id": 123,
41
+ "clustering_algorithm": "kmeans",
42
+ "n_clusters": 5,
43
+ "client_vertical": "curso-online",
44
+ "duration_ms": 12543,
45
+ "clusters": [
46
+ {
47
+ "cluster_id": 0,
48
+ "name": "Segmento 0 - Alto Valor + Alto Engajamento (SP)",
49
+ "size": 95,
50
+ "percentage": 0.25,
51
+ "characteristics": {
52
+ "avg_ltv": 497.50,
53
+ "avg_ltv_class": "High",
54
+ "avg_behavior_score": 75.3,
55
+ "avg_engagement_score": 82.1,
56
+ "avg_intention_level": 85.0,
57
+ "dominant_countries": ["BR", "AR"],
58
+ "dominant_states": ["SP", "RJ"],
59
+ "dominant_utm_sources": ["facebook", "google"],
60
+ "top_features": ["ltv", "behavior_score", "engagement_score"]
61
+ },
62
+ "centroid": {
63
+ "ltv_class": 0.75,
64
+ "behavior_score": 0.80,
65
+ "engagement_score": 0.85
66
+ },
67
+ "sample_leads": ["lead_451", "lead_892", "lead_1034"]
68
+ }
69
+ ],
70
+ "silhouette_scores": {
71
+ "overall": 0.62,
72
+ "by_cluster": [0.71, 0.58, 0.65, 0.60, 0.55]
73
+ },
74
+ "convergence": {
75
+ "iterations": 47,
76
+ "final_inertia": 1523.45
77
+ },
78
+ "generated_at": "2026-04-09T18:45:32.000Z"
79
+ }
80
+ ```
81
+
82
+ ### Exemplo de Uso (cURL)
83
+
84
+ ```bash
85
+ curl -X POST "https://seudominio.com/api/segmentation/cluster" \
86
+ -H "Content-Type: application/json" \
87
+ -d '{
88
+ "algorithm": "kmeans",
89
+ "n_clusters": 5,
90
+ "vertical": "curso-online"
91
+ }'
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 2. GET /api/segmentation/list — Listar Segmentos
97
+
98
+ Lista todos os segmentos ativos com estatísticas detalhadas.
99
+
100
+ ### Query Parameters
101
+
102
+ | Parâmetro | Tipo | Descrição |
103
+ |---|---|---|
104
+ | `algorithm` | string | Filtro por algoritmo: `kmeans`, `dbscan`, `hierarchical` |
105
+ | `active` | boolean | Filtro por status: `1` (ativo) ou `0` (arquivado) |
106
+ | `limit` | number | Máximo de resultados (padrão: 10) |
107
+
108
+ ### Exemplo de Request
109
+
110
+ ```bash
111
+ curl "https://seudominio.com/api/segmentation/list?algorithm=kmeans&active=1&limit=10"
112
+ ```
113
+
114
+ ### Response
115
+
116
+ ```json
117
+ {
118
+ "success": true,
119
+ "count": 5,
120
+ "segments": [
121
+ {
122
+ "id": 45,
123
+ "cluster_id": 123,
124
+ "cluster_name": "Segmento 0 - Alto Valor + Alto Engajamento (SP)",
125
+ "clustering_algorithm": "kmeans",
126
+ "client_vertical": "curso-online",
127
+ "size": 95,
128
+ "percentage": 0.25,
129
+ "avg_ltv": 497.50,
130
+ "avg_ltv_class": "High",
131
+ "avg_behavior_score": 75.3,
132
+ "avg_engagement_score": 82.1,
133
+ "avg_intention_level": 85.0,
134
+ "dominant_countries": ["BR", "AR"],
135
+ "dominant_states": ["SP", "RJ"],
136
+ "dominant_features": ["ltv", "behavior_score", "engagement_score"],
137
+ "silhouette_score": 0.71,
138
+ "action_recommendations": [
139
+ "Priorizar remarketing em 24h",
140
+ "Criar lookalike audience de alto valor"
141
+ ],
142
+ "bid_recommendations": [
143
+ {"adset_id": "456", "recommended_bid": "R$ 18.50", "confidence": 0.85}
144
+ ],
145
+ "campaign_recommendations": [
146
+ {"creative": "VSL A", "audience": "Segmento 0"},
147
+ {"creative": "VSL B", "audience": "Segmento 0"}
148
+ ],
149
+ "is_active": true,
150
+ "created_at": "2026-04-09T18:45:32.000Z",
151
+ "updated_at": "2026-04-09T18:45:32.000Z"
152
+ }
153
+ ]
154
+ }
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 3. GET /api/segmentation/outliers — Listar Anomalias
160
+
161
+ Lista leads considerados outliers/anomalias (detecção DBSCAN).
162
+
163
+ ### Query Parameters
164
+
165
+ | Parâmetro | Tipo | Descrição |
166
+ |---|---|---|
167
+ | `confidence` | number | Threshold de confiança (padrão: 0.5) |
168
+ | `risk` | string | Filtro por nível: `high`, `medium`, `low` |
169
+ | `limit` | number | Máximo de resultados (padrão: 50) |
170
+
171
+ ### Exemplo de Request
172
+
173
+ ```bash
174
+ curl "https://seudominio.com/api/segmentation/outliers?confidence=0.3&risk=high&limit=20"
175
+ ```
176
+
177
+ ### Response
178
+
179
+ ```json
180
+ {
181
+ "success": true,
182
+ "outliers": [
183
+ {
184
+ "lead_id": "lead_451",
185
+ "email": "suspicious@example.com",
186
+ "first_name": "João",
187
+ "last_name": "Silva",
188
+ "ltv_class": "High",
189
+ "behavior_score": 98,
190
+ "engagement_score": 85,
191
+ "intention_level": 90,
192
+ "days_since_lead": 0,
193
+ "cluster_id": null,
194
+ "cluster_name": "Outlier",
195
+ "confidence": 0.12,
196
+ "distance_to_centroid": 0.89,
197
+ "is_outlier": true,
198
+ "outlier_reason": "behavior_score too high (> 95), instant lead, suspicious",
199
+ "risk_level": "high",
200
+ "risk_score": 88,
201
+ "should_block": true,
202
+ "actionable_reasons": [
203
+ "Comportamento extremamente ativo (possível bot)",
204
+ "Lead instantâneo com engajamento muito alto (suspicious)"
205
+ ],
206
+ "assigned_at": "2026-04-09T18:47:15.000Z"
207
+ }
208
+ ],
209
+ "statistics": {
210
+ "total_outliers": 20,
211
+ "by_risk_level": {
212
+ "high": 15,
213
+ "medium": 3,
214
+ "low": 2
215
+ },
216
+ "by_reason": {
217
+ "behavior_score too high (> 95)": 12,
218
+ "instant lead": 8,
219
+ "unusual geo": 0
220
+ },
221
+ "avg_confidence": 0.18
222
+ },
223
+ "generated_at": "2026-04-09T18:47:15.000Z"
224
+ }
225
+ ```
226
+
227
+ ---
228
+
229
+ ## 4. PUT /api/segmentation/update — Atualizar Segmento
230
+
231
+ Atualiza recomendações de ações, bids e campanhas de um segmento existente.
232
+
233
+ ### Request Body
234
+
235
+ ```json
236
+ {
237
+ "cluster_id": 45,
238
+ "action_recommendations": [
239
+ "Priorizar remarketing em 24h",
240
+ "Criar lookalike audience de alto valor",
241
+ "Enrichir creative com copy específico"
242
+ ],
243
+ "bid_recommendations": [
244
+ {"adset_id": "456", "recommended_bid": "R$ 20.00"},
245
+ {"adset_id": "789", "recommended_bid": "R$ 18.50"}
246
+ ],
247
+ "campaign_recommendations": [
248
+ {"creative": "VSL Segmentado", "audience": "Segmento 0"}
249
+ ],
250
+ "is_active": true
251
+ }
252
+ ```
253
+
254
+ ### Response
255
+
256
+ ```json
257
+ {
258
+ "success": true,
259
+ "cluster_id": 45,
260
+ "cluster_name": "Segmento 0 - Alto Valor + Alto Engajamento (SP)",
261
+ "updates_applied": {
262
+ "action_recommendations": 3,
263
+ "bid_recommendations": 2,
264
+ "campaign_recommendations": 1,
265
+ "is_active": true
266
+ },
267
+ "updated_at": "2026-04-09T18:50:23.000Z"
268
+ }
269
+ ```
270
+
271
+ ---
272
+
273
+ ## Estrutura das Tabelas D1
274
+
275
+ ### ml_segments — Metadados dos Segmentos
276
+
277
+ ```sql
278
+ CREATE TABLE ml_segments (
279
+ id INTEGER PRIMARY KEY,
280
+ cluster_id INTEGER NOT NULL,
281
+ cluster_name TEXT NOT NULL,
282
+ clustering_algorithm TEXT NOT NULL, -- 'kmeans', 'dbscan', 'hierarchical'
283
+ client_vertical TEXT,
284
+ created_at TEXT,
285
+ updated_at TEXT,
286
+
287
+ -- Estatísticas
288
+ size INTEGER, -- Nº de leads
289
+ percentage REAL, -- % do total
290
+
291
+ -- Centróides (médias)
292
+ avg_ltv REAL,
293
+ avg_ltv_class REAL,
294
+ avg_behavior_score REAL,
295
+ avg_engagement_score REAL,
296
+ avg_intention_level REAL,
297
+
298
+ -- Características dominantes
299
+ dominant_countries TEXT, -- JSON: ["BR", "US"]
300
+ dominant_states TEXT, -- JSON: ["SP", "RJ"]
301
+ dominant_cities TEXT, -- JSON: ["São Paulo", "Rio"]
302
+ dominant_timezones TEXT, -- JSON: ["America/Sao_Paulo"]
303
+ dominant_utm_sources TEXT, -- JSON: ["facebook", "google"]
304
+ dominant_features TEXT, -- JSON: ["ltv", "behavior_score"]
305
+
306
+ -- Métricas de qualidade
307
+ silhouette_score REAL, -- 0-1 (quanto maior, melhor)
308
+ cohesion REAL, -- Similaridade intra-cluster
309
+ separation REAL, -- Distância inter-cluster
310
+ inertia REAL, -- Soma dos quadrados
311
+
312
+ -- Recomendações automáticas
313
+ action_recommendations TEXT, -- JSON array
314
+ bid_recommendations TEXT, -- JSON array
315
+ campaign_recommendations TEXT, -- JSON array
316
+
317
+ -- Metadados
318
+ is_active INTEGER DEFAULT 1,
319
+ min_data_points INTEGER,
320
+ epsilon REAL, -- DBSCAN
321
+ min_samples INTEGER, -- DBSCAN
322
+ max_depth INTEGER -- Hierarchical
323
+ );
324
+ ```
325
+
326
+ ### ml_segment_members — Associação Lead ↔ Segmento
327
+
328
+ ```sql
329
+ CREATE TABLE ml_segment_members (
330
+ id INTEGER PRIMARY KEY,
331
+ lead_id TEXT NOT NULL,
332
+ cluster_id INTEGER NOT NULL,
333
+ clustering_algorithm TEXT NOT NULL,
334
+ confidence REAL NOT NULL, -- 0-1 (quão perto do centroide)
335
+ distance_to_centroid REAL,
336
+ updated_at TEXT,
337
+ assigned_at TEXT,
338
+ is_outlier INTEGER DEFAULT 0,
339
+ outlier_reason TEXT,
340
+
341
+ -- Estado do lead no momento da atribuição
342
+ lead_ltv REAL,
343
+ lead_ltv_class REAL,
344
+ lead_behavior_score REAL,
345
+ lead_engagement_score REAL,
346
+ lead_intention_level REAL,
347
+
348
+ -- Características
349
+ lead_country TEXT,
350
+ lead_state TEXT,
351
+ lead_city TEXT,
352
+
353
+ UNIQUE(lead_id, cluster_id, clustering_algorithm)
354
+ );
355
+ ```
356
+
357
+ ---
358
+
359
+ ## Integração com Outros Agentes
360
+
361
+ ### Com LTV Predictor Agent
362
+
363
+ ```typescript
364
+ // Enricher predição LTV com segment_id
365
+ const enrichedLTV = {
366
+ original_prediction: 497.50,
367
+ segment_id: 123,
368
+ segment_name: "Alto Valor + Alto Engajamento (SP)",
369
+ adjusted_prediction: 612.30, // +23% baseado no segmento
370
+ confidence: 0.85
371
+ };
372
+ ```
373
+
374
+ ### Com Dashboard Agent
375
+
376
+ ```typescript
377
+ // Visualização de segmentos em gráficos
378
+ const segmentChartData = {
379
+ labels: ["Segmento 0", "Segmento 1", "Segmento 2"],
380
+ data: [95, 150, 120, 85, 50],
381
+ colors: ["#22c55e", "#3b82f6", "#1e40af", "#06b6d4", "#f59e0b"]
382
+ };
383
+ ```
384
+
385
+ ### Com Meta Agent
386
+
387
+ ```typescript
388
+ // Criar campanhas segmentadas por segmento
389
+ const segmentedCampaigns = [
390
+ {
391
+ adset_name: "Segmento 0 - Alto Valor",
392
+ audience: ml_segment_id_123,
393
+ creative: "VSL Personalizado Segmento 0",
394
+ bid_strategy: "high_bid"
395
+ }
396
+ ];
397
+ ```
398
+
399
+ ---
400
+
401
+ ## Troubleshooting Comum
402
+
403
+ ### Erro: "Dados insuficientes para clustering"
404
+
405
+ **Causa:** Menos de 100 leads nos últimos 6 meses
406
+
407
+ **Solução:**
408
+ - Aguardar mais dados acumularem
409
+ - Aumentar `max_data_age_months` para 12
410
+ - Usar `force=true` para clustering com menos dados
411
+
412
+ ### Erro: "Silhouette Score < 0.3"
413
+
414
+ **Causa:** Clusters não são bem separados
415
+
416
+ **Solução:**
417
+ - Aumentar `n_clusters` para 7-10
418
+ - Reduzir dimensionalidade (usar features mais importantes)
419
+ - Usar algoritmo `hierarchical` em vez de `kmeans`
420
+
421
+ ### Erro: "Workers AI timeout"
422
+
423
+ **Causa:** Prompt muito longo ou muitos dados
424
+
425
+ **Solução:**
426
+ - Reduzir leads por batch (max 500)
427
+ - Simplificar prompt (menos instruções)
428
+ - Aumentar timeout no wrangler.toml
429
+
430
+ ---
431
+
432
+ ## Roadmap Futuro
433
+
434
+ - [ ] DBSCAN Clustering completo (outliers avançado)
435
+ - [ ] Hierarchical Clustering (drill-down de clusters)
436
+ - [ ] Auto-feature selection (identificar features mais importantes)
437
+ - [ ] Clustering temporal (leads mudam de segmento ao longo do tempo)
438
+ - [ ] A/B testing automático de segmentos
439
+ - [ ] Dashboard visual de segmentos em gráficos interativos
440
+
441
+ ---
442
+
443
+ *API de Segmentação Dinâmica ML v1.0 — CDP Edge*
444
+ *Data: 9 de Abril de 2026*
445
+
446
+ ---
447
+
448
+ ## Integração com LTV Real e Match Quality (Fase 5)
449
+
450
+ ### Como ml_segments alimenta o modelo LTV
451
+
452
+ Os segmentos gerados pelo clustering não são apenas para campanhas — eles são features do modelo LTV treinado semanalmente.
453
+
454
+ Quando o cron semanal treina a regressão logística em `ltv_model_weights`, ele inclui o `cluster_id` do lead como feature. Isso significa:
455
+
456
+ - Leads do "Segmento Alto Valor + Alto Engajamento (SP)" têm peso positivo maior no modelo
457
+ - O modelo aprende quais segmentos historicamente convertem mais
458
+ - O LTV Score de cada novo `/track` já leva em conta o segmento do usuário
459
+
460
+ **Fluxo de dados:**
461
+
462
+ ```
463
+ ml_segment_members (cluster_id por lead)
464
+
465
+ └─ JOIN com leads × purchases
466
+
467
+ └─ Treino semanal da regressão logística
468
+
469
+ └─ ltv_model_weights (is_active=1)
470
+
471
+ └─ Score LTV em cada /track
472
+ ```
473
+
474
+ ### Como bid_recommendations se conecta ao LTV treinado
475
+
476
+ O `ltv_model_weights` ativo gera scores mais precisos, que alimentam diretamente as recomendações de bid:
477
+
478
+ 1. LTV Score do segmento sobe (modelo mais preciso) → `avg_ltv` do segmento é recalculado
479
+ 2. Bidding Agent roda `POST /api/bidding/recommend` com o novo `avg_ltv`
480
+ 3. `bid_recommendations` é atualizado com bid recomendado para o segmento × plataforma
481
+ 4. Você aplica o bid sugerido em Meta/Google Ads
482
+
483
+ **Consulta útil — bid atual por segmento:**
484
+
485
+ ```bash
486
+ curl "https://seudominio.com/api/bidding/status"
487
+ # Retorna: bid recomendado atual por segmento × plataforma
488
+ ```
489
+
490
+ ### Como Match Quality afeta a qualidade dos segmentos
491
+
492
+ A tabela `match_quality_log` registra se cada evento que alimentou o D1 tinha email, fbp, etc. Eventos com `has_email = 0` têm Advanced Matching incompleto — a Meta pode não ter conseguido fazer o match com um usuário real.
493
+
494
+ Isso significa que `ml_segments` pode conter leads "fantasmas" (usuários que a Meta não reconheceu). Para garantir a qualidade dos segmentos:
495
+
496
+ 1. Monitore `v_match_quality_24h` para manter `email_rate > 40%`
497
+ 2. Se a taxa cair, o Auto-Enrich (Identity Graph) recupera emails de sessões anteriores automaticamente
498
+ 3. Leads com email recuperado (`was_email_recovered = 1`) são indistinguíveis dos outros no clustering — têm o mesmo peso
499
+
500
+ **Consulta de match quality:**
501
+
502
+ ```bash
503
+ curl "https://seudominio.com/api/fraud/stats"
504
+ # Inclui métricas de qualidade de sinal junto com dados de fraude
505
+ ```
506
+
507
+ ### Tabelas relacionadas (Fase 5)
508
+
509
+ | Tabela | Relação com segmentação |
510
+ |---|---|
511
+ | `ltv_model_weights` | Usa `cluster_id` como feature; melhora scores LTV por segmento |
512
+ | `match_quality_log` | Indica qualidade dos eventos que geraram os leads dos segmentos |
513
+ | `user_profiles` | Auto-Enrich recupera dados antes do dispatch → mais leads com email → melhor clustering |
@@ -0,0 +1,64 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "config": {
4
+ "method": "sha256",
5
+ "salt": "CDP_EDGE_UTM_SALT",
6
+ "truncated_length": 8
7
+ },
8
+ "mappings": [],
9
+ "examples": {
10
+ "imoveis": [
11
+ {
12
+ "obfuscated": "8a3f1d2b",
13
+ "original": "500k-800k",
14
+ "category": "imovel",
15
+ "pixel_audience": "AUDIENCE_LOW",
16
+ "platform_specific": {
17
+ "meta": { "custom_audience_id": "2385xxx_LOW" },
18
+ "tiktok": { "pixel_id": "C1xxx_LOW" }
19
+ }
20
+ },
21
+ {
22
+ "obfuscated": "b4e2a1c9",
23
+ "original": "800k-1.5M",
24
+ "category": "imovel",
25
+ "pixel_audience": "AUDIENCE_MID",
26
+ "platform_specific": {
27
+ "meta": { "custom_audience_id": "2385xxx_MID" },
28
+ "tiktok": { "pixel_id": "C1xxx_MID" }
29
+ }
30
+ },
31
+ {
32
+ "obfuscated": "d6c3b4e7",
33
+ "original": "1M-3M",
34
+ "category": "imovel",
35
+ "pixel_audience": "AUDIENCE_HIGH",
36
+ "platform_specific": {
37
+ "meta": { "custom_audience_id": "2385xxx_HIGH" },
38
+ "tiktok": { "pixel_id": "C1xxx_HIGH" }
39
+ }
40
+ }
41
+ ],
42
+ "automotivos": [
43
+ {
44
+ "obfuscated": "e7a5b3d1",
45
+ "original": "50k-100k",
46
+ "category": "automotivo",
47
+ "pixel_audience": "AUDIENCE_ENTRY"
48
+ },
49
+ {
50
+ "obfuscated": "f4c8d2a6",
51
+ "original": "100k-200k",
52
+ "category": "automotivo",
53
+ "pixel_audience": "AUDIENCE_MID"
54
+ },
55
+ {
56
+ "obfuscated": "a9b1e4c3",
57
+ "original": "200k-500k",
58
+ "category": "automotivo",
59
+ "pixel_audience": "AUDIENCE_PREMIUM"
60
+ }
61
+ ]
62
+ },
63
+ "instructions": "Preencha o array 'mappings' com as categorias do seu projeto. Use o comando 'node scripts/sync-agents.js' para sincronizar com o Agente UTM."
64
+ }
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CDP Edge — deploy-client.js
4
+ *
5
+ * Deploy do Worker com variáveis reais do cliente, sem commitar credenciais no repo.
6
+ * Lê de .client.env (gitignored) e gera um wrangler.deploy.toml temporário.
7
+ *
8
+ * Uso:
9
+ * node deploy-client.js → deploy completo
10
+ * node deploy-client.js --dry-run → valida sem subir ao Cloudflare
11
+ *
12
+ * Setup:
13
+ * cp .client.env.example .client.env
14
+ * # edite .client.env com os valores do cliente
15
+ * node deploy-client.js
16
+ */
17
+
18
+ const fs = require('fs');
19
+ const path = require('path');
20
+ const { execSync } = require('child_process');
21
+
22
+ const ROOT = __dirname;
23
+ const TOML = path.join(ROOT, 'wrangler.toml');
24
+ const DEPLOY = path.join(ROOT, 'wrangler.deploy.toml');
25
+ const ENV = path.join(ROOT, '.client.env');
26
+ const DRY_RUN = process.argv.includes('--dry-run');
27
+
28
+ // ── Carregar .client.env ──────────────────────────────────────────────────────
29
+ if (!fs.existsSync(ENV)) {
30
+ console.error('\n❌ .client.env não encontrado.');
31
+ console.error(' cp .client.env.example .client.env e preencha os valores do cliente.\n');
32
+ process.exit(1);
33
+ }
34
+
35
+ const env = {};
36
+ fs.readFileSync(ENV, 'utf8').split('\n').forEach(line => {
37
+ const trimmed = line.trim();
38
+ if (!trimmed || trimmed.startsWith('#')) return;
39
+ const [key, ...rest] = trimmed.split('=');
40
+ if (key) env[key.trim()] = rest.join('=').trim();
41
+ });
42
+
43
+ const required = ['DATABASE_ID', 'SITE_DOMAIN'];
44
+ const missing = required.filter(k => !env[k]);
45
+ if (missing.length > 0) {
46
+ console.error(`\n❌ Variáveis obrigatórias faltando no .client.env: ${missing.join(', ')}\n`);
47
+ process.exit(1);
48
+ }
49
+
50
+ // ── Substituir placeholders no wrangler.toml → wrangler.deploy.toml ───────────
51
+ let toml = fs.readFileSync(TOML, 'utf8');
52
+
53
+ toml = toml
54
+ .replace(/SEU_DATABASE_ID/g, env.DATABASE_ID)
55
+ .replace(/SEU_DOMINIO/g, env.SITE_DOMAIN)
56
+ .replace(/META_PIXEL_ID\s*=\s*""/, `META_PIXEL_ID = "${env.META_PIXEL_ID || ''}"`)
57
+ .replace(/GA4_MEASUREMENT_ID\s*=\s*""/, `GA4_MEASUREMENT_ID = "${env.GA4_MEASUREMENT_ID || ''}"`)
58
+ .replace(/TIKTOK_PIXEL_ID\s*=\s*""/, `TIKTOK_PIXEL_ID = "${env.TIKTOK_PIXEL_ID || ''}"`);
59
+
60
+ fs.writeFileSync(DEPLOY, toml);
61
+
62
+ // ── Executar wrangler deploy ──────────────────────────────────────────────────
63
+ const cmd = `wrangler deploy --config wrangler.deploy.toml${DRY_RUN ? ' --dry-run' : ''}`;
64
+ console.log(`\n🚀 ${DRY_RUN ? '[DRY-RUN] ' : ''}Deploying com config do cliente...\n`);
65
+
66
+ try {
67
+ execSync(cmd, { stdio: 'inherit', cwd: ROOT });
68
+ console.log(`\n✅ Deploy ${DRY_RUN ? '(dry-run) ' : ''}concluído.\n`);
69
+ } catch (err) {
70
+ console.error('\n❌ Deploy falhou.\n');
71
+ process.exit(1);
72
+ } finally {
73
+ // sempre remove o arquivo temporário
74
+ if (fs.existsSync(DEPLOY)) fs.unlinkSync(DEPLOY);
75
+ console.log('🧹 wrangler.deploy.toml removido.\n');
76
+ }