cdp-edge 1.2.0 → 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.
- 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 +244 -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 +5 -5
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +428 -190
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +25 -109
- 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 +749 -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,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
|
+
}
|