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.
Files changed (176) hide show
  1. package/README.md +324 -0
  2. package/bin/cdp-edge.js +71 -0
  3. package/contracts/agent-versions.json +679 -0
  4. package/contracts/api-versions.json +372 -0
  5. package/contracts/types.ts +81 -0
  6. package/dist/commands/analyze.js +52 -0
  7. package/dist/commands/infra.js +54 -0
  8. package/dist/commands/install.js +191 -0
  9. package/dist/commands/server.js +174 -0
  10. package/dist/commands/setup.js +355 -0
  11. package/dist/commands/validate.js +248 -0
  12. package/dist/index.js +12 -0
  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/CI-CD-SETUP.md +217 -0
  17. package/docs/events-reference.md +359 -0
  18. package/docs/installation.md +155 -0
  19. package/docs/quick-start.md +185 -0
  20. package/docs/sdk-reference.md +371 -0
  21. package/docs/whatsapp-ctwa.md +210 -0
  22. package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
  23. package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
  24. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +683 -0
  25. package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +513 -0
  26. package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
  27. package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
  28. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
  29. package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
  30. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
  31. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
  32. package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
  33. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +66 -0
  34. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +364 -0
  35. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
  36. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2097 -0
  37. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1459 -0
  38. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
  39. package/extracted-skill/tracking-events-generator/agents/database-agent.md +668 -0
  40. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
  41. package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
  42. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +238 -0
  43. package/extracted-skill/tracking-events-generator/agents/email-agent.md +88 -0
  44. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +257 -0
  45. package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
  46. package/extracted-skill/tracking-events-generator/agents/google-agent.md +235 -0
  47. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +525 -0
  48. package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
  49. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +173 -0
  50. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
  51. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
  52. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +960 -0
  53. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +2154 -0
  54. package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
  55. package/extracted-skill/tracking-events-generator/agents/memory-agent.json +25 -0
  56. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +878 -0
  57. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +118 -0
  58. package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +749 -0
  59. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +272 -0
  60. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1167 -0
  61. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1442 -0
  62. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +318 -0
  63. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
  64. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +258 -0
  65. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +321 -0
  66. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1861 -0
  67. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
  68. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +391 -0
  69. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +182 -0
  70. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +459 -0
  71. package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
  72. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +271 -0
  73. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +177 -0
  74. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +129 -0
  75. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +707 -0
  76. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +537 -0
  77. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
  78. package/extracted-skill/tracking-events-generator/cdpTrack.js +640 -0
  79. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +372 -0
  80. package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
  81. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
  82. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
  83. package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
  84. package/extracted-skill/tracking-events-generator/knowledge-base.md +3066 -0
  85. package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
  86. package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
  87. package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
  88. package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
  89. package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
  90. package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
  91. package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
  92. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
  93. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
  94. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
  95. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +132 -0
  96. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
  97. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
  98. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
  99. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
  100. package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
  101. package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
  102. package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
  103. package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
  104. package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
  105. package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
  106. package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
  107. package/package.json +89 -0
  108. package/scripts/build-sdk.js +106 -0
  109. package/server-edge-tracker/.client.env.example +14 -0
  110. package/server-edge-tracker/INSTALAR.md +527 -0
  111. package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
  112. package/server-edge-tracker/config/utm-mapping.json +64 -0
  113. package/server-edge-tracker/deploy-client.cjs +76 -0
  114. package/server-edge-tracker/index.ts +1164 -0
  115. package/server-edge-tracker/migrate-new-db.sql +137 -0
  116. package/server-edge-tracker/migrate-v2.sql +16 -0
  117. package/server-edge-tracker/migrate-v3.sql +6 -0
  118. package/server-edge-tracker/migrate-v4.sql +18 -0
  119. package/server-edge-tracker/migrate-v5.sql +17 -0
  120. package/server-edge-tracker/migrate-v6.sql +24 -0
  121. package/server-edge-tracker/migrate-v7.sql +64 -0
  122. package/server-edge-tracker/migrate.sql +111 -0
  123. package/server-edge-tracker/modules/db.ts +702 -0
  124. package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
  125. package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
  126. package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
  127. package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
  128. package/server-edge-tracker/modules/dispatch/whatsapp.ts +279 -0
  129. package/server-edge-tracker/modules/intelligence.ts +589 -0
  130. package/server-edge-tracker/modules/ml/bidding.ts +247 -0
  131. package/server-edge-tracker/modules/ml/fraud.ts +302 -0
  132. package/server-edge-tracker/modules/ml/logistic.ts +226 -0
  133. package/server-edge-tracker/modules/ml/ltv.ts +531 -0
  134. package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
  135. package/server-edge-tracker/modules/ml/quiz.ts +343 -0
  136. package/server-edge-tracker/modules/ml/roas.ts +255 -0
  137. package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
  138. package/server-edge-tracker/modules/nurture.ts +257 -0
  139. package/server-edge-tracker/modules/utils.ts +311 -0
  140. package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -0
  141. package/server-edge-tracker/schema-ab-ltv.sql +97 -0
  142. package/server-edge-tracker/schema-bidding.sql +86 -0
  143. package/server-edge-tracker/schema-fraud.sql +90 -0
  144. package/server-edge-tracker/schema-indexes.sql +67 -0
  145. package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
  146. package/server-edge-tracker/schema-quiz.sql +52 -0
  147. package/server-edge-tracker/schema-sales-engine.sql +113 -0
  148. package/server-edge-tracker/schema-segmentation.sql +219 -0
  149. package/server-edge-tracker/schema-utm.sql +82 -0
  150. package/server-edge-tracker/schema.sql +265 -0
  151. package/server-edge-tracker/types.ts +258 -0
  152. package/server-edge-tracker/wrangler.toml +136 -0
  153. package/templates/afiliado-sem-landing.md +312 -0
  154. package/templates/captura-de-lead.md +78 -0
  155. package/templates/captura-lead-evento-externo.md +99 -0
  156. package/templates/checkout-proprio.md +111 -0
  157. package/templates/install/.claude/commands/cdp.md +1 -0
  158. package/templates/install/CLAUDE.md +65 -0
  159. package/templates/lancamento-imobiliario.md +344 -0
  160. package/templates/linkedin/tag-template.js +46 -0
  161. package/templates/multi-step-checkout.md +672 -0
  162. package/templates/pagina-obrigado.md +55 -0
  163. package/templates/pinterest/conversions-api-template.js +144 -0
  164. package/templates/pinterest/event-mappings.json +48 -0
  165. package/templates/pinterest/tag-template.js +28 -0
  166. package/templates/quiz-funnel.md +132 -0
  167. package/templates/reddit/conversions-api-template.js +205 -0
  168. package/templates/reddit/event-mappings.json +56 -0
  169. package/templates/reddit/pixel-template.js +19 -0
  170. package/templates/scenarios/behavior-engine.js +425 -0
  171. package/templates/scenarios/real-estate-logic.md +50 -0
  172. package/templates/scenarios/sales-page-logic.md +50 -0
  173. package/templates/spotify/pixel-template.js +46 -0
  174. package/templates/trafego-direto.md +582 -0
  175. package/templates/vsl-page.md +292 -0
  176. 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