cdp-edge 1.0.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 +324 -0
- package/bin/cdp-edge.js +71 -0
- package/contracts/agent-versions.json +679 -0
- package/contracts/api-versions.json +372 -0
- package/contracts/types.ts +81 -0
- package/dist/commands/analyze.js +52 -0
- package/dist/commands/infra.js +54 -0
- package/dist/commands/install.js +191 -0
- package/dist/commands/server.js +174 -0
- package/dist/commands/setup.js +355 -0
- package/dist/commands/validate.js +248 -0
- package/dist/index.js +12 -0
- 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/CI-CD-SETUP.md +217 -0
- package/docs/events-reference.md +359 -0
- package/docs/installation.md +155 -0
- package/docs/quick-start.md +185 -0
- package/docs/sdk-reference.md +371 -0
- package/docs/whatsapp-ctwa.md +210 -0
- package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +683 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +513 -0
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
- package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +66 -0
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +364 -0
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2097 -0
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1459 -0
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +668 -0
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +238 -0
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +88 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +257 -0
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +235 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +525 -0
- package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +173 -0
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +960 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +2154 -0
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +25 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +878 -0
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +118 -0
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +749 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +272 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1167 -0
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1442 -0
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +318 -0
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +258 -0
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +321 -0
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1861 -0
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +391 -0
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +182 -0
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +459 -0
- package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +271 -0
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +177 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +129 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +707 -0
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +537 -0
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +640 -0
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +372 -0
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +3066 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
- package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
- package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +132 -0
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
- package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
- package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
- package/package.json +89 -0
- package/scripts/build-sdk.js +106 -0
- package/server-edge-tracker/.client.env.example +14 -0
- package/server-edge-tracker/INSTALAR.md +527 -0
- 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 +1164 -0
- package/server-edge-tracker/migrate-new-db.sql +137 -0
- package/server-edge-tracker/migrate-v2.sql +16 -0
- package/server-edge-tracker/migrate-v3.sql +6 -0
- package/server-edge-tracker/migrate-v4.sql +18 -0
- package/server-edge-tracker/migrate-v5.sql +17 -0
- package/server-edge-tracker/migrate-v6.sql +24 -0
- package/server-edge-tracker/migrate-v7.sql +64 -0
- package/server-edge-tracker/migrate.sql +111 -0
- package/server-edge-tracker/modules/db.ts +702 -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 +279 -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 +265 -0
- package/server-edge-tracker/types.ts +258 -0
- package/server-edge-tracker/wrangler.toml +136 -0
- package/templates/afiliado-sem-landing.md +312 -0
- package/templates/captura-de-lead.md +78 -0
- package/templates/captura-lead-evento-externo.md +99 -0
- package/templates/checkout-proprio.md +111 -0
- package/templates/install/.claude/commands/cdp.md +1 -0
- package/templates/install/CLAUDE.md +65 -0
- package/templates/lancamento-imobiliario.md +344 -0
- package/templates/linkedin/tag-template.js +46 -0
- package/templates/multi-step-checkout.md +672 -0
- package/templates/pagina-obrigado.md +55 -0
- package/templates/pinterest/conversions-api-template.js +144 -0
- package/templates/pinterest/event-mappings.json +48 -0
- package/templates/pinterest/tag-template.js +28 -0
- package/templates/quiz-funnel.md +132 -0
- package/templates/reddit/conversions-api-template.js +205 -0
- package/templates/reddit/event-mappings.json +56 -0
- package/templates/reddit/pixel-template.js +19 -0
- package/templates/scenarios/behavior-engine.js +425 -0
- package/templates/scenarios/real-estate-logic.md +50 -0
- package/templates/scenarios/sales-page-logic.md +50 -0
- package/templates/spotify/pixel-template.js +46 -0
- package/templates/trafego-direto.md +582 -0
- package/templates/vsl-page.md +292 -0
- package/templates/webinar-registration.md +63 -0
|
@@ -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
|
+
-- ============================================================================
|