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,113 @@
1
+ -- CDP Edge — Schema Sales Engine (Fase 7)
2
+ -- ROAS Feedback Loop + Nurture Engine + Lookalike Dinâmico
3
+ -- Executar: wrangler d1 execute cdp-edge-db --file=schema-sales-engine.sql --remote
4
+
5
+ -- ── ROAS Reports — histórico de performance por campanha ──────────────────────
6
+ CREATE TABLE IF NOT EXISTS roas_reports (
7
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
8
+ utm_source TEXT NOT NULL,
9
+ utm_campaign TEXT NOT NULL,
10
+ utm_content TEXT NOT NULL DEFAULT 'unknown', -- origem: quiz_*, video_*, landing_*, ctwa_*
11
+ period_days INTEGER NOT NULL DEFAULT 30,
12
+ total_leads INTEGER NOT NULL DEFAULT 0,
13
+ confirmed_buyers INTEGER NOT NULL DEFAULT 0,
14
+ conversion_rate REAL NOT NULL DEFAULT 0, -- 0.0–1.0
15
+ total_revenue REAL NOT NULL DEFAULT 0, -- BRL
16
+ revenue_per_lead REAL NOT NULL DEFAULT 0,
17
+ ltv_accuracy REAL NOT NULL DEFAULT 0, -- % leads High LTV que realmente compraram
18
+ top_qualification TEXT, -- qualificação quiz dominante
19
+ bid_recommendation TEXT NOT NULL DEFAULT 'maintain', -- increase|maintain|decrease|pause
20
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
21
+ );
22
+
23
+ -- Migração para instâncias existentes (idempotente via IF NOT EXISTS não funciona em ALTER TABLE —
24
+ -- execute manualmente se a tabela já existir):
25
+ -- ALTER TABLE roas_reports ADD COLUMN utm_content TEXT NOT NULL DEFAULT 'unknown';
26
+
27
+ CREATE INDEX IF NOT EXISTS idx_roas_source_campaign ON roas_reports(utm_source, utm_campaign);
28
+ CREATE INDEX IF NOT EXISTS idx_roas_content ON roas_reports(utm_content);
29
+ CREATE INDEX IF NOT EXISTS idx_roas_created_at ON roas_reports(created_at);
30
+ CREATE INDEX IF NOT EXISTS idx_roas_bid_rec ON roas_reports(bid_recommendation);
31
+
32
+ -- VIEW: últimos relatórios por campanha com evolução
33
+ CREATE VIEW IF NOT EXISTS v_roas_latest AS
34
+ SELECT
35
+ utm_source,
36
+ utm_campaign,
37
+ conversion_rate,
38
+ total_revenue,
39
+ revenue_per_lead,
40
+ ltv_accuracy,
41
+ top_qualification,
42
+ bid_recommendation,
43
+ created_at
44
+ FROM roas_reports r1
45
+ WHERE created_at = (
46
+ SELECT MAX(r2.created_at)
47
+ FROM roas_reports r2
48
+ WHERE r2.utm_source = r1.utm_source
49
+ AND r2.utm_campaign = r1.utm_campaign
50
+ )
51
+ ORDER BY total_revenue DESC;
52
+
53
+ -- ── Nurture Sequences — filas de mensagens por qualificação ──────────────────
54
+ CREATE TABLE IF NOT EXISTS nurture_sequences (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ user_id TEXT, -- _cdp_uid
57
+ qualification TEXT NOT NULL, -- interessado | curioso
58
+ delay_days INTEGER NOT NULL, -- D+N após o quiz
59
+ channel TEXT NOT NULL, -- whatsapp | email
60
+ message TEXT NOT NULL, -- mensagem interpolada
61
+ subject TEXT, -- assunto (email only)
62
+ send_at TEXT NOT NULL, -- datetime de envio agendado
63
+ status TEXT NOT NULL DEFAULT 'pending', -- pending | sent | failed | cancelled
64
+ sent_at TEXT, -- quando foi realmente enviado
65
+ quiz_name TEXT, -- nome do quiz (para interpolação)
66
+ phone TEXT, -- telefone do lead
67
+ email TEXT, -- email do lead
68
+ first_name TEXT, -- nome (para personalização)
69
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
70
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
71
+ );
72
+
73
+ CREATE INDEX IF NOT EXISTS idx_nurture_user_id ON nurture_sequences(user_id);
74
+ CREATE INDEX IF NOT EXISTS idx_nurture_status ON nurture_sequences(status);
75
+ CREATE INDEX IF NOT EXISTS idx_nurture_send_at ON nurture_sequences(send_at);
76
+ CREATE INDEX IF NOT EXISTS idx_nurture_qual ON nurture_sequences(qualification);
77
+
78
+ -- VIEW: fila de envio pendente
79
+ CREATE VIEW IF NOT EXISTS v_nurture_pending AS
80
+ SELECT
81
+ id, user_id, qualification, delay_days, channel,
82
+ message, send_at, phone, email, first_name, quiz_name
83
+ FROM nurture_sequences
84
+ WHERE status = 'pending'
85
+ AND send_at <= datetime('now')
86
+ ORDER BY send_at ASC;
87
+
88
+ -- VIEW: taxa de envio por qualificação
89
+ CREATE VIEW IF NOT EXISTS v_nurture_stats AS
90
+ SELECT
91
+ qualification,
92
+ channel,
93
+ COUNT(*) AS total,
94
+ COUNT(CASE WHEN status = 'sent' THEN 1 END) AS sent,
95
+ COUNT(CASE WHEN status = 'failed' THEN 1 END) AS failed,
96
+ COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending,
97
+ ROUND(COUNT(CASE WHEN status = 'sent' THEN 1 END) * 100.0 / COUNT(*), 1) AS delivery_rate_pct
98
+ FROM nurture_sequences
99
+ GROUP BY qualification, channel;
100
+
101
+ -- ── Lookalike Seeds — histórico de audiences enviadas ao Meta ─────────────────
102
+ CREATE TABLE IF NOT EXISTS lookalike_seeds (
103
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
104
+ audience_id TEXT NOT NULL, -- META_AUDIENCE_ID
105
+ seed_type TEXT NOT NULL, -- 'buyer_confirmed' | 'high_intent' | 'quiz_comprador'
106
+ profiles_sent INTEGER NOT NULL DEFAULT 0,
107
+ profiles_received INTEGER, -- confirmado pela API Meta
108
+ period_days INTEGER NOT NULL DEFAULT 30,
109
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
110
+ );
111
+
112
+ CREATE INDEX IF NOT EXISTS idx_lookalike_seed_type ON lookalike_seeds(seed_type);
113
+ CREATE INDEX IF NOT EXISTS idx_lookalike_created_at ON lookalike_seeds(created_at);
@@ -0,0 +1,219 @@
1
+ -- Schema de Segmentação Dinâmica ML — CDP Edge Quantum Tier
2
+ -- Versão: 1.0
3
+ -- Data: 9 de Abril de 2026
4
+
5
+ -- TABELA PRINCIPAL: Segmentos ML
6
+ CREATE TABLE IF NOT EXISTS ml_segments (
7
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
8
+ cluster_id INTEGER NOT NULL,
9
+ cluster_name TEXT NOT NULL, -- Nome descritivo gerado por ML
10
+ clustering_algorithm TEXT NOT NULL, -- 'kmeans', 'dbscan', 'hierarchical'
11
+ client_vertical TEXT, -- 'curso-online', 'ecommerce', 'saaS'
12
+ created_at TEXT DEFAULT (datetime('now')),
13
+ updated_at TEXT DEFAULT (datetime('now')),
14
+
15
+ -- Estatísticas do cluster
16
+ size INTEGER NOT NULL, -- Número de leads no cluster
17
+ percentage REAL NOT NULL, -- % do total (ex: 0.25 = 25%)
18
+
19
+ -- Características médias (centróides)
20
+ avg_ltv REAL, -- LTV médio do cluster
21
+ avg_ltv_class REAL, -- 0=Low, 1=Medium, 2=High (média)
22
+ avg_behavior_score REAL, -- Engajamento médio (0-100)
23
+ avg_engagement_score REAL, -- Interações médias (0-100)
24
+ avg_intention_level REAL, -- Intenção de compra média (0-100)
25
+ avg_days_since_lead REAL, -- Recência média em dias
26
+ avg_hour_of_day REAL, -- Hora média do dia (0-23)
27
+ avg_is_weekend REAL, -- % que acessa no fim de semana (0-1)
28
+ avg_is_business_hours REAL, -- % em horário comercial (0-1)
29
+ avg_bot_score REAL, -- % humano médio (0-100, 100=100% humano)
30
+
31
+ -- Características dominantes (top features por cluster)
32
+ dominant_countries TEXT, -- JSON array: ["BR", "US", "AR"]
33
+ dominant_states TEXT, -- JSON array: ["SP", "RJ", "MG"]
34
+ dominant_cities TEXT, -- JSON array: ["São Paulo", "Rio de Janeiro"]
35
+ dominant_timezones TEXT, -- JSON array: ["America/Sao_Paulo", "America/New_York"]
36
+ dominant_utm_sources TEXT, -- JSON array: ["facebook", "google", "tiktok"]
37
+ dominant_utm_mediums TEXT, -- JSON array: ["cpc", "organic", "social"]
38
+ dominant_features TEXT, -- JSON array: ["ltv", "behavior_score", "engagement_score"]
39
+
40
+ -- Métricas de qualidade do clustering
41
+ silhouette_score REAL, -- Coesão vs separação (-1 a 1, > 0.5 = bom)
42
+ cohesion REAL, -- Similaridade média intra-cluster
43
+ separation REAL, -- Distância média inter-cluster
44
+ inertia REAL, -- Soma dos quadrados das distâncias (menor = melhor)
45
+
46
+ -- Recomendações automáticas geradas por ML
47
+ action_recommendations TEXT, -- JSON array: ["Priorizar remarketing", "Aumentar bid", ...]
48
+ bid_recommendations TEXT, -- JSON array: [{"adset_id": "123", "recommended_bid": "R$ 18.50"}, ...]
49
+ campaign_recommendations TEXT, -- JSON array: [{"creative": "VSL A", "audience": "Segment 0"}, ...]
50
+
51
+ -- Metadados de controle
52
+ is_active INTEGER DEFAULT 1, -- 0 = arquivado, 1 = ativo
53
+ min_data_points INTEGER, -- Mínimo de leads para formar cluster
54
+ epsilon REAL, -- Para DBSCAN (distância máxima)
55
+ min_samples INTEGER, -- Para DBSCAN (pontos mínimos para cluster)
56
+ max_depth INTEGER -- Para Hierarchical (profundidade máxima)
57
+ );
58
+
59
+ -- Índices para performance
60
+ CREATE INDEX IF NOT EXISTS idx_ml_segments_id ON ml_segments(id);
61
+ CREATE INDEX IF NOT EXISTS idx_ml_segments_cluster ON ml_segments(cluster_id);
62
+ CREATE INDEX IF NOT EXISTS idx_ml_segments_algorithm ON ml_segments(clustering_algorithm);
63
+ CREATE INDEX IF NOT EXISTS idx_ml_segments_created ON ml_segments(created_at);
64
+ CREATE INDEX IF NOT EXISTS idx_ml_segments_active ON ml_segments(is_active);
65
+ CREATE INDEX IF NOT EXISTS idx_ml_segments_vertical ON ml_segments(client_vertical);
66
+
67
+ -- TABELA DE ASSOCIAÇÃO: Segment Members (Quem está em cada segmento)
68
+ CREATE TABLE IF NOT EXISTS ml_segment_members (
69
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
70
+ lead_id TEXT NOT NULL, -- ID da tabela leads
71
+ cluster_id INTEGER NOT NULL, -- ID do cluster (ml_segments.id)
72
+ clustering_algorithm TEXT NOT NULL, -- Mesmo algoritmo usado para criar o cluster
73
+ confidence REAL NOT NULL, -- 0-1 (quão perto do centroide)
74
+ distance_to_centroid REAL, -- Distância Euclidiana ao centroide
75
+ updated_at TEXT DEFAULT (datetime('now')),
76
+
77
+ -- Metadados para rastreamento
78
+ assigned_at TEXT DEFAULT (datetime('now')), -- Quando foi atribuído ao segmento
79
+ is_outlier INTEGER DEFAULT 0, -- 0 = normal, 1 = outlier (DBSCAN)
80
+ outlier_reason TEXT, -- "behavior_score too high", "unusual geo", etc.
81
+
82
+ -- Características do lead no momento da atribuição
83
+ lead_ltv REAL, -- LTV do lead no momento
84
+ lead_ltv_class REAL, -- Classe de LTV do lead
85
+ lead_behavior_score REAL, -- Behavior score no momento
86
+ lead_engagement_score REAL, -- Engagement score no momento
87
+ lead_intention_level REAL, -- Intention level no momento
88
+ lead_days_since_lead REAL, -- Dias desde lead no momento
89
+ lead_hour_of_day REAL, -- Hora do dia no momento
90
+ lead_is_weekend INTEGER, -- Se era fim de semana (0/1)
91
+ lead_is_business_hours INTEGER, -- Se era horário comercial (0/1)
92
+ lead_country TEXT, -- País do lead
93
+ lead_state TEXT, -- Estado do lead
94
+ lead_city TEXT, -- Cidade do lead
95
+ lead_utm_source TEXT, -- UTM source do lead
96
+ lead_utm_medium TEXT, -- UTM medium do lead
97
+
98
+ -- Chave composta para evitar duplicatas
99
+ UNIQUE(lead_id, cluster_id, clustering_algorithm)
100
+ );
101
+
102
+ -- Índices para performance
103
+ CREATE INDEX IF NOT EXISTS idx_ml_segment_members_lead ON ml_segment_members(lead_id);
104
+ CREATE INDEX IF NOT EXISTS idx_ml_segment_members_cluster ON ml_segment_members(cluster_id);
105
+ CREATE INDEX IF NOT EXISTS idx_ml_segment_members_algorithm ON ml_segment_members(clustering_algorithm);
106
+ CREATE INDEX IF NOT EXISTS idx_ml_segment_members_confidence ON ml_segment_members(confidence);
107
+ CREATE INDEX IF NOT EXISTS idx_ml_segment_members_outlier ON ml_segment_members(is_outlier);
108
+ CREATE INDEX IF NOT EXISTS idx_ml_segment_members_assigned ON ml_segment_members(assigned_at);
109
+
110
+ -- TABELA DE HISTÓRICO DE CLUSTERING (Auditoria)
111
+ CREATE TABLE IF NOT EXISTS ml_clustering_history (
112
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
113
+ clustering_id INTEGER NOT NULL, -- ID em ml_segments
114
+ started_at TEXT NOT NULL, -- Quando iniciou o clustering
115
+ completed_at TEXT, -- Quando terminou
116
+ algorithm TEXT NOT NULL, -- 'kmeans', 'dbscan', 'hierarchical'
117
+ n_leads_processed INTEGER NOT NULL, -- Quantos leads foram processados
118
+ n_clusters_created INTEGER NOT NULL, -- Quantos clusters foram criados
119
+ total_duration_ms INTEGER NOT NULL, -- Duração total em milissegundos
120
+ workers_ai_neurons_used INTEGER, -- Neurônios usados (para billing)
121
+ status TEXT NOT NULL, -- 'completed', 'failed', 'timeout'
122
+ error_message TEXT, -- Se falhou, motivo do erro
123
+ parameters TEXT NOT NULL, -- Parâmetros usados (JSON)
124
+ results_summary TEXT, -- Resumo dos resultados (JSON)
125
+ created_at TEXT DEFAULT (datetime('now'))
126
+ );
127
+
128
+ -- Índices para auditoria
129
+ CREATE INDEX IF NOT EXISTS idx_ml_clustering_history_clustering ON ml_clustering_history(clustering_id);
130
+ CREATE INDEX IF NOT EXISTS idx_ml_clustering_history_started ON ml_clustering_history(started_at);
131
+ CREATE INDEX IF NOT EXISTS idx_ml_clustering_history_algorithm ON ml_clustering_history(algorithm);
132
+ CREATE INDEX IF NOT EXISTS idx_ml_clustering_history_status ON ml_clustering_history(status);
133
+
134
+ -- TABELA DE FEATURE IMPORTANCE (Otimização Futura)
135
+ CREATE TABLE IF NOT EXISTS ml_feature_importance (
136
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
137
+ feature_name TEXT NOT NULL, -- 'ltv', 'behavior_score', etc.
138
+ importance_score REAL NOT NULL, -- 0-1 (quão importante para clustering)
139
+ clustering_algorithm TEXT NOT NULL, -- Algoritmo usado para calcular
140
+ variance_explained REAL, -- % da variância explicada
141
+ created_at TEXT DEFAULT (datetime('now')),
142
+ updated_at TEXT DEFAULT (datetime('now'))
143
+ );
144
+
145
+ -- Índices
146
+ CREATE INDEX IF NOT EXISTS idx_ml_feature_importance_feature ON ml_feature_importance(feature_name);
147
+ CREATE INDEX IF NOT EXISTS idx_ml_feature_importance_algorithm ON ml_feature_importance(clustering_algorithm);
148
+
149
+ -- VIEW: Segmentos Ativos com Estatísticas
150
+ CREATE VIEW IF NOT EXISTS v_active_segments AS
151
+ SELECT
152
+ ms.id,
153
+ ms.cluster_id,
154
+ ms.cluster_name,
155
+ ms.clustering_algorithm,
156
+ ms.client_vertical,
157
+ ms.size,
158
+ ms.percentage,
159
+ ms.avg_ltv,
160
+ ms.avg_ltv_class,
161
+ ms.avg_behavior_score,
162
+ ms.avg_engagement_score,
163
+ ms.avg_intention_level,
164
+ ms.avg_days_since_lead,
165
+ ms.dominant_countries,
166
+ ms.dominant_states,
167
+ ms.dominant_cities,
168
+ ms.dominant_utm_sources,
169
+ ms.dominant_features,
170
+ ms.silhouette_score,
171
+ ms.cohesion,
172
+ ms.separation,
173
+ ms.inertia,
174
+ ms.action_recommendations,
175
+ ms.bid_recommendations,
176
+ ms.campaign_recommendations,
177
+ COUNT(msm.id) as member_count
178
+ FROM ml_segments ms
179
+ LEFT JOIN ml_segment_members msm ON msm.cluster_id = ms.id
180
+ WHERE ms.is_active = 1
181
+ GROUP BY ms.id
182
+ ORDER BY ms.created_at DESC;
183
+
184
+
185
+ -- VIEW: Membros de Segmentos (enriquecidos com dados de leads)
186
+ CREATE VIEW IF NOT EXISTS v_segment_members_enriched AS
187
+ SELECT
188
+ msm.id,
189
+ msm.lead_id,
190
+ msm.cluster_id,
191
+ msm.clustering_algorithm,
192
+ msm.confidence,
193
+ msm.distance_to_centroid,
194
+ msm.is_outlier,
195
+ msm.outlier_reason,
196
+ msm.assigned_at,
197
+ msm.lead_ltv,
198
+ msm.lead_ltv_class,
199
+ msm.lead_behavior_score,
200
+ msm.lead_engagement_score,
201
+ msm.lead_intention_level,
202
+ msm.lead_days_since_lead,
203
+ msm.lead_hour_of_day,
204
+ msm.lead_is_weekend,
205
+ msm.lead_is_business_hours,
206
+ l.email,
207
+ l.first_name,
208
+ l.last_name,
209
+ l.city,
210
+ l.state,
211
+ l.country,
212
+ l.utm_source,
213
+ l.utm_medium,
214
+ l.utm_campaign,
215
+ l.created_at as lead_created_at,
216
+ ms.cluster_name
217
+ FROM ml_segment_members msm
218
+ INNER JOIN leads l ON msm.lead_id = l.id
219
+ ORDER BY msm.confidence DESC, msm.assigned_at DESC;
@@ -0,0 +1,82 @@
1
+ -- ============================================================================
2
+ -- SCHEMA UTM OBFUSCATION — Fase de Segmentação de Valor
3
+ -- ============================================================================
4
+ -- Este schema estende o schema.sql existente com colunas para UTMs obfuscadas
5
+ -- e uma tabela de mapeamento para de-obfuscação no runtime.
6
+ --
7
+ -- Como funciona:
8
+ -- 1. utm_mappings: mapeia hash obfuscado → valor real (configuração)
9
+ -- 2. leads: adiciona colunas faixa_real, faixa_category (segmentação)
10
+ -- 3. dispatch: payload enriquecido com faixa de-obfuscada para Meta CAPI
11
+ --
12
+ -- ============================================================================
13
+ -- TABELA: utm_mappings (configuração de segmentação)
14
+ -- ============================================================================
15
+ CREATE TABLE IF NOT EXISTS utm_mappings (
16
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17
+ obfuscated_hash TEXT NOT NULL UNIQUE, -- ex: "8a3f1d2b" (hash truncado de 8 chars)
18
+ original_value TEXT NOT NULL, -- ex: "700k-1M" (valor real)
19
+ category TEXT NOT NULL, -- ex: "imovel", "automotivo", "curso"
20
+ pixel_audience TEXT, -- ex: "AUDIENCE_MID" (Meta custom audience)
21
+ platform_specific TEXT, -- JSON com IDs específicos por plataforma
22
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
23
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
24
+ );
25
+
26
+ -- ============================================================================
27
+ -- ÍNDICES: utm_mappings
28
+ -- ============================================================================
29
+ CREATE INDEX IF NOT EXISTS idx_utm_obfuscated ON utm_mappings(obfuscated_hash);
30
+ CREATE INDEX IF NOT EXISTS idx_utm_category ON utm_mappings(category);
31
+
32
+ -- ============================================================================
33
+ -- ALTER: leads (adicionar colunas de segmentação)
34
+ -- ============================================================================
35
+ -- Nota: D1/SQLite não suporta ADD COLUMN IF NOT EXISTS. Executar uma vez.
36
+ -- Se as colunas já existirem, o erro "duplicate column name" é inofensivo — banco continua OK.
37
+ ALTER TABLE leads ADD COLUMN faixa_obfuscada TEXT; -- Hash da faixa de valor (vem da URL)
38
+ ALTER TABLE leads ADD COLUMN faixa_real TEXT; -- Valor real de-obfuscado (ex: "700k-1M")
39
+ ALTER TABLE leads ADD COLUMN faixa_category TEXT; -- Categoria do produto (ex: "imovel")
40
+
41
+ -- ============================================================================
42
+ -- ÍNDICES: leads (novas colunas para segmentação)
43
+ -- ============================================================================
44
+ CREATE INDEX IF NOT EXISTS idx_leads_faixa_real ON leads(faixa_real);
45
+ CREATE INDEX IF NOT EXISTS idx_leads_faixa_category ON leads(faixa_category);
46
+ CREATE INDEX IF NOT EXISTS idx_leads_faixa_obfuscada ON leads(faixa_obfuscada);
47
+
48
+ -- ============================================================================
49
+ -- VIEW: leads_segmented (para queries de segmentação)
50
+ -- ============================================================================
51
+ CREATE VIEW IF NOT EXISTS leads_segmented AS
52
+ SELECT
53
+ l.id,
54
+ l.user_id,
55
+ l.event,
56
+ l.event_id,
57
+ l.email,
58
+ l.phone,
59
+ l.city,
60
+ l.state,
61
+ l.faixa_obfuscada,
62
+ l.faixa_real,
63
+ l.faixa_category,
64
+ l.created_at,
65
+ l.value,
66
+ l.intent_score,
67
+ l.ltv_class,
68
+ -- Meta CAPI: custom audience de-obfuscada
69
+ u.pixel_audience AS meta_custom_audience
70
+ FROM leads l
71
+ LEFT JOIN utm_mappings u ON l.faixa_obfuscada = u.obfuscated_hash;
72
+
73
+ -- ============================================================================
74
+ -- EXEMPLO: Query para exportar leads por faixa de valor (para Meta Custom Audience)
75
+ -- ============================================================================
76
+ -- SELECT email, phone, city, state, faixa_real, meta_custom_audience
77
+ -- FROM leads_segmented
78
+ -- WHERE faixa_category = 'imovel' AND faixa_real = '700k-1M'
79
+ -- AND created_at >= datetime('now', '-30 days');
80
+ --
81
+ -- Isso gera um CSV pronto para upload como Custom Audience na Meta.
82
+ -- ============================================================================