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,265 @@
|
|
|
1
|
+
-- CDP Edge — Schema D1
|
|
2
|
+
-- Projeto: server-edge-tracker | SEU_DOMINIO
|
|
3
|
+
-- Criação: wrangler d1 execute cdp-edge-db --file=schema.sql
|
|
4
|
+
|
|
5
|
+
-- ── Tabela de Leads ───────────────────────────────────────────────────────────
|
|
6
|
+
-- Armazena cada evento de conversão recebido (Lead, Purchase, Contact, etc.)
|
|
7
|
+
CREATE TABLE IF NOT EXISTS leads (
|
|
8
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
9
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
10
|
+
event_name TEXT NOT NULL, -- Lead | Purchase | Contact | etc.
|
|
11
|
+
event_id TEXT, -- ID único (deduplicação browser↔servidor)
|
|
12
|
+
email TEXT, -- email bruto (não hasheado — fica no banco)
|
|
13
|
+
phone TEXT, -- telefone normalizado (55119...)
|
|
14
|
+
first_name TEXT,
|
|
15
|
+
last_name TEXT,
|
|
16
|
+
city TEXT, -- cidade bruta (normalização feita no envio)
|
|
17
|
+
state TEXT,
|
|
18
|
+
country TEXT,
|
|
19
|
+
fbp TEXT, -- cookie _fbp do Meta Pixel
|
|
20
|
+
fbc TEXT, -- cookie _fbc (fbclid)
|
|
21
|
+
user_id TEXT, -- ID first-party (_cdp_uid)
|
|
22
|
+
utm_source TEXT,
|
|
23
|
+
utm_medium TEXT,
|
|
24
|
+
utm_campaign TEXT,
|
|
25
|
+
utm_content TEXT,
|
|
26
|
+
utm_term TEXT, -- palavra-chave da campanha (capturado no browser)
|
|
27
|
+
page_url TEXT,
|
|
28
|
+
value REAL,
|
|
29
|
+
currency TEXT DEFAULT 'BRL',
|
|
30
|
+
ip_address TEXT,
|
|
31
|
+
platform TEXT DEFAULT 'website', -- website | hotmart | kiwify | whatsapp
|
|
32
|
+
bot_score INTEGER DEFAULT 0, -- 0 = humano, 1 = suspeito, 2 = bot
|
|
33
|
+
engagement_score REAL, -- Score de engajamento browser (0-5 ou 0-100)
|
|
34
|
+
intention_level TEXT, -- curioso | interessado | comprador | high_intent
|
|
35
|
+
utm_restored INTEGER DEFAULT 0, -- 1 = UTM recuperada via Edge Fingerprint
|
|
36
|
+
crm_status TEXT DEFAULT 'cold', -- cold | engaging | closing | sold (CRM Dashboard)
|
|
37
|
+
raw_payload TEXT -- JSON original (para debug)
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_leads_email ON leads(email);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_leads_event ON leads(event_name);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_leads_created ON leads(created_at);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_leads_user_id ON leads(user_id);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_leads_platform ON leads(platform);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_leads_crm_status ON leads(crm_status);
|
|
46
|
+
|
|
47
|
+
-- ── Tabela de Perfis de Usuário ───────────────────────────────────────────────
|
|
48
|
+
-- UPSERT por user_id — acumula cookies e dados geo ao longo das visitas.
|
|
49
|
+
-- Objetivo: quando o webhook de compra chega (sem cookies), buscar fbp/fbc aqui.
|
|
50
|
+
CREATE TABLE IF NOT EXISTS user_profiles (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
user_id TEXT NOT NULL UNIQUE, -- ID first-party (_cdp_uid)
|
|
53
|
+
email TEXT,
|
|
54
|
+
phone TEXT,
|
|
55
|
+
fbp TEXT, -- _fbp mais recente
|
|
56
|
+
fbc TEXT, -- _fbc mais recente
|
|
57
|
+
ttp TEXT, -- _ttp TikTok
|
|
58
|
+
gclid TEXT, -- Google Click ID
|
|
59
|
+
ttclid TEXT, -- TikTok Click ID
|
|
60
|
+
ga_client_id TEXT, -- GA4 client_id (para Measurement Protocol)
|
|
61
|
+
msclkid TEXT, -- Microsoft Ads Click ID (bing/microsoft)
|
|
62
|
+
li_fat_id TEXT, -- LinkedIn Ads Click ID
|
|
63
|
+
wbraid TEXT, -- Google Ads (iOS web-to-app privacy-preserving)
|
|
64
|
+
gbraid TEXT, -- Google Ads (app campaigns privacy-preserving)
|
|
65
|
+
city TEXT,
|
|
66
|
+
state TEXT,
|
|
67
|
+
country TEXT,
|
|
68
|
+
score INTEGER DEFAULT 0, -- Lead Scoring acumulado (LTV preditivo)
|
|
69
|
+
cohort_label TEXT, -- high_intent | nurture | lost | buyer_lookalike
|
|
70
|
+
predicted_ltv_class TEXT, -- High | Medium | Low (Fase 4)
|
|
71
|
+
predicted_ltv_value REAL, -- Valor preditivo em BRL (Fase 4)
|
|
72
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
73
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_user_id ON user_profiles(user_id);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_email ON user_profiles(email);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_fbp ON user_profiles(fbp);
|
|
79
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_msclkid ON user_profiles(msclkid);
|
|
80
|
+
CREATE INDEX IF NOT EXISTS idx_profiles_li_fat ON user_profiles(li_fat_id);
|
|
81
|
+
|
|
82
|
+
-- ── Tabela de LOG de Webhooks Offline ─────────────────────────────────────────
|
|
83
|
+
CREATE TABLE IF NOT EXISTS webhook_events (
|
|
84
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
85
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
86
|
+
platform TEXT NOT NULL, -- hotmart | kiwify | ticto
|
|
87
|
+
transaction_id TEXT,
|
|
88
|
+
email TEXT,
|
|
89
|
+
status TEXT, -- processed | failed
|
|
90
|
+
raw_payload TEXT
|
|
91
|
+
);
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_transaction ON webhook_events(transaction_id);
|
|
93
|
+
|
|
94
|
+
-- ── Tabela de Edge Fingerprints (UTM Resurrection) ──────────────────────────
|
|
95
|
+
-- Armazena o hash de borda (ASN + Accept-Language + UA base) associado às UTMs
|
|
96
|
+
-- da última visita com parâmetros. Usado para recuperar atribuição perdida.
|
|
97
|
+
CREATE TABLE IF NOT EXISTS edge_fingerprints (
|
|
98
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
99
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
100
|
+
fingerprint TEXT NOT NULL, -- SHA256(asn|lang|ua_base)
|
|
101
|
+
user_id TEXT, -- _cdp_uid se disponível
|
|
102
|
+
utm_source TEXT,
|
|
103
|
+
utm_medium TEXT,
|
|
104
|
+
utm_campaign TEXT,
|
|
105
|
+
utm_content TEXT,
|
|
106
|
+
utm_term TEXT
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_fingerprint_hash ON edge_fingerprints(fingerprint);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_fingerprint_created ON edge_fingerprints(created_at);
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_fingerprint_user_id ON edge_fingerprints(user_id);
|
|
112
|
+
|
|
113
|
+
-- ── Tabela de Falhas de API (Feedback Loop) ───────────────────────────────
|
|
114
|
+
-- Registra cada falha de API para monitoramento e análise
|
|
115
|
+
CREATE TABLE IF NOT EXISTS api_failures (
|
|
116
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
117
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
118
|
+
platform TEXT NOT NULL, -- meta | ga4 | tiktok | pinterest | reddit
|
|
119
|
+
event_name TEXT, -- Purchase | Lead | InitiateCheckout, etc.
|
|
120
|
+
error_code TEXT, -- 400, 401, 500, etc.
|
|
121
|
+
error_message TEXT,
|
|
122
|
+
retry_count INTEGER DEFAULT 0,
|
|
123
|
+
final_status TEXT, -- success | failed | abandoned
|
|
124
|
+
event_id TEXT, -- event_id original para correlação
|
|
125
|
+
raw_payload TEXT -- JSON payload original (debug)
|
|
126
|
+
);
|
|
127
|
+
CREATE INDEX IF NOT EXISTS idx_api_failures_platform ON api_failures(platform);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_api_failures_created ON api_failures(created_at);
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_api_failures_event_id ON api_failures(event_id);
|
|
130
|
+
|
|
131
|
+
-- ── Tabela de Relatórios de Saúde (Feedback Loop) ──────────────────────────
|
|
132
|
+
-- Relatórios diários de saúde das APIs
|
|
133
|
+
CREATE TABLE IF NOT EXISTS health_reports (
|
|
134
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
135
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
136
|
+
report_date TEXT NOT NULL, -- '2026-03-28'
|
|
137
|
+
platform TEXT NOT NULL, -- meta | ga4 | tiktok | pinterest | reddit
|
|
138
|
+
events_sent INTEGER DEFAULT 0, -- Total de eventos enviados
|
|
139
|
+
events_failed INTEGER DEFAULT 0, -- Total de eventos com falha
|
|
140
|
+
success_rate REAL, -- Porcentagem de sucesso (0-100)
|
|
141
|
+
avg_latency_ms INTEGER, -- Latência média em milissegundos
|
|
142
|
+
errors_detected TEXT, -- JSON array de códigos de erro mais comuns
|
|
143
|
+
issues_detected TEXT -- JSON array de problemas detectados
|
|
144
|
+
);
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_health_reports_date ON health_reports(report_date);
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_health_reports_platform ON health_reports(platform);
|
|
147
|
+
|
|
148
|
+
-- ── Tabela de Device Graph (Cross-Device Matching) ──────────────────────────
|
|
149
|
+
-- Quando o mesmo email/phone aparece em dois _cdp_uid diferentes,
|
|
150
|
+
-- registra o par como "mesmo usuário, dispositivos distintos".
|
|
151
|
+
-- O primary_user_id é o mais antigo (created_at mais baixo no user_profiles).
|
|
152
|
+
CREATE TABLE IF NOT EXISTS device_graph (
|
|
153
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
154
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
155
|
+
primary_user_id TEXT NOT NULL, -- _cdp_uid mais antigo (âncora)
|
|
156
|
+
secondary_user_id TEXT NOT NULL, -- _cdp_uid novo detectado
|
|
157
|
+
match_type TEXT NOT NULL, -- 'email' | 'phone' | 'email+phone'
|
|
158
|
+
match_confidence REAL NOT NULL -- 0.0–1.0 (email=0.95, phone=0.85, ambos=0.99)
|
|
159
|
+
);
|
|
160
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_device_graph_pair
|
|
161
|
+
ON device_graph(primary_user_id, secondary_user_id);
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_device_graph_primary ON device_graph(primary_user_id);
|
|
163
|
+
CREATE INDEX IF NOT EXISTS idx_device_graph_secondary ON device_graph(secondary_user_id);
|
|
164
|
+
|
|
165
|
+
-- ── Tabela de Logs do Intelligence Agent ─────────────────────────────────────
|
|
166
|
+
-- Histórico de execuções de cron: checks de versão, auditorias, alertas
|
|
167
|
+
CREATE TABLE IF NOT EXISTS intelligence_logs (
|
|
168
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
169
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
170
|
+
run_type TEXT NOT NULL, -- 'weekly_check' | 'monthly_audit' | 'on_demand'
|
|
171
|
+
platform TEXT, -- meta | ga4 | tiktok | all
|
|
172
|
+
check_type TEXT NOT NULL, -- 'api_version' | 'error_rate' | 'privacy_audit'
|
|
173
|
+
status TEXT NOT NULL, -- 'ok' | 'warning' | 'critical'
|
|
174
|
+
current_value TEXT, -- versão atual ou taxa de erro detectada
|
|
175
|
+
expected_value TEXT, -- versão esperada ou threshold
|
|
176
|
+
message TEXT, -- descrição do resultado
|
|
177
|
+
alert_sent INTEGER DEFAULT 0 -- 1 = alerta WhatsApp enviado
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
CREATE INDEX IF NOT EXISTS idx_intel_logs_created ON intelligence_logs(created_at);
|
|
181
|
+
CREATE INDEX IF NOT EXISTS idx_intel_logs_status ON intelligence_logs(status);
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_intel_logs_platform ON intelligence_logs(platform);
|
|
183
|
+
|
|
184
|
+
-- ── Meta Ads Dashboard — Tabelas (conectadas ao mesmo D1) ────────────────────
|
|
185
|
+
-- Alimentadas pelo sync diário da Meta Marketing API v22.0
|
|
186
|
+
|
|
187
|
+
CREATE TABLE IF NOT EXISTS meta_account (
|
|
188
|
+
account_id TEXT PRIMARY KEY,
|
|
189
|
+
name TEXT NOT NULL,
|
|
190
|
+
currency TEXT DEFAULT 'BRL',
|
|
191
|
+
timezone TEXT DEFAULT 'America/Sao_Paulo',
|
|
192
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
CREATE TABLE IF NOT EXISTS meta_ad_metrics (
|
|
196
|
+
ad_id TEXT NOT NULL,
|
|
197
|
+
ad_name TEXT,
|
|
198
|
+
adset_id TEXT,
|
|
199
|
+
adset_name TEXT,
|
|
200
|
+
campaign_id TEXT NOT NULL,
|
|
201
|
+
campaign_name TEXT,
|
|
202
|
+
account_id TEXT,
|
|
203
|
+
spend REAL NOT NULL DEFAULT 0,
|
|
204
|
+
impressions INTEGER DEFAULT 0,
|
|
205
|
+
cpm REAL DEFAULT 0,
|
|
206
|
+
clicks INTEGER DEFAULT 0,
|
|
207
|
+
ctr REAL DEFAULT 0,
|
|
208
|
+
reach INTEGER DEFAULT 0,
|
|
209
|
+
frequency REAL DEFAULT 0,
|
|
210
|
+
actions_results INTEGER DEFAULT 0,
|
|
211
|
+
cost_per_result REAL DEFAULT 0,
|
|
212
|
+
inline_link_clicks INTEGER DEFAULT 0,
|
|
213
|
+
inline_link_click_ctr REAL DEFAULT 0,
|
|
214
|
+
date_ref TEXT NOT NULL,
|
|
215
|
+
synced_at TEXT DEFAULT (datetime('now')),
|
|
216
|
+
PRIMARY KEY (ad_id, date_ref)
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
CREATE INDEX IF NOT EXISTS idx_meta_metrics_date ON meta_ad_metrics(date_ref);
|
|
220
|
+
CREATE INDEX IF NOT EXISTS idx_meta_metrics_campaign ON meta_ad_metrics(campaign_id);
|
|
221
|
+
CREATE INDEX IF NOT EXISTS idx_meta_metrics_campaign_date ON meta_ad_metrics(campaign_id, date_ref);
|
|
222
|
+
|
|
223
|
+
CREATE TABLE IF NOT EXISTS meta_financeiro (
|
|
224
|
+
account_id TEXT NOT NULL,
|
|
225
|
+
month_start TEXT NOT NULL,
|
|
226
|
+
month_end TEXT NOT NULL,
|
|
227
|
+
spend REAL NOT NULL DEFAULT 0,
|
|
228
|
+
tax REAL NOT NULL DEFAULT 0,
|
|
229
|
+
total REAL NOT NULL DEFAULT 0,
|
|
230
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
231
|
+
PRIMARY KEY (account_id, month_start)
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
-- ── Mensageria — WhatsApp (Meta Cloud API) + Email (Resend) ──────────────────
|
|
235
|
+
CREATE TABLE IF NOT EXISTS messaging_history (
|
|
236
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
237
|
+
sent_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
238
|
+
lead_id INTEGER NOT NULL,
|
|
239
|
+
channel TEXT NOT NULL, -- 'whatsapp' | 'email'
|
|
240
|
+
recipient TEXT NOT NULL, -- telefone E.164 ou endereço de email
|
|
241
|
+
subject TEXT, -- assunto (só email)
|
|
242
|
+
content TEXT NOT NULL, -- corpo da mensagem
|
|
243
|
+
status TEXT NOT NULL, -- 'sent' | 'failed'
|
|
244
|
+
meta TEXT -- message_id da API ou erro em JSON
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
CREATE INDEX IF NOT EXISTS idx_msg_history_lead ON messaging_history(lead_id);
|
|
248
|
+
CREATE INDEX IF NOT EXISTS idx_msg_history_sent_at ON messaging_history(sent_at);
|
|
249
|
+
CREATE INDEX IF NOT EXISTS idx_msg_history_channel ON messaging_history(channel);
|
|
250
|
+
|
|
251
|
+
-- ── Automação de Mensagens ────────────────────────────────────────────────────
|
|
252
|
+
CREATE TABLE IF NOT EXISTS automation_rules (
|
|
253
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
254
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
255
|
+
name TEXT NOT NULL,
|
|
256
|
+
trigger_event TEXT NOT NULL, -- Lead | Purchase | InitiateCheckout | HighIntent
|
|
257
|
+
channel TEXT NOT NULL, -- whatsapp | email
|
|
258
|
+
subject_template TEXT,
|
|
259
|
+
message_template TEXT NOT NULL, -- suporta {{name}} {{email}} {{phone}} {{campaign}} {{intention}}
|
|
260
|
+
delay_minutes INTEGER NOT NULL DEFAULT 0,
|
|
261
|
+
is_active INTEGER NOT NULL DEFAULT 1
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
CREATE INDEX IF NOT EXISTS idx_auto_rules_event ON automation_rules(trigger_event);
|
|
265
|
+
CREATE INDEX IF NOT EXISTS idx_auto_rules_active ON automation_rules(is_active);
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge — Server Types
|
|
3
|
+
* Tipos para o Cloudflare Worker e bindings
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { D1Database, KVNamespace, Queue, R2Bucket } from '@cloudflare/workers-types';
|
|
7
|
+
|
|
8
|
+
// ── Environment Bindings ─────────────────────────────────────────────────────
|
|
9
|
+
export interface Env {
|
|
10
|
+
// D1 Database
|
|
11
|
+
DB?: D1Database;
|
|
12
|
+
|
|
13
|
+
// KV Namespace
|
|
14
|
+
GEO_CACHE?: KVNamespace;
|
|
15
|
+
|
|
16
|
+
// R2 Bucket
|
|
17
|
+
AUDIT_LOGS?: R2Bucket;
|
|
18
|
+
|
|
19
|
+
// Workers AI
|
|
20
|
+
AI?: any;
|
|
21
|
+
|
|
22
|
+
// Rate Limiter
|
|
23
|
+
RATE_LIMITER?: any;
|
|
24
|
+
|
|
25
|
+
// Queue — Retry de eventos com falha de rede
|
|
26
|
+
RETRY_QUEUE?: Queue<QueueMessage>;
|
|
27
|
+
|
|
28
|
+
// Public Variables
|
|
29
|
+
META_PIXEL_ID?: string;
|
|
30
|
+
GA4_MEASUREMENT_ID?: string;
|
|
31
|
+
TIKTOK_PIXEL_ID?: string;
|
|
32
|
+
SITE_DOMAIN?: string;
|
|
33
|
+
|
|
34
|
+
// Secrets
|
|
35
|
+
META_ACCESS_TOKEN?: string;
|
|
36
|
+
GA4_API_SECRET?: string;
|
|
37
|
+
TIKTOK_ACCESS_TOKEN?: string;
|
|
38
|
+
WA_WEBHOOK_VERIFY_TOKEN?: string;
|
|
39
|
+
// WhatsApp Cloud API — nomes canônicos (Meta Cloud API v22.0)
|
|
40
|
+
WHATSAPP_ACCESS_TOKEN?: string; // canonical: Bearer token do System User
|
|
41
|
+
WHATSAPP_PHONE_NUMBER_ID?: string; // canonical: ID numérico do número no Meta Business
|
|
42
|
+
// WhatsApp Cloud API — nomes legados (backwards compat)
|
|
43
|
+
WA_ACCESS_TOKEN?: string;
|
|
44
|
+
WA_PHONE_ID?: string;
|
|
45
|
+
WA_NOTIFY_NUMBER?: string;
|
|
46
|
+
CALLMEBOT_PHONE?: string;
|
|
47
|
+
WEBHOOK_SECRET_TICTO?: string;
|
|
48
|
+
WEBHOOK_SECRET_HOTMART?: string;
|
|
49
|
+
WEBHOOK_SECRET_KIWIFY?: string;
|
|
50
|
+
META_TEST_CODE?: string;
|
|
51
|
+
META_AD_ACCOUNT_ID?: string;
|
|
52
|
+
META_AUDIENCE_ID?: string;
|
|
53
|
+
PINTEREST_ACCESS_TOKEN?: string;
|
|
54
|
+
PINTEREST_AD_ACCOUNT_ID?: string;
|
|
55
|
+
REDDIT_ACCESS_TOKEN?: string;
|
|
56
|
+
REDDIT_AD_ACCOUNT_ID?: string;
|
|
57
|
+
LINKEDIN_ACCESS_TOKEN?: string;
|
|
58
|
+
LINKEDIN_CONVERSION_ID?: string;
|
|
59
|
+
LINKEDIN_AD_ACCOUNT_ID?: string;
|
|
60
|
+
SPOTIFY_ACCESS_TOKEN?: string;
|
|
61
|
+
SPOTIFY_AD_ACCOUNT_ID?: string;
|
|
62
|
+
|
|
63
|
+
// Email and Notification
|
|
64
|
+
RESEND_API_KEY?: string;
|
|
65
|
+
RESEND_FROM_EMAIL?: string;
|
|
66
|
+
CALLMEBOT_APIKEY?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ── Event Payload Types ───────────────────────────────────────────────────────
|
|
70
|
+
export interface TrackPayload {
|
|
71
|
+
eventName?: string;
|
|
72
|
+
eventId?: string;
|
|
73
|
+
event_id?: string;
|
|
74
|
+
userId?: string;
|
|
75
|
+
email?: string | null;
|
|
76
|
+
phone?: string | null;
|
|
77
|
+
firstName?: string | null;
|
|
78
|
+
lastName?: string | null;
|
|
79
|
+
city?: string | null;
|
|
80
|
+
state?: string | null;
|
|
81
|
+
zip?: string | null;
|
|
82
|
+
country?: string | null;
|
|
83
|
+
dob?: string | null;
|
|
84
|
+
|
|
85
|
+
// Identifiers
|
|
86
|
+
fbp?: string | null;
|
|
87
|
+
fbc?: string | null;
|
|
88
|
+
ttp?: string | null;
|
|
89
|
+
gaClientId?: string | null;
|
|
90
|
+
|
|
91
|
+
// Parameters
|
|
92
|
+
value?: number | null;
|
|
93
|
+
currency?: string | null;
|
|
94
|
+
contentIds?: string[] | null;
|
|
95
|
+
contentName?: string | null;
|
|
96
|
+
contentType?: string | null;
|
|
97
|
+
pageUrl?: string | null;
|
|
98
|
+
orderId?: string | null;
|
|
99
|
+
productName?: string | null;
|
|
100
|
+
|
|
101
|
+
// Quantum Tracking Details
|
|
102
|
+
intent_score?: string | number | null;
|
|
103
|
+
intentScoreNum?: number | null;
|
|
104
|
+
intent_bucket?: string | null;
|
|
105
|
+
intent_penalized?: boolean;
|
|
106
|
+
metaSignal?: number | null;
|
|
107
|
+
metaSignalBucket?: string | null;
|
|
108
|
+
distanceBucket?: string | null;
|
|
109
|
+
distanceKm?: number | null;
|
|
110
|
+
funnel_stage?: string | null;
|
|
111
|
+
funnelDepth?: string | null;
|
|
112
|
+
funnelLevel?: string | null;
|
|
113
|
+
internalEvent?: string | null;
|
|
114
|
+
botScore?: number | null;
|
|
115
|
+
|
|
116
|
+
// Real Estate
|
|
117
|
+
property_lat?: string | number | null;
|
|
118
|
+
propertyLat?: string | number | null;
|
|
119
|
+
property_lng?: string | number | null;
|
|
120
|
+
propertyLng?: string | number | null;
|
|
121
|
+
|
|
122
|
+
// Engagement
|
|
123
|
+
engagementScore?: number | null;
|
|
124
|
+
intentionLevel?: string | null;
|
|
125
|
+
userScore?: number | null;
|
|
126
|
+
scrollScore?: number | null;
|
|
127
|
+
timeLevel?: string | null;
|
|
128
|
+
|
|
129
|
+
// UTM
|
|
130
|
+
utmSource?: string | null;
|
|
131
|
+
utmMedium?: string | null;
|
|
132
|
+
utmCampaign?: string | null;
|
|
133
|
+
utmContent?: string | null;
|
|
134
|
+
utmTerm?: string | null;
|
|
135
|
+
utmRestored?: boolean;
|
|
136
|
+
|
|
137
|
+
// LTV
|
|
138
|
+
ltvClass?: string | null;
|
|
139
|
+
ltvScore?: number | null;
|
|
140
|
+
|
|
141
|
+
// Additional fields
|
|
142
|
+
[key: string]: any;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface BehavioralData {
|
|
146
|
+
engagement_score?: number;
|
|
147
|
+
totalScore?: number;
|
|
148
|
+
intention_level?: string;
|
|
149
|
+
user_score?: number;
|
|
150
|
+
scroll_score?: number;
|
|
151
|
+
time_level?: string;
|
|
152
|
+
email?: string | null;
|
|
153
|
+
phone?: string | null;
|
|
154
|
+
first_name?: string | null;
|
|
155
|
+
firstName?: string | null;
|
|
156
|
+
last_name?: string | null;
|
|
157
|
+
lastName?: string | null;
|
|
158
|
+
city?: string | null;
|
|
159
|
+
state?: string | null;
|
|
160
|
+
zip?: string | null;
|
|
161
|
+
dob?: string | null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ── Webhook Types ─────────────────────────────────────────────────────────────
|
|
165
|
+
export interface HotmartWebhook {
|
|
166
|
+
data?: {
|
|
167
|
+
buyer?: {
|
|
168
|
+
email?: string;
|
|
169
|
+
phone?: string;
|
|
170
|
+
name?: string;
|
|
171
|
+
};
|
|
172
|
+
purchase?: {
|
|
173
|
+
status?: string;
|
|
174
|
+
transaction?: string;
|
|
175
|
+
price?: {
|
|
176
|
+
value?: number;
|
|
177
|
+
currency_value?: string;
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
product?: {
|
|
181
|
+
id?: string;
|
|
182
|
+
ucode?: string;
|
|
183
|
+
name?: string;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
[key: string]: any;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export interface KiwifyWebhook {
|
|
190
|
+
order_status?: string;
|
|
191
|
+
order_id?: string;
|
|
192
|
+
order_value?: string;
|
|
193
|
+
Customer?: {
|
|
194
|
+
email?: string;
|
|
195
|
+
mobile?: string;
|
|
196
|
+
full_name?: string;
|
|
197
|
+
};
|
|
198
|
+
Product?: {
|
|
199
|
+
product_id?: string;
|
|
200
|
+
product_name?: string;
|
|
201
|
+
};
|
|
202
|
+
[key: string]: any;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export interface TictoWebhook {
|
|
206
|
+
status?: string;
|
|
207
|
+
customer?: {
|
|
208
|
+
email?: string;
|
|
209
|
+
phone?: string;
|
|
210
|
+
name?: string;
|
|
211
|
+
};
|
|
212
|
+
order?: {
|
|
213
|
+
hash?: string;
|
|
214
|
+
transaction_hash?: string;
|
|
215
|
+
id?: string;
|
|
216
|
+
paid_amount?: number;
|
|
217
|
+
total?: number;
|
|
218
|
+
amount?: number;
|
|
219
|
+
};
|
|
220
|
+
item?: {
|
|
221
|
+
product_id?: string;
|
|
222
|
+
product_name?: string;
|
|
223
|
+
};
|
|
224
|
+
tracking?: {
|
|
225
|
+
user_id?: string;
|
|
226
|
+
fbclid?: string;
|
|
227
|
+
utm_source?: string;
|
|
228
|
+
src?: string;
|
|
229
|
+
utm_medium?: string;
|
|
230
|
+
utm_campaign?: string;
|
|
231
|
+
utm_content?: string;
|
|
232
|
+
};
|
|
233
|
+
url_params?: {
|
|
234
|
+
user_id?: string;
|
|
235
|
+
fbclid?: string;
|
|
236
|
+
utm_source?: string;
|
|
237
|
+
src?: string;
|
|
238
|
+
utm_medium?: string;
|
|
239
|
+
utm_campaign?: string;
|
|
240
|
+
utm_content?: string;
|
|
241
|
+
};
|
|
242
|
+
[key: string]: any;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// ── Queue Message Types ───────────────────────────────────────────────────────
|
|
246
|
+
export interface QueueMessage {
|
|
247
|
+
eventType: string;
|
|
248
|
+
payload: TrackPayload;
|
|
249
|
+
platform: string;
|
|
250
|
+
attempt?: number;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ── Promise Settled Result Helpers ─────────────────────────────────────────────
|
|
254
|
+
export interface PromiseResult<T> {
|
|
255
|
+
status: 'fulfilled' | 'rejected';
|
|
256
|
+
value?: T;
|
|
257
|
+
reason?: Error | string;
|
|
258
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
name = "server-edge-tracker"
|
|
2
|
+
# Entry point: worker.js (monólito original, 100% compatível)
|
|
3
|
+
# Para usar a versão modular ES Modules: altere para main = "index.ts"
|
|
4
|
+
main = "index.ts"
|
|
5
|
+
compatibility_date = "2025-01-01"
|
|
6
|
+
compatibility_flags = ["nodejs_compat"]
|
|
7
|
+
workers_dev = true
|
|
8
|
+
|
|
9
|
+
# ── Worker Routes — same-domain tracking (imune a bloqueios) ─────────────────
|
|
10
|
+
# Substituir SEU_DOMINIO pelo domínio do cliente antes do deploy
|
|
11
|
+
# [[routes]]
|
|
12
|
+
# pattern = "SEU_DOMINIO/track*"
|
|
13
|
+
# zone_name = "SEU_DOMINIO"
|
|
14
|
+
#
|
|
15
|
+
# [[routes]]
|
|
16
|
+
# pattern = "*.SEU_DOMINIO/track*"
|
|
17
|
+
# zone_name = "SEU_DOMINIO"
|
|
18
|
+
|
|
19
|
+
[[routes]]
|
|
20
|
+
pattern = "SEU_DOMINIO/track*"
|
|
21
|
+
zone_name = "SEU_DOMINIO"
|
|
22
|
+
|
|
23
|
+
[[routes]]
|
|
24
|
+
pattern = "*.SEU_DOMINIO/track*"
|
|
25
|
+
zone_name = "SEU_DOMINIO"
|
|
26
|
+
|
|
27
|
+
# ── Variáveis públicas (não são segredos) ─────────────────────────────────────
|
|
28
|
+
[vars]
|
|
29
|
+
META_PIXEL_ID = ""
|
|
30
|
+
GA4_MEASUREMENT_ID = ""
|
|
31
|
+
TIKTOK_PIXEL_ID = ""
|
|
32
|
+
SITE_DOMAIN = "SEU_DOMINIO"
|
|
33
|
+
|
|
34
|
+
# ── Banco D1 ──────────────────────────────────────────────────────────────────
|
|
35
|
+
# Após criar o banco com "wrangler d1 create cdp-edge-db",
|
|
36
|
+
# substitua o database_id pelo ID retornado no terminal.
|
|
37
|
+
[[d1_databases]]
|
|
38
|
+
binding = "DB"
|
|
39
|
+
database_name = "cdp-edge-db"
|
|
40
|
+
database_id = "7867d38f-5fa8-4c17-b465-386211422c09"
|
|
41
|
+
|
|
42
|
+
# ── Queues — Retry + Dead Letter Queue ───────────────────────────────────────
|
|
43
|
+
# Produtor: worker envia eventos com falha para cdp-edge-retry
|
|
44
|
+
# Consumidor: worker processa a fila e reaplica; falhas vão para cdp-edge-dlq
|
|
45
|
+
# Criar com: wrangler queues create cdp-edge-retry
|
|
46
|
+
# wrangler queues create cdp-edge-dlq
|
|
47
|
+
[[queues.producers]]
|
|
48
|
+
binding = "RETRY_QUEUE"
|
|
49
|
+
queue = "cdp-edge-retry"
|
|
50
|
+
|
|
51
|
+
[[queues.consumers]]
|
|
52
|
+
queue = "cdp-edge-retry"
|
|
53
|
+
max_batch_size = 10
|
|
54
|
+
max_batch_timeout = 30
|
|
55
|
+
max_retries = 3
|
|
56
|
+
dead_letter_queue = "cdp-edge-dlq"
|
|
57
|
+
|
|
58
|
+
# ── KV Namespace — Geo/Session Cache ─────────────────────────────────────────
|
|
59
|
+
# Cache de geolocalização e sessões recentes (TTL: 1h por padrão)
|
|
60
|
+
# Criar com: wrangler kv namespace create GEO_CACHE
|
|
61
|
+
# wrangler kv namespace create GEO_CACHE --preview
|
|
62
|
+
[[kv_namespaces]]
|
|
63
|
+
binding = "GEO_CACHE"
|
|
64
|
+
id = "821b6c1ccb4b475985439b801c1fdbe0"
|
|
65
|
+
preview_id = "d2d9198f47e340ee905a8dc566b09e95"
|
|
66
|
+
|
|
67
|
+
# ── R2 Bucket — Audit Logs ────────────────────────────────────────────────────
|
|
68
|
+
# Logs imutáveis por evento: logs/YYYY/MM/DD/{timestamp}_{eventName}.json
|
|
69
|
+
# Sem PII — apenas userId, eventId, ltvClass, UTMs, geo
|
|
70
|
+
[[r2_buckets]]
|
|
71
|
+
binding = "AUDIT_LOGS"
|
|
72
|
+
bucket_name = "cdp-edge-logs"
|
|
73
|
+
|
|
74
|
+
# ── Cron Triggers — Intelligence Agent ───────────────────────────────────────
|
|
75
|
+
# Semanal: domingo 02:00 UTC — check de versões de API + relatório diário
|
|
76
|
+
# Mensal: 1º do mês 03:00 UTC — auditoria de taxa de erro + alertas críticos
|
|
77
|
+
[triggers]
|
|
78
|
+
crons = ["0 2 * * 7", "0 3 1 * *"]
|
|
79
|
+
|
|
80
|
+
# ── Cloudflare Workers AI ─────────────────────────────────────────────────────
|
|
81
|
+
# Habilita env.AI para LTV Prediction (Fase 4)
|
|
82
|
+
# Plano gratuito inclui 10.000 neurônios/dia — suficiente para enrichment
|
|
83
|
+
[ai]
|
|
84
|
+
binding = "AI"
|
|
85
|
+
|
|
86
|
+
# ── Rate Limiting — proteção do /track contra abuso de cota ──────────────────
|
|
87
|
+
# Bloqueia na borda ANTES de qualquer processamento do Worker
|
|
88
|
+
# Limite: 60 requisições por minuto por IP (generoso para usuário real)
|
|
89
|
+
# Requer Workers Paid plan ($5/mês) — remover bloco se usar plano free
|
|
90
|
+
[[unsafe.bindings]]
|
|
91
|
+
name = "RATE_LIMITER"
|
|
92
|
+
type = "ratelimit"
|
|
93
|
+
namespace_id = "1001"
|
|
94
|
+
|
|
95
|
+
[unsafe.bindings.simple]
|
|
96
|
+
limit = 60
|
|
97
|
+
period = 60
|
|
98
|
+
|
|
99
|
+
# ── Observabilidade — Logs + Traces persistidos no painel Cloudflare ─────────
|
|
100
|
+
[observability]
|
|
101
|
+
enabled = false
|
|
102
|
+
head_sampling_rate = 1
|
|
103
|
+
|
|
104
|
+
[observability.logs]
|
|
105
|
+
enabled = true
|
|
106
|
+
head_sampling_rate = 1
|
|
107
|
+
persist = true
|
|
108
|
+
invocation_logs = true
|
|
109
|
+
|
|
110
|
+
[observability.traces]
|
|
111
|
+
enabled = false
|
|
112
|
+
persist = true
|
|
113
|
+
head_sampling_rate = 1
|
|
114
|
+
|
|
115
|
+
# ── Secrets (NÃO ficam aqui — configurar via CLI) ─────────────────────────────
|
|
116
|
+
# wrangler secret put META_ACCESS_TOKEN ← token Meta CAPI (obrigatório)
|
|
117
|
+
# wrangler secret put GA4_API_SECRET ← secret GA4 Measurement Protocol (obrigatório)
|
|
118
|
+
# wrangler secret put TIKTOK_ACCESS_TOKEN ← token TikTok Events API (opcional)
|
|
119
|
+
# wrangler secret put META_TEST_CODE ← só para testes (remover em produção)
|
|
120
|
+
# wrangler secret put META_AD_ACCOUNT_ID ← ID da conta de anúncios Meta (act_XXXXXXXXX) — Customer Match
|
|
121
|
+
# wrangler secret put META_AUDIENCE_ID ← ID da Custom Audience Meta — Customer Match automático
|
|
122
|
+
# wrangler secret put WHATSAPP_TOKEN ← Token WhatsApp Cloud API (Meta Business Suite)
|
|
123
|
+
# wrangler secret put WHATSAPP_PHONE_NUMBER_ID ← ID do número WhatsApp (Meta Business Suite → Phone Numbers)
|
|
124
|
+
# wrangler secret put RESEND_API_KEY ← API Key do Resend (resend.com)
|
|
125
|
+
# wrangler secret put RESEND_FROM_EMAIL ← Remetente verificado ex: "CDP Edge <noreply@seudominio.com.br>"
|
|
126
|
+
# wrangler secret put WA_WEBHOOK_VERIFY_TOKEN ← Token de verificação do webhook WhatsApp (você define — qualquer string segura)
|
|
127
|
+
# wrangler secret put WEBHOOK_SECRET_TICTO ← HMAC-SHA256 Ticto
|
|
128
|
+
# wrangler secret put PINTEREST_ACCESS_TOKEN ← Bearer token Pinterest Conversions API
|
|
129
|
+
# wrangler secret put PINTEREST_AD_ACCOUNT_ID ← ID da conta de anúncios Pinterest (ex: 549755813XXX)
|
|
130
|
+
# wrangler secret put REDDIT_ACCESS_TOKEN ← Bearer token Reddit Conversions API
|
|
131
|
+
# wrangler secret put REDDIT_AD_ACCOUNT_ID ← ID da conta de anúncios Reddit (ex: t2_XXXXXXX)
|
|
132
|
+
# wrangler secret put LINKEDIN_ACCESS_TOKEN ← OAuth2 Bearer token LinkedIn Marketing API
|
|
133
|
+
# wrangler secret put LINKEDIN_CONVERSION_ID ← ID da conversão LinkedIn (ex: 12345678)
|
|
134
|
+
# wrangler secret put LINKEDIN_AD_ACCOUNT_ID ← ID da conta de anúncios LinkedIn
|
|
135
|
+
# wrangler secret put SPOTIFY_ACCESS_TOKEN ← Bearer token Spotify Advertising API
|
|
136
|
+
# wrangler secret put SPOTIFY_AD_ACCOUNT_ID ← ID da conta de anúncios Spotify Ads
|