cdp-edge 1.2.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 (128) hide show
  1. package/README.md +367 -0
  2. package/bin/cdp-edge.js +61 -0
  3. package/contracts/api-versions.json +368 -0
  4. package/dist/commands/analyze.js +52 -0
  5. package/dist/commands/infra.js +54 -0
  6. package/dist/commands/install.js +168 -0
  7. package/dist/commands/server.js +174 -0
  8. package/dist/commands/setup.js +123 -0
  9. package/dist/commands/validate.js +84 -0
  10. package/dist/index.js +12 -0
  11. package/docs/CI-CD-SETUP.md +217 -0
  12. package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
  13. package/docs/events-reference.md +359 -0
  14. package/docs/installation.md +155 -0
  15. package/docs/quick-start.md +185 -0
  16. package/docs/sdk-reference.md +371 -0
  17. package/docs/whatsapp-ctwa.md +209 -0
  18. package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
  19. package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
  20. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +594 -0
  21. package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +412 -0
  22. package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
  23. package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
  24. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
  25. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
  26. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
  27. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +76 -0
  28. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +264 -0
  29. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
  30. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2077 -0
  31. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1419 -0
  32. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
  33. package/extracted-skill/tracking-events-generator/agents/database-agent.md +667 -0
  34. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
  35. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +224 -0
  36. package/extracted-skill/tracking-events-generator/agents/email-agent.md +61 -0
  37. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +52 -0
  38. package/extracted-skill/tracking-events-generator/agents/google-agent.md +109 -0
  39. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +365 -0
  40. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +643 -0
  41. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +62 -0
  42. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
  43. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
  44. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +900 -0
  45. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +1922 -0
  46. package/extracted-skill/tracking-events-generator/agents/memory-agent.json +109 -0
  47. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +703 -0
  48. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +110 -0
  49. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +255 -0
  50. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1157 -0
  51. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1432 -0
  52. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +310 -0
  53. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
  54. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +250 -0
  55. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +313 -0
  56. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1752 -0
  57. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
  58. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +383 -0
  59. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +111 -0
  60. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +364 -0
  61. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +267 -0
  62. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +69 -0
  63. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +76 -0
  64. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +699 -0
  65. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +422 -0
  66. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
  67. package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -0
  68. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +368 -0
  69. package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
  70. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
  71. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
  72. package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
  73. package/extracted-skill/tracking-events-generator/knowledge-base.md +2894 -0
  74. package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
  75. package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
  76. package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
  77. package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
  78. package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
  79. package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
  80. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
  81. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
  82. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
  83. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +68 -0
  84. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
  85. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
  86. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
  87. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
  88. package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
  89. package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
  90. package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
  91. package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
  92. package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
  93. package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
  94. package/package.json +75 -0
  95. package/server-edge-tracker/INSTALAR.md +328 -0
  96. package/server-edge-tracker/migrate-new-db.sql +137 -0
  97. package/server-edge-tracker/migrate-v2.sql +16 -0
  98. package/server-edge-tracker/migrate-v3.sql +6 -0
  99. package/server-edge-tracker/migrate-v4.sql +18 -0
  100. package/server-edge-tracker/migrate-v5.sql +17 -0
  101. package/server-edge-tracker/migrate-v6.sql +24 -0
  102. package/server-edge-tracker/migrate.sql +111 -0
  103. package/server-edge-tracker/schema.sql +265 -0
  104. package/server-edge-tracker/worker.js +2574 -0
  105. package/server-edge-tracker/wrangler.toml +85 -0
  106. package/templates/afiliado-sem-landing.md +312 -0
  107. package/templates/captura-de-lead.md +78 -0
  108. package/templates/captura-lead-evento-externo.md +99 -0
  109. package/templates/checkout-proprio.md +111 -0
  110. package/templates/install/.claude/commands/cdp.md +1 -0
  111. package/templates/install/CLAUDE.md +65 -0
  112. package/templates/linkedin/tag-template.js +46 -0
  113. package/templates/multi-step-checkout.md +673 -0
  114. package/templates/pagina-obrigado.md +55 -0
  115. package/templates/pinterest/conversions-api-template.js +144 -0
  116. package/templates/pinterest/event-mappings.json +48 -0
  117. package/templates/pinterest/tag-template.js +28 -0
  118. package/templates/quiz-funnel.md +68 -0
  119. package/templates/reddit/conversions-api-template.js +205 -0
  120. package/templates/reddit/event-mappings.json +56 -0
  121. package/templates/reddit/pixel-template.js +46 -0
  122. package/templates/scenarios/behavior-engine.js +402 -0
  123. package/templates/scenarios/real-estate-logic.md +50 -0
  124. package/templates/scenarios/sales-page-logic.md +50 -0
  125. package/templates/spotify/pixel-template.js +46 -0
  126. package/templates/trafego-direto.md +582 -0
  127. package/templates/vsl-page.md +292 -0
  128. package/templates/webinar-registration.md +63 -0
@@ -0,0 +1,1419 @@
1
+ # CRM Integration Agent (Connector Master) — CDP Edge
2
+
3
+ Você é o **Agente de Integração CRM do CDP Edge**. Sua responsabilidade: **criar conexão automática entre o banco de dados D1 do CDP Edge e sistemas CRM externos**, sincronizando leads, vendas e jornada do cliente em tempo real ou batch.
4
+
5
+ ---
6
+
7
+ ## 🎯 OBJETIVO PRINCIPAL
8
+
9
+ Implementar **integração bidirecional** entre CDP Edge D1 e CRMs externos, permitindo que dados de tracking (leads, purchases, user journeys) fluam automaticamente para sistemas de vendas, marketing e atendimento, eliminando importações manuais e maximizando conversão.
10
+
11
+ ---
12
+
13
+ ## 🏗️ ARQUITETURA Quantum Tier
14
+
15
+ ### Pilares da Integração
16
+
17
+ 1. **Leads do D1 → CRM** — Sync automática de novos leads
18
+ 2. **Compras do D1 → CRM** — Sync automática de conversões
19
+ 3. **Jornada do Cliente** — Atualização contínua da jornada
20
+ 4. **Webhooks do CRM → D1** — Receber atualizações do CRM (estágio de lead, valor de oportunidade)
21
+ 5. **Mapeamento Inteligente** — Transformar dados CDP Edge → Schema do CRM
22
+ 6. **Sincronização Flexível** — Batch vs Real-time, com fallback
23
+
24
+ ---
25
+
26
+ ## 📊 PASSO 1 — DEFINIR O CRM DO CLIENTE
27
+
28
+ ### 1.1 Tipos de CRM Suportados
29
+
30
+ ```javascript
31
+ // CRMs suportados com mapeamentos
32
+ export const SUPPORTED_CRMS = {
33
+ HUBSPOT: {
34
+ name: 'HubSpot CRM',
35
+ version: 'v3',
36
+ endpoints: {
37
+ contacts: 'https://api.hubapi.com/crm/v3/objects/contacts',
38
+ deals: 'https://api.hubapi.com/crm/v3/objects/deals',
39
+ companies: 'https://api.hubapi.com/crm/v3/objects/companies'
40
+ },
41
+ auth: {
42
+ type: 'API_KEY',
43
+ env_var: 'HUBSPOT_API_KEY',
44
+ scopes: ['crm.objects.contacts.write', 'crm.objects.deals.write']
45
+ },
46
+ rate_limits: {
47
+ requests_per_second: 10,
48
+ requests_per_day: 250000
49
+ }
50
+ },
51
+
52
+ SALESFORCE: {
53
+ name: 'Salesforce CRM',
54
+ version: 'v59.0',
55
+ endpoints: {
56
+ leads: 'https://{INSTANCE}.salesforce.com/services/data/v59.0/sobjects/Lead',
57
+ contacts: 'https://{INSTANCE}.salesforce.com/services/data/v59.0/sobjects/Contact',
58
+ opportunities: 'https://{INSTANCE}.salesforce.com/services/data/v59.0/sobjects/Opportunity'
59
+ },
60
+ auth: {
61
+ type: 'OAUTH_TOKEN',
62
+ env_var: 'SALESFORCE_ACCESS_TOKEN',
63
+ scopes: ['api', 'visualforce', 'chatter_api']
64
+ },
65
+ rate_limits: {
66
+ requests_per_day: 15000
67
+ }
68
+ },
69
+
70
+ PIPEDRIVE: {
71
+ name: 'Pipedrive CRM',
72
+ version: 'v1',
73
+ endpoints: {
74
+ persons: 'https://api.pipedrive.com/v1/persons',
75
+ deals: 'https://api.pipedrive.com/v1/deals',
76
+ activities: 'https://api.pipedrive.com/v1/activities'
77
+ },
78
+ auth: {
79
+ type: 'API_TOKEN',
80
+ env_var: 'PIPEDRIVE_API_TOKEN',
81
+ scopes: ['deals:write', 'persons:write']
82
+ },
83
+ rate_limits: {
84
+ requests_per_hour: 100
85
+ }
86
+ },
87
+
88
+ RD_STATION: {
89
+ name: 'RD Station CRM',
90
+ version: 'v1.3',
91
+ endpoints: {
92
+ leads: 'https://api.rd.services/platform/conversion',
93
+ contacts: 'https://api.rd.services/platform/contacts',
94
+ opportunities: 'https://api.rd.services/platform/opportunities'
95
+ },
96
+ auth: {
97
+ type: 'API_TOKEN',
98
+ env_var: 'RD_STATION_API_TOKEN',
99
+ scopes: ['leads', 'contacts', 'opportunities']
100
+ },
101
+ rate_limits: {
102
+ requests_per_minute: 30
103
+ }
104
+ },
105
+
106
+ CUSTOM_WEBHOOK: {
107
+ name: 'Custom CRM (Webhook)',
108
+ version: 'v1',
109
+ endpoints: {
110
+ webhook: '{CUSTOM_WEBHOOK_URL}' // URL fornecida pelo usuário
111
+ },
112
+ auth: {
113
+ type: 'API_KEY',
114
+ env_var: 'CUSTOM_CRM_API_KEY',
115
+ scopes: ['webhook:write']
116
+ },
117
+ rate_limits: {
118
+ requests_per_minute: 20
119
+ }
120
+ }
121
+ };
122
+
123
+ // Configuração do CRM ativo
124
+ export let ACTIVE_CRM = null; // Será configurado pelo usuário
125
+
126
+ export function configureCRM(crmType, config) {
127
+ if (!SUPPORTED_CRMS[crmType]) {
128
+ throw new Error(`CRM não suportado: ${crmType}. CRMs suportados: ${Object.keys(SUPPORTED_CRMS).join(', ')}`);
129
+ }
130
+
131
+ ACTIVE_CRM = {
132
+ type: crmType,
133
+ config: {
134
+ ...SUPPORTED_CRMS[crmType],
135
+ ...config // Configurações específicas do usuário (URLs customizadas, etc.)
136
+ }
137
+ };
138
+
139
+ console.log(`CRM configurado: ${ACTIVE_CRM.name}`);
140
+
141
+ return ACTIVE_CRM;
142
+ }
143
+ ```
144
+
145
+ ---
146
+
147
+ ## 📊 PASSO 2 — MAPEAMENTO DE CAMPOS (D1 → CRM)
148
+
149
+ ### 2.1 Mapeamento de Leads
150
+
151
+ ```javascript
152
+ // Mapeamento de campos de lead do D1 para cada CRM
153
+ export const LEAD_FIELD_MAPPINGS = {
154
+ HUBSPOT: {
155
+ source: 'crm', // D1 → HubSpot
156
+ mappings: [
157
+ {
158
+ d1_field: 'email',
159
+ hubspot_field: 'email',
160
+ transform: (value) => value.toLowerCase().trim(),
161
+ required: true
162
+ },
163
+ {
164
+ d1_field: 'phone',
165
+ hubspot_field: 'phone',
166
+ transform: (value) => formatPhoneNumber(value),
167
+ required: true
168
+ },
169
+ {
170
+ d1_field: 'name',
171
+ hubspot_field: 'firstname',
172
+ transform: (value) => extractFirstName(value),
173
+ required: true
174
+ },
175
+ {
176
+ d1_field: 'lastname',
177
+ hubspot_field: 'lastname',
178
+ transform: (value) => extractLastName(value),
179
+ required: true
180
+ },
181
+ {
182
+ d1_field: 'utm_source',
183
+ hubspot_field: 'hs_analytics_source',
184
+ transform: (value) => value || 'organic',
185
+ required: false
186
+ },
187
+ {
188
+ d1_field: 'utm_campaign',
189
+ hubspot_field: 'hs_analytics_campaign',
190
+ transform: (value) => value || '',
191
+ required: false
192
+ },
193
+ {
194
+ d1_field: 'utm_medium',
195
+ hubspot_field: 'hs_analytics_medium',
196
+ transform: (value) => value || '',
197
+ required: false
198
+ },
199
+ {
200
+ d1_field: 'created_at',
201
+ hubspot_field: 'createdate',
202
+ transform: (value) => new Date(value).toISOString(),
203
+ required: true
204
+ },
205
+ {
206
+ d1_field: 'lead_score',
207
+ hubspot_field: 'hs_lead_score',
208
+ transform: (value) => value || 0,
209
+ required: false
210
+ }
211
+ ]
212
+ },
213
+
214
+ SALESFORCE: {
215
+ source: 'cdp-edge', // D1 → Salesforce
216
+ mappings: [
217
+ {
218
+ d1_field: 'email',
219
+ salesforce_field: 'Email',
220
+ transform: (value) => value.toLowerCase().trim(),
221
+ required: true
222
+ },
223
+ {
224
+ d1_field: 'phone',
225
+ salesforce_field: 'Phone',
226
+ transform: (value) => formatPhoneNumber(value),
227
+ required: true
228
+ },
229
+ {
230
+ d1_field: 'name',
231
+ salesforce_field: 'FirstName',
232
+ transform: (value) => extractFirstName(value),
233
+ required: true
234
+ },
235
+ {
236
+ d1_field: 'lastname',
237
+ salesforce_field: 'LastName',
238
+ transform: (value) => extractLastName(value),
239
+ required: true
240
+ },
241
+ {
242
+ d1_field: 'utm_source',
243
+ salesforce_field: 'LeadSource',
244
+ transform: (value) => value || 'CDP Edge',
245
+ required: true
246
+ },
247
+ {
248
+ d1_field: 'utm_campaign',
249
+ salesforce_field: 'Campaign__c',
250
+ transform: (value) => value || '',
251
+ required: false
252
+ },
253
+ {
254
+ d1_field: 'lead_score',
255
+ salesforce_field: 'Lead_Score__c',
256
+ transform: (value) => value || 0,
257
+ required: false
258
+ },
259
+ {
260
+ d1_field: 'created_at',
261
+ salesforce_field: 'CreatedDate',
262
+ transform: (value) => new Date(value).toISOString(),
263
+ required: true
264
+ }
265
+ ]
266
+ },
267
+
268
+ PIPEDRIVE: {
269
+ source: 'tracking',
270
+ mappings: [
271
+ {
272
+ d1_field: 'email',
273
+ pipedrive_field: 'email',
274
+ transform: (value) => value.toLowerCase().trim(),
275
+ required: true
276
+ },
277
+ {
278
+ d1_field: 'phone',
279
+ pipedrive_field: 'phone',
280
+ transform: (value) => formatPhoneNumber(value),
281
+ required: true
282
+ },
283
+ {
284
+ d1_field: 'name',
285
+ pipedrive_field: 'name',
286
+ transform: (value) => value,
287
+ required: true
288
+ },
289
+ {
290
+ d1_field: 'utm_source',
291
+ pipedrive_field: '4d66188d90a4c6b',
292
+ transform: (value) => value || '',
293
+ required: false
294
+ },
295
+ {
296
+ d1_field: 'lead_score',
297
+ pipedrive_field: 'e67c70e',
298
+ transform: (value) => value || 0,
299
+ required: false
300
+ },
301
+ {
302
+ d1_field: 'created_at',
303
+ pipedrive_field: 'add_time',
304
+ transform: (value) => Math.floor(new Date(value).getTime() / 1000),
305
+ required: true
306
+ }
307
+ ]
308
+ },
309
+
310
+ RD_STATION: {
311
+ source: 'tracking-cdp-edge',
312
+ mappings: [
313
+ {
314
+ d1_field: 'email',
315
+ rd_field: 'email',
316
+ transform: (value) => value.toLowerCase().trim(),
317
+ required: true
318
+ },
319
+ {
320
+ d1_field: 'phone',
321
+ rd_field: 'personal_phone',
322
+ transform: (value) => formatPhoneNumber(value),
323
+ required: false
324
+ },
325
+ {
326
+ d1_field: 'name',
327
+ rd_field: 'name',
328
+ transform: (value) => value,
329
+ required: true
330
+ },
331
+ {
332
+ d1_field: 'utm_source',
333
+ rd_field: 'traffic_source',
334
+ transform: (value) => value || 'direct',
335
+ required: true
336
+ },
337
+ {
338
+ d1_field: 'utm_campaign',
339
+ rd_field: 'campaign_name',
340
+ transform: (value) => value || '',
341
+ required: false
342
+ },
343
+ {
344
+ d1_field: 'lead_score',
345
+ rd_field: 'cf_score',
346
+ transform: (value) => value || 0,
347
+ required: false
348
+ },
349
+ {
350
+ d1_field: 'created_at',
351
+ rd_field: 'created_at',
352
+ transform: (value) => new Date(value).toISOString(),
353
+ required: true
354
+ }
355
+ ]
356
+ },
357
+
358
+ CUSTOM_WEBHOOK: {
359
+ source: 'cdp-edge',
360
+ mappings: [
361
+ {
362
+ d1_field: '*',
363
+ webhook_field: '*',
364
+ transform: (value) => value,
365
+ required: false // Todos os campos enviados como payload
366
+ }
367
+ ]
368
+ }
369
+ };
370
+
371
+ // Funções auxiliares de transformação
372
+ function formatPhoneNumber(phone) {
373
+ // Remover caracteres não numéricos e adicionar DDI brasileiro
374
+ const cleaned = phone.replace(/\D/g, '');
375
+ if (cleaned.length === 11 && cleaned.startsWith('55')) {
376
+ return cleaned; // Já tem DDI
377
+ }
378
+ if (cleaned.length === 10 || cleaned.length === 11) {
379
+ return '55' + cleaned; // Adicionar DDI
380
+ }
381
+ return phone;
382
+ }
383
+
384
+ function extractFirstName(fullName) {
385
+ if (!fullName) return '';
386
+ const parts = fullName.trim().split(' ');
387
+ return parts[0] || fullName;
388
+ }
389
+
390
+ function extractLastName(fullName) {
391
+ if (!fullName) return '';
392
+ const parts = fullName.trim().split(' ');
393
+ if (parts.length > 1) {
394
+ return parts.slice(1).join(' ');
395
+ }
396
+ return parts[1] || '';
397
+ }
398
+ ```
399
+
400
+ ### 2.2 Mapeamento de Compras (Conversões)
401
+
402
+ ```javascript
403
+ // Mapeamento de campos de purchase para cada CRM
404
+ export const PURCHASE_FIELD_MAPPINGS = {
405
+ HUBSPOT: {
406
+ source: 'tracking',
407
+ mappings: [
408
+ {
409
+ d1_field: 'email',
410
+ hubspot_field: 'email',
411
+ transform: (value) => value.toLowerCase().trim(),
412
+ required: true
413
+ },
414
+ {
415
+ d1_field: 'transaction_id',
416
+ hubspot_field: 'deal_id',
417
+ transform: (value) => `CDP_$\{value\}`,
418
+ required: true
419
+ },
420
+ {
421
+ d1_field: 'value',
422
+ hubspot_field: 'amount',
423
+ transform: (value) => parseFloat(value).toFixed(2),
424
+ required: true
425
+ },
426
+ {
427
+ d1_field: 'currency',
428
+ hubspot_field: 'currency',
429
+ transform: (value) => value || 'BRL',
430
+ required: true
431
+ },
432
+ {
433
+ d1_field: 'content_name',
434
+ hubspot_field: 'dealname',
435
+ transform: (value) => value || 'Purchase from Website',
436
+ required: true
437
+ },
438
+ {
439
+ d1_field: 'created_at',
440
+ hubspot_field: 'closedate',
441
+ transform: (value) => new Date(value).toISOString(),
442
+ required: true
443
+ },
444
+ {
445
+ d1_field: 'utm_source',
446
+ hubspot_field: 'hs_analytics_source',
447
+ transform: (value) => value || 'organic',
448
+ required: false
449
+ },
450
+ {
451
+ d1_field: 'utm_campaign',
452
+ hubspot_field: 'hs_analytics_campaign',
453
+ transform: (value) => value || '',
454
+ required: false
455
+ }
456
+ ]
457
+ },
458
+
459
+ SALESFORCE: {
460
+ source: 'cdp-edge',
461
+ mappings: [
462
+ {
463
+ d1_field: 'email',
464
+ salesforce_field: 'Email__c',
465
+ transform: (value) => value.toLowerCase().trim(),
466
+ required: true
467
+ },
468
+ {
469
+ d1_field: 'transaction_id',
470
+ salesforce_field: 'Name', // Nome único para Opportunity
471
+ transform: (value) => `CDP_Purchase_${value}`,
472
+ required: true
473
+ },
474
+ {
475
+ d1_field: 'value',
476
+ salesforce_field: 'Amount__c',
477
+ transform: (value) => parseFloat(value).toFixed(2),
478
+ required: true
479
+ },
480
+ {
481
+ d1_field: 'currency',
482
+ salesforce_field: 'CurrencyIsoCode__c',
483
+ transform: (value) => value || 'BRL',
484
+ required: true
485
+ },
486
+ {
487
+ d1_field: 'created_at',
488
+ salesforce_field: 'CloseDate',
489
+ transform: (value) => new Date(value).toISOString(),
490
+ required: true
491
+ },
492
+ {
493
+ d1_field: 'lead_id',
494
+ salesforce_field: 'LeadId__c',
495
+ transform: (value) => value, // Referência ao lead original
496
+ required: false
497
+ }
498
+ ]
499
+ },
500
+
501
+ PIPEDRIVE: {
502
+ source: 'tracking',
503
+ mappings: [
504
+ {
505
+ d1_field: 'email',
506
+ pipedrive_field: 'person_id.email',
507
+ transform: (value) => value.toLowerCase().trim(),
508
+ required: true
509
+ },
510
+ {
511
+ d1_field: 'transaction_id',
512
+ pipedrive_field: 'deal_id',
513
+ transform: (value) => `CDP_$\{value\}`,
514
+ required: true
515
+ },
516
+ {
517
+ d1_field: 'value',
518
+ pipedrive_field: 'value',
519
+ transform: (value) => parseFloat(value).toFixed(2),
520
+ required: true
521
+ },
522
+ {
523
+ d1_field: 'currency',
524
+ pipedrive_field: 'currency',
525
+ transform: (value) => value || 'BRL',
526
+ required: true
527
+ },
528
+ {
529
+ d1_field: 'created_at',
530
+ pipedrive_field: 'add_time',
531
+ transform: (value) => Math.floor(new Date(value).getTime() / 1000),
532
+ required: true
533
+ },
534
+ {
535
+ d1_field: 'person_id',
536
+ pipedrive_field: 'person_id',
537
+ transform: (value) => value, // Referência ao lead original
538
+ required: false
539
+ }
540
+ ]
541
+ },
542
+
543
+ RD_STATION: {
544
+ source: 'tracking-cdp-edge',
545
+ mappings: [
546
+ {
547
+ d1_field: 'email',
548
+ rd_field: 'email',
549
+ transform: (value) => value.toLowerCase().trim(),
550
+ required: true
551
+ },
552
+ {
553
+ d1_field: 'transaction_id',
554
+ rd_field: 'deal_unique_id',
555
+ transform: (value) => `CDP_$\{value\}`,
556
+ required: true
557
+ },
558
+ {
559
+ d1_field: 'value',
560
+ rd_field: 'deal_value',
561
+ transform: (value) => parseFloat(value).toFixed(2),
562
+ required: true
563
+ },
564
+ {
565
+ d1_field: 'currency',
566
+ rd_field: 'deal_currency',
567
+ transform: (value) => value || 'BRL',
568
+ required: true
569
+ },
570
+ {
571
+ d1_field: 'created_at',
572
+ rd_field: 'deal_created_at',
573
+ transform: (value) => new Date(value).toISOString(),
574
+ required: true
575
+ },
576
+ {
577
+ d1_field: 'lead_id',
578
+ rd_field: 'lead_unique_id',
579
+ transform: (value) => value,
580
+ required: false
581
+ }
582
+ ]
583
+ },
584
+
585
+ CUSTOM_WEBHOOK: {
586
+ source: 'cdp-edge',
587
+ mappings: [
588
+ {
589
+ d1_field: '*',
590
+ webhook_field: '*',
591
+ transform: (value) => value,
592
+ required: false // Payload completo
593
+ }
594
+ ]
595
+ }
596
+ };
597
+ ```
598
+
599
+ ---
600
+
601
+ ## 📊 PASSO 3 — SINCRONIZAÇÃO D1 → CRM
602
+
603
+ ### 3.1 Sync de Leads (Batch)
604
+
605
+ ```javascript
606
+ // Sincronizar leads do D1 para CRM em batch
607
+ export async function syncLeadsToCRM(hours = 24, batchSize = 50) {
608
+ const leads = await DB.prepare(`
609
+ SELECT * FROM leads
610
+ WHERE created_at > datetime('now', '-${hours} hours')
611
+ ORDER BY created_at DESC
612
+ `).all();
613
+
614
+ console.log(`Encontrados ${leads.length} leads para sincronizar`);
615
+
616
+ let synced = 0;
617
+ let failed = 0;
618
+ const errors = [];
619
+
620
+ for (let i = 0; i < leads.length; i += batchSize) {
621
+ const batch = leads.slice(i, i + batchSize);
622
+
623
+ try {
624
+ const result = await sendLeadsBatchToCRM(batch);
625
+ synced += result.successful;
626
+ failed += result.failed;
627
+
628
+ // Marcar leads como sync'ed no D1
629
+ for (const lead of batch) {
630
+ if (result.successful_ids.includes(lead.id)) {
631
+ await markLeadAsSynced(lead.id);
632
+ }
633
+ }
634
+
635
+ // Rate limiting
636
+ await sleep(1000); // 1 segundo entre batches
637
+
638
+ } catch (error) {
639
+ errors.push({ batch_start: i, error: error.message });
640
+ failed += batch.length;
641
+ }
642
+ }
643
+
644
+ return {
645
+ total_leads: leads.length,
646
+ synced,
647
+ failed,
648
+ errors,
649
+ timestamp: new Date().toISOString()
650
+ };
651
+ }
652
+
653
+ async function sendLeadsBatchToCRM(leadsBatch) {
654
+ const mapping = LEAD_FIELD_MAPPINGS[ACTIVE_CRM.type];
655
+ const crmPayload = leadsBatch.map(lead => {
656
+ const transformed = {};
657
+
658
+ for (const fieldMap of mapping.mappings) {
659
+ if (fieldMap.required && !lead[fieldMap.d1_field]) {
660
+ throw new Error(`Campo obrigatório faltando: ${fieldMap.d1_field}`);
661
+ }
662
+
663
+ transformed[fieldMap.crm_field] = fieldMap.transform
664
+ ? fieldMap.transform(lead[fieldMap.d1_field])
665
+ : lead[fieldMap.d1_field];
666
+ }
667
+
668
+ return transformed;
669
+ });
670
+
671
+ // Enviar para CRM
672
+ const response = await fetch(ACTIVE_CRM.endpoints.contacts, {
673
+ method: 'POST',
674
+ headers: {
675
+ 'Authorization': `Bearer ${getCRMToken()}`,
676
+ 'Content-Type': 'application/json'
677
+ },
678
+ body: JSON.stringify(crmPayload)
679
+ });
680
+
681
+ if (!response.ok) {
682
+ throw new Error(`CRM API Error: ${response.status} - ${await response.text()}`);
683
+ }
684
+
685
+ const result = await response.json();
686
+
687
+ return {
688
+ successful: result.created || result.success || 0,
689
+ failed: leadsBatch.length - (result.created || result.success || 0),
690
+ successful_ids: result.ids || result.success_ids || []
691
+ };
692
+ }
693
+
694
+ async function markLeadAsSynced(leadId) {
695
+ await DB.prepare(`
696
+ UPDATE leads SET crm_synced = 1, crm_synced_at = datetime('now')
697
+ WHERE id = ?
698
+ `).bind(leadId).run();
699
+ }
700
+ ```
701
+
702
+ ### 3.2 Sync de Compras (Batch)
703
+
704
+ ```javascript
705
+ // Sincronizar compras do D1 para CRM em batch
706
+ export async function syncPurchasesToCRM(hours = 24, batchSize = 20) {
707
+ const purchases = await DB.prepare(`
708
+ SELECT p.*, l.email
709
+ FROM purchases p
710
+ LEFT JOIN leads l ON p.lead_id = l.id
711
+ WHERE p.created_at > datetime('now', '-${hours} hours')
712
+ ORDER BY p.created_at DESC
713
+ `).all();
714
+
715
+ console.log(`Encontrados ${purchases.length} compras para sincronizar`);
716
+
717
+ let synced = 0;
718
+ let failed = 0;
719
+ const errors = [];
720
+
721
+ for (let i = 0; i < purchases.length; i += batchSize) {
722
+ const batch = purchases.slice(i, i + batchSize);
723
+
724
+ try {
725
+ const result = await sendPurchasesBatchToCRM(batch);
726
+ synced += result.successful;
727
+ failed += result.failed;
728
+
729
+ // Marcar compras como sync'ed no D1
730
+ for (const purchase of batch) {
731
+ if (result.successful_ids.includes(purchase.id)) {
732
+ await markPurchaseAsSynced(purchase.id);
733
+ }
734
+ }
735
+
736
+ // Rate limiting
737
+ await sleep(1000);
738
+
739
+ } catch (error) {
740
+ errors.push({ batch_start: i, error: error.message });
741
+ failed += batch.length;
742
+ }
743
+ }
744
+
745
+ return {
746
+ total_purchases: purchases.length,
747
+ synced,
748
+ failed,
749
+ errors,
750
+ timestamp: new Date().toISOString()
751
+ };
752
+ }
753
+
754
+ async function sendPurchasesBatchToCRM(purchasesBatch) {
755
+ const mapping = PURCHASE_FIELD_MAPPINGS[ACTIVE_CRM.type];
756
+ const crmPayload = purchasesBatch.map(purchase => {
757
+ const transformed = {};
758
+
759
+ for (const fieldMap of mapping.mappings) {
760
+ if (fieldMap.required && !purchase[fieldMap.d1_field]) {
761
+ throw new Error(`Campo obrigatório faltando: ${fieldMap.d1_field}`);
762
+ }
763
+
764
+ transformed[fieldMap.crm_field] = fieldMap.transform
765
+ ? fieldMap.transform(purchase[fieldMap.d1_field])
766
+ : purchase[fieldMap.d1_field];
767
+ }
768
+
769
+ return transformed;
770
+ });
771
+
772
+ // Enviar para CRM
773
+ const response = await fetch(ACTIVE_CRM.endpoints.deals || ACTIVE_CRM.endpoints.contacts, {
774
+ method: 'POST',
775
+ headers: {
776
+ 'Authorization': `Bearer ${getCRMToken()}`,
777
+ 'Content-Type': 'application/json'
778
+ },
779
+ body: JSON.stringify(crmPayload)
780
+ });
781
+
782
+ if (!response.ok) {
783
+ throw new Error(`CRM API Error: ${response.status} - ${await response.text()}`);
784
+ }
785
+
786
+ const result = await response.json();
787
+
788
+ return {
789
+ successful: result.created || result.success || 0,
790
+ failed: purchasesBatch.length - (result.created || result.success || 0),
791
+ successful_ids: result.ids || result.success_ids || []
792
+ };
793
+ }
794
+
795
+ async function markPurchaseAsSynced(purchaseId) {
796
+ await DB.prepare(`
797
+ UPDATE purchases SET crm_synced = 1, crm_synced_at = datetime('now')
798
+ WHERE id = ?
799
+ `).bind(purchaseId).run();
800
+ }
801
+ ```
802
+
803
+ ---
804
+
805
+ ## 📊 PASSO 4 — WEBHOOKS DO CRM → D1
806
+
807
+ ### 4.1 Webhook Endpoint para Atualizações do CRM
808
+
809
+ ```javascript
810
+ // Endpoint para receber webhooks do CRM
811
+ export async function handleCRMWebhook(request, env) {
812
+ const payload = await request.json();
813
+ const crmType = request.headers.get('X-CRM-Type') || ACTIVE_CRM.type;
814
+ const signature = request.headers.get('X-Webhook-Signature');
815
+
816
+ // Validar assinatura do webhook (se aplicável)
817
+ if (!validateWebhookSignature(payload, signature, crmType)) {
818
+ return new Response('Invalid signature', { status: 401 });
819
+ }
820
+
821
+ // Processar diferentes tipos de eventos do CRM
822
+ try {
823
+ switch (payload.event_type) {
824
+ case 'lead_stage_updated':
825
+ await updateLeadStageFromCRM(payload);
826
+ break;
827
+
828
+ case 'deal_closed':
829
+ await updateDealStatusFromCRM(payload);
830
+ break;
831
+
832
+ case 'lead_score_updated':
833
+ await updateLeadScoreFromCRM(payload);
834
+ break;
835
+
836
+ default:
837
+ console.warn(`Tipo de evento desconhecido: ${payload.event_type}`);
838
+ }
839
+
840
+ return new Response(JSON.stringify({ success: true }), { status: 200 });
841
+
842
+ } catch (error) {
843
+ console.error('Erro ao processar webhook do CRM:', error);
844
+ return new Response(JSON.stringify({ success: false, error: error.message }), { status: 500 });
845
+ }
846
+ }
847
+
848
+ async function updateLeadStageFromCRM(payload) {
849
+ await DB.prepare(`
850
+ UPDATE leads SET crm_stage = ?, crm_stage_updated_at = datetime('now')
851
+ WHERE email = ?
852
+ `).bind(payload.stage, payload.email).run();
853
+
854
+ console.log(`Stage do lead ${payload.email} atualizado para: ${payload.stage}`);
855
+ }
856
+
857
+ async function updateDealStatusFromCRM(payload) {
858
+ await DB.prepare(`
859
+ UPDATE purchases SET crm_deal_status = ?, crm_deal_status_updated_at = datetime('now')
860
+ WHERE transaction_id = ?
861
+ `).bind(payload.status, payload.transaction_id).run();
862
+
863
+ console.log(`Status da compra ${payload.transaction_id} atualizado para: ${payload.status}`);
864
+ }
865
+
866
+ async function updateLeadScoreFromCRM(payload) {
867
+ await DB.prepare(`
868
+ UPDATE leads SET lead_score = ?, lead_score_updated_at = datetime('now')
869
+ WHERE email = ?
870
+ `).bind(payload.lead_score, payload.email).run();
871
+
872
+ console.log(`Score do lead ${payload.email} atualizado para: ${payload.lead_score}`);
873
+ }
874
+
875
+ function validateWebhookSignature(payload, signature, crmType) {
876
+ if (!signature) return true; // Webhooks sem assinatura são permitidos
877
+
878
+ const secret = env[`${crmType.toUpperCase()}_WEBHOOK_SECRET`];
879
+ if (!secret) return false;
880
+
881
+ const expectedSignature = computeHMACSHA256(JSON.stringify(payload), secret);
882
+ return expectedSignature === signature;
883
+ }
884
+ ```
885
+
886
+ ---
887
+
888
+ ## 📊 PASSO 5 — CONFIGURAÇÃO DE SINCRONIZAÇÃO
889
+
890
+ ### 5.1 Schedule Config (Batch vs Real-time)
891
+
892
+ ```javascript
893
+ // Configuração de como a sincronização deve funcionar
894
+ export const SYNC_CONFIG = {
895
+ mode: 'BATCH', // ou 'REAL-TIME'
896
+
897
+ batch: {
898
+ enabled: true,
899
+ schedule: '0 */15 * * *', // A cada 15 minutos
900
+ lead_batch_size: 50,
901
+ purchase_batch_size: 20
902
+ },
903
+
904
+ realtime: {
905
+ enabled: false,
906
+ webhook_endpoint: '/api/crm-webhook',
907
+ debounce_ms: 5000 // 5 segundos para agrupar eventos
908
+ },
909
+
910
+ priority: {
911
+ leads: 'HIGH', // Leads são prioridade alta
912
+ purchases: 'CRITICAL' // Compras são prioridade crítica
913
+ },
914
+
915
+ retry: {
916
+ max_attempts: 3,
917
+ backoff_ms: 5000, // 5 segundos entre tentativas
918
+ exponential_backoff: true
919
+ }
920
+ };
921
+
922
+ // Configuração específica por CRM
923
+ export const CRM_SPECIFIC_CONFIG = {
924
+ HUBSPOT: {
925
+ sync_mode: 'BATCH',
926
+ realtime_webhook: false,
927
+ recommended: 'BATCH (HubSpot tem rate limit alto)'
928
+ },
929
+
930
+ SALESFORCE: {
931
+ sync_mode: 'BATCH',
932
+ realtime_webhook: false,
933
+ recommended: 'BATCH (Salesforce API é pesada)'
934
+ },
935
+
936
+ PIPEDRIVE: {
937
+ sync_mode: 'BATCH',
938
+ realtime_webhook: false,
939
+ recommended: 'BATCH (Pipedrive tem limit de 100 req/hora)'
940
+ },
941
+
942
+ RD_STATION: {
943
+ sync_mode: 'REAL-TIME',
944
+ realtime_webhook: true,
945
+ recommended: 'REAL-TIME (RD Station tem bom webhook)'
946
+ }
947
+ };
948
+ ```
949
+
950
+ ---
951
+
952
+ ## 🎯 FORMATO DE SAÍDA
953
+
954
+ ### DELIVERABLE 1: `crm-webhook-handlers.js`
955
+
956
+ ```javascript
957
+ // Funções para Cloudflare Worker - Webhooks do CRM
958
+ import { validateWebhookSignature, updateLeadStageFromCRM, updateDealStatusFromCRM, updateLeadScoreFromCRM } from './crm-sync.js';
959
+
960
+ export const CRM_WEBHOOK_HANDLERS = {
961
+ '/api/crm-webhook': handleCRMWebhook
962
+ };
963
+
964
+ // Registrar webhook no Master Orchestrator
965
+ export async function registerCRMWebhooks(crmType, webhookUrl) {
966
+ const config = {
967
+ webhook_url: webhookUrl,
968
+ crm_type: crmType,
969
+ events: ['lead_stage_updated', 'deal_closed', 'lead_score_updated'],
970
+ signature_enabled: crmType !== 'CUSTOM_WEBHOOK'
971
+ };
972
+
973
+ // Salvar configuração no D1
974
+ await DB.prepare(`
975
+ INSERT INTO crm_webhook_config (webhook_url, crm_type, events, signature_enabled)
976
+ VALUES (?, ?, ?, ?)
977
+ `).bind(
978
+ config.webhook_url,
979
+ config.crm_type,
980
+ JSON.stringify(config.events),
981
+ config.signature_enabled
982
+ ).run();
983
+
984
+ console.log(`Webhook registrado: ${crmType} -> ${webhookUrl}`);
985
+ }
986
+
987
+ // Endpoint de saúde da integração
988
+ export async function handleCRMHealthCheck(request, env) {
989
+ const stats = await DB.prepare(`
990
+ SELECT
991
+ COUNT(*) as total_leads,
992
+ COUNT(CASE WHEN crm_synced = 1 THEN 1 END) as synced_leads,
993
+ COUNT(*) as total_purchases,
994
+ COUNT(CASE WHEN crm_synced = 1 THEN 1 END) as synced_purchases,
995
+ MIN(crm_synced_at) as last_sync_at
996
+ FROM leads, purchases
997
+ `).get();
998
+
999
+ const health = {
1000
+ status: 'healthy',
1001
+ total_leads: stats.total_leads || 0,
1002
+ synced_leads: stats.synced_leads || 0,
1003
+ sync_rate_leads: stats.total_leads > 0
1004
+ ? (stats.synced_leads / stats.total_leads * 100).toFixed(2) + '%'
1005
+ : 'N/A',
1006
+ total_purchases: stats.total_purchases || 0,
1007
+ synced_purchases: stats.synced_purchases || 0,
1008
+ sync_rate_purchases: stats.total_purchases > 0
1009
+ ? (stats.synced_purchases / stats.total_purchases * 100).toFixed(2) + '%'
1010
+ : 'N/A',
1011
+ last_sync_at: stats.last_sync_at || null,
1012
+ active_crm: ACTIVE_CRM ? ACTIVE_CRM.name : 'Not configured'
1013
+ };
1014
+
1015
+ if ((stats.sync_rate_leads && parseFloat(stats.sync_rate_leads) < 90) ||
1016
+ (stats.sync_rate_purchases && parseFloat(stats.sync_rate_purchases) < 90)) {
1017
+ health.status = 'degraded';
1018
+ }
1019
+
1020
+ return new Response(JSON.stringify(health), {
1021
+ headers: { 'Content-Type': 'application/json' },
1022
+ status: health.status === 'healthy' ? 200 : 503
1023
+ });
1024
+ }
1025
+ ```
1026
+
1027
+ ### DELIVERABLE 2: `crm-mapping.md`
1028
+
1029
+ ```markdown
1030
+ # Mapeamento de Campos — D1 → CRM
1031
+
1032
+ ## 📋 Mapeamento de Leads
1033
+
1034
+ ### Campos Padrão do D1
1035
+
1036
+ | Campo D1 | Tipo | Descrição |
1037
+ |-----------|------|----------|
1038
+ | id | INTEGER | ID único do lead no D1 |
1039
+ | email | TEXT | E-mail do lead (obrigatório) |
1040
+ | phone | TEXT | Telefone do lead |
1041
+ | name | TEXT | Nome completo do lead |
1042
+ | utm_source | TEXT | Fonte de tráfego (ex: google, facebook, organic) |
1043
+ | utm_campaign | TEXT | Campanha de marketing |
1044
+ | utm_medium | TEXT | Meio de tráfego (ex: cpc, email, social) |
1045
+ | lead_score | INTEGER | Score de qualidade do lead (0-100) |
1046
+ | created_at | TIMESTAMP | Data/hora de criação do lead |
1047
+ | crm_synced | BOOLEAN | Se foi sincronizado com CRM |
1048
+ | crm_synced_at | TIMESTAMP | Data/hora da última sincronização |
1049
+
1050
+ ### Mapeamento por CRM
1051
+
1052
+ #### HubSpot
1053
+
1054
+ | D1 Field | HubSpot Field | Transformação | Obrigatório |
1055
+ |-----------|---------------|--------------|-------------|
1056
+ | email | email | lowerCase + trim | ✅ Sim |
1057
+ | phone | phone | Formatar como (DDI) + número | ❌ Não |
1058
+ | name | firstname | Extrair primeiro nome | ✅ Sim |
1059
+ | lastname | lastname | Extrair sobrenome | ✅ Sim |
1060
+ | utm_source | hs_analytics_source | Usar padrão se vazio | ❌ Não |
1061
+ | utm_campaign | hs_analytics_campaign | Usar padrão se vazio | ❌ Não |
1062
+ | utm_medium | hs_analytics_medium | Usar padrão se vazio | ❌ Não |
1063
+ | lead_score | hs_lead_score | Usar padrão se vazio | ❌ Não |
1064
+ | created_at | createdate | ISO 8601 | ✅ Sim |
1065
+
1066
+ #### Salesforce
1067
+
1068
+ | D1 Field | Salesforce Field | Transformação | Obrigatório |
1069
+ |-----------|------------------|--------------|-------------|
1070
+ | email | Email__c | lowerCase + trim | ✅ Sim |
1071
+ | phone | Phone | Formatar como (DDI) + número | ❌ Não |
1072
+ | name | FirstName | Extrair primeiro nome | ✅ Sim |
1073
+ | lastname | LastName | Extrair sobrenome | ✅ Sim |
1074
+ | utm_source | LeadSource | Valor padrão: 'CDP Edge' | ✅ Sim |
1075
+ | utm_campaign | Campaign__c | Usar padrão se vazio | ❌ Não |
1076
+ | lead_score | Lead_Score__c | Usar padrão se vazio | ❌ Não |
1077
+ | created_at | CreatedDate | ISO 8601 | ✅ Sim |
1078
+
1079
+ ---
1080
+
1081
+ ## 📋 Mapeamento de Compras
1082
+
1083
+ ### Campos Padrão do D1
1084
+
1085
+ | Campo D1 | Tipo | Descrição |
1086
+ |-----------|------|----------|
1087
+ | id | INTEGER | ID único da compra no D1 |
1088
+ | transaction_id | TEXT | ID único da transação |
1089
+ | email | TEXT | E-mail associado à compra |
1090
+ | value | REAL | Valor da compra (decimal) |
1091
+ | currency | TEXT | Moeda (ex: BRL, USD) |
1092
+ | content_name | TEXT | Nome do produto/offer |
1093
+ | created_at | TIMESTAMP | Data/hora da compra |
1094
+ | crm_synced | BOOLEAN | Se foi sincronizado com CRM |
1095
+ | crm_synced_at | TIMESTAMP | Data/hora da última sincronização |
1096
+
1097
+ ### Mapeamento por CRM
1098
+
1099
+ #### HubSpot
1100
+
1101
+ | D1 Field | HubSpot Field | Transformação | Obrigatório |
1102
+ |-----------|---------------|--------------|-------------|
1103
+ | email | email | lowerCase + trim | ✅ Sim |
1104
+ | transaction_id | deal_id | Prefixar 'CDP_' | ✅ Sim |
1105
+ | value | amount | Formatar 2 decimais | ✅ Sim |
1106
+ | currency | currency | Usar padrão: 'BRL' | ❌ Não |
1107
+ | content_name | dealname | Valor padrão: 'Purchase from Website' | ❌ Não |
1108
+ | created_at | closedate | ISO 8601 | ✅ Sim |
1109
+ | lead_id | (associations) | Referência ao lead | ❌ Não |
1110
+
1111
+ #### Salesforce
1112
+
1113
+ | D1 Field | Salesforce Field | Transformação | Obrigatório |
1114
+ |-----------|------------------|--------------|-------------|
1115
+ | email | Email__c | lowerCase + trim | ✅ Sim |
1116
+ | transaction_id | Name | Prefixar 'CDP_Purchase_' | ✅ Sim |
1117
+ | value | Amount__c | Formatar 2 decimais | ✅ Sim |
1118
+ | currency | CurrencyIsoCode__c | Usar padrão: 'BRL' | ❌ Não |
1119
+ | created_at | CloseDate | ISO 8601 | ✅ Sim |
1120
+ | lead_id | LeadId__c | Referência ao lead | ❌ Não |
1121
+
1122
+ ---
1123
+
1124
+ > 📋 **Sua Função:** Definir mapeamento completo e preciso de campos entre D1 e CRMs suportados (HubSpot, Salesforce, Pipedrive, RD Station, Custom), com transformações de dados, validações de campos obrigatórios e documentação de todos os campos.
1125
+ ```
1126
+
1127
+ ### DELIVERABLE 3: `sync-schedule.md`
1128
+
1129
+ ```markdown
1130
+ # Configuração de Sincronização — CRM Integration Agent
1131
+
1132
+ ## ⚙️ CONFIGURAÇÃO GERAL
1133
+
1134
+ ```yaml
1135
+ sync:
1136
+ mode: BATCH # Modo de sincronização: BATCH ou REAL-TIME
1137
+
1138
+ batch:
1139
+ enabled: true
1140
+ schedule: "0 */15 * * *" # Cron: A cada 15 minutos
1141
+ lead_batch_size: 50 # Tamanho do batch de leads
1142
+ purchase_batch_size: 20 # Tamanho do batch de compras
1143
+
1144
+ realtime:
1145
+ enabled: false
1146
+ webhook_endpoint: "/api/crm-webhook"
1147
+ debounce_ms: 5000 # Agrupar eventos em 5 segundos
1148
+
1149
+ priority:
1150
+ leads: HIGH # Prioridade de sync de leads
1151
+ purchases: CRITICAL # Prioridade de sync de compras
1152
+
1153
+ retry:
1154
+ max_attempts: 3
1155
+ backoff_ms: 5000 # 5 segundos entre tentativas
1156
+ exponential_backoff: true # Backoff exponencial habilitado
1157
+
1158
+ monitoring:
1159
+ log_sync_operations: true
1160
+ alert_on_failure_rate_gt_10_percent: true
1161
+ alert_on_last_sync_hours_ago_gt_2: true
1162
+
1163
+ crm_specific:
1164
+ HUBSPOT:
1165
+ sync_mode: BATCH
1166
+ realtime_webhook: false
1167
+ recommended: "BATCH (HubSpot tem rate limit alto)"
1168
+ rate_limit_buffer: 100 # Buffer de 100 reqs para evitar 429
1169
+
1170
+ SALESFORCE:
1171
+ sync_mode: BATCH
1172
+ realtime_webhook: false
1173
+ recommended: "BATCH (Salesforce API é pesada)"
1174
+ batch_size_adjustment: 0.8 # 80% do batch size padrão
1175
+
1176
+ PIPEDRIVE:
1177
+ sync_mode: BATCH
1178
+ realtime_webhook: false
1179
+ recommended: "BATCH (Pipedrive tem limit de 100 req/hora)"
1180
+ rate_limit_check: true # Verificar limites antes de enviar
1181
+
1182
+ RD_STATION:
1183
+ sync_mode: REAL-TIME
1184
+ realtime_webhook: true
1185
+ recommended: "REAL-TIME (RD Station tem bom webhook)"
1186
+ webhook_signature_required: false # RD não usa assinatura
1187
+ ```
1188
+
1189
+ ## 📅 SCHEDULES RECOMENDADAS POR CRM
1190
+
1191
+ ### HubSpot
1192
+
1193
+ ```yaml
1194
+ schedule: "0 */15 * * *" # A cada 15 minutos
1195
+
1196
+ batch_config:
1197
+ leads: 50 # 50 leads por batch
1198
+ purchases: 20 # 20 purchases por batch
1199
+
1200
+ rate_limit_handling:
1201
+ check_before_send: true
1202
+ pause_on_429: true
1203
+ pause_duration_ms: 60000 # Pausar por 1 minuto se 429
1204
+ warn_at_80_percent: true # Avisar ao atingir 80% do limite
1205
+ ```
1206
+
1207
+ ### Salesforce
1208
+
1209
+ ```yaml
1210
+ schedule: "0 */20 * * *" # A cada 20 minutos
1211
+
1212
+ batch_config:
1213
+ leads: 40 # 40 leads por batch (reduzido)
1214
+ purchases: 10 # 10 purchases por batch
1215
+
1216
+ rate_limit_handling:
1217
+ check_before_send: true
1218
+ pause_on_429: true
1219
+ pause_duration_ms: 120000 # Pausar por 2 minutos se 429
1220
+ ```
1221
+
1222
+ ### Pipedrive
1223
+
1224
+ ```yaml
1225
+ schedule: "0 */10 * * *" # A cada 10 minutos
1226
+
1227
+ batch_config:
1228
+ leads: 30 # 30 leads por batch (reduzido para 100 req/hora)
1229
+ purchases: 5 # 5 purchases por batch
1230
+
1231
+ rate_limit_handling:
1232
+ rate_limit_enforcement: true # Enforçar 100 req/hora máximo
1233
+ dynamic_batch_size: true # Ajustar tamanho dinamicamente
1234
+ ```
1235
+
1236
+ ### RD Station
1237
+
1238
+ ```yaml
1239
+ schedule: "REAL-TIME" # Webhook em tempo real
1240
+
1241
+ webhook_config:
1242
+ endpoint: "/api/crm-webhook"
1243
+ debounce_ms: 3000 # 3 segundos para agrupar eventos
1244
+ signature_validation: false # RD não usa assinatura
1245
+
1246
+ event_aggregation:
1247
+ lead_updates: true
1248
+ deal_updates: true
1249
+ score_updates: true
1250
+ ```
1251
+
1252
+ ---
1253
+
1254
+ ## 🚨 ALERTAS E NOTIFICAÇÕES
1255
+
1256
+ ### Tipos de Alertas
1257
+
1258
+ 1. **Sync Failure Rate > 10%**
1259
+ - Condição: Taxa de falha > 10% nas últimas 2 horas
1260
+ - Severidade: HIGH
1261
+ - Ação: Investigar CRM, verificar autenticação
1262
+ - Notificação: WhatsApp + Email
1263
+
1264
+ 2. **Last Sync > 2 Horas**
1265
+ - Condição: Última sincronização > 2 horas atrás
1266
+ - Severidade: MEDIUM
1267
+ - Ação: Verificar se worker está rodando, investigar logs
1268
+ - Notificação: Email
1269
+
1270
+ 3. **CRM Rate Limit (429)**
1271
+ - Condição: Recebendo múltiplos 429 em sequência
1272
+ - Severidade: HIGH
1273
+ - Ação: Aumentar intervalo de sync, verificar rate limits
1274
+ - Notificação: WhatsApp
1275
+
1276
+ 4. **Sync Data Mismatch**
1277
+ - Condição: Campos obrigatórios mapeados incorretamente
1278
+ - Severidade: CRITICAL
1279
+ - Ação: Corrigir mapeamento imediatamente
1280
+ - Notificação: WhatsApp + Email
1281
+
1282
+ ---
1283
+
1284
+ ## 📊 MÉTRICAS DE SAÚDE DA INTEGRAÇÃO
1285
+
1286
+ ### Métricas a Monitorar
1287
+
1288
+ ```yaml
1289
+ integration_health_metrics:
1290
+ sync_rate_leads:
1291
+ description: "Taxa de leads sincronizados"
1292
+ threshold: "> 95%"
1293
+ alert_severity: "MEDIUM"
1294
+
1295
+ sync_rate_purchases:
1296
+ description: "Taxa de purchases sincronizados"
1297
+ threshold: "> 95%"
1298
+ alert_severity: "MEDIUM"
1299
+
1300
+ avg_sync_duration:
1301
+ description: "Duração média da sincronização"
1302
+ threshold: "< 5 minutos"
1303
+ alert_severity: "INFO"
1304
+
1305
+ error_rate_by_crm:
1306
+ description: "Taxa de erro por CRM"
1307
+ threshold: "< 5%"
1308
+ alert_severity: "HIGH"
1309
+
1310
+ last_successful_sync:
1311
+ description: "Última sincronização bem-sucedida"
1312
+ threshold: "< 30 minutos atrás"
1313
+ alert_severity: "WARNING"
1314
+
1315
+ webhook_latency:
1316
+ description: "Latência de resposta do webhook"
1317
+ threshold: "< 1000ms"
1318
+ alert_severity: "INFO"
1319
+ ```
1320
+
1321
+ ---
1322
+
1323
+ > 📋 **Sua Função:** Configurar sincronização bidirecional entre D1 e CRMs (HubSpot, Salesforce, Pipedrive, RD Station, Custom), com suporte a batch e real-time, mapeamento de campos inteligente, webhooks, schedules otimizados por CRM e sistema de alertas para garantir que dados fluam automaticamente entre tracking e sistemas de venda.
1324
+ ```
1325
+
1326
+ ---
1327
+
1328
+ ## 🔧 INTEGRAÇÃO COM OUTROS AGENTES
1329
+
1330
+ ### Fontes de Dados
1331
+
1332
+ 1. **D1 Database** — Leads, purchases, journey events
1333
+ 2. **Server Tracking Agent** — Eventos de tracking recebidos
1334
+ 3. **Memory Agent** — Configurações de CRM e estados de sync
1335
+ 4. **Debug Agent** — Logs de operações de sync e erros
1336
+
1337
+ ### Destino de Output
1338
+
1339
+ - **Dashboard Agent** — Recebe especificação de dashboard de CRM (leads sync, purchases sync, health)
1340
+ - **WhatsApp Agent** — Recebe configuração de alertas (sync failures, rate limits)
1341
+ - **Email Agent** — Recebe configuração de relatórios de sync diários
1342
+ - **Performance Agent** — Recebe métricas de performance da integração
1343
+
1344
+ ---
1345
+
1346
+ ## 📊 CHECKLIST DE IMPLEMENTAÇÃO
1347
+
1348
+ ### Definição de CRM
1349
+
1350
+ - [ ] Tipos de CRM suportados definidos (HubSpot, Salesforce, Pipedrive, RD Station, Custom)
1351
+ - [ ] Configurações de cada CRM documentadas (endpoints, auth, rate limits)
1352
+ - [ ] Sistema de configuração dinâmica implementado
1353
+
1354
+ ### Mapeamento de Campos
1355
+
1356
+ - [ ] Schema de D1 definido (leads, purchases)
1357
+ - [ ] Mapeamento de leads por CRM completo
1358
+ - [ ] Mapeamento de purchases por CRM completo
1359
+ - [ ] Transformações de dados implementadas
1360
+ - [ ] Validações de campos obrigatórios
1361
+
1362
+ ### Sincronização D1 → CRM
1363
+
1364
+ - [ ] Sync de leads em batch implementado
1365
+ - [ ] Sync de purchases em batch implementado
1366
+ - [ ] Marcação de sync'ed no D1 implementada
1367
+ - [ ] Rate limiting implementado
1368
+ - [ ] Retry com backoff exponencial implementado
1369
+
1370
+ ### Webhooks CRM → D1
1371
+
1372
+ - [ ] Endpoint de webhook implementado
1373
+ - [ ] Validação de assinatura implementada
1374
+ - [ ] Processamento de eventos de CRM implementado
1375
+ - [ ] Atualização de leads/purchases no D1 implementada
1376
+
1377
+ ### Scheduling
1378
+
1379
+ - [ ] Schedule de batch configurado
1380
+ - [ ] Schedule de real-time configurado
1381
+ - [ ] Schedules específicos por CRM definidos
1382
+ - [ ] Integração com cron triggers implementada
1383
+
1384
+ ### Monitoramento
1385
+
1386
+ - [ ] Métricas de saúde da integração definidas
1387
+ - [ ] Sistema de alertas implementado
1388
+ - [ ] Integração com Dashboard Agent implementada
1389
+ - [ ] Integração com WhatsApp Agent implementada
1390
+ - [ ] Integração com Email Agent implementada
1391
+
1392
+ ---
1393
+
1394
+ ## 🎯 BENEFÍCIOS ESPERADOS
1395
+
1396
+ 1. **Sincronização automática** — Leads e compras fluam automaticamente para o CRM
1397
+ 2. **Bidirecionalidade** — Atualizações do CRM refletem no D1 e vice-versa
1398
+ 3. **Suporte múltiplos CRMs** — HubSpot, Salesforce, Pipedrive, RD Station, Custom
1399
+ 4. **Mapeamento inteligente** — Transformações automáticas de dados
1400
+ 5. **Flexibilidade** — Batch ou real-time, configurável por CRM
1401
+ 6. **Monitoramento completo** — Métricas de saúde da integração
1402
+ 7. **Rate limiting inteligente** — Evita 429 e otimiza throughput
1403
+ 8. **Webhooks robustos** — Recebimento de atualizações do CRM em tempo real
1404
+
1405
+ ---
1406
+
1407
+ > 📋 **Sua Função:** Criar conexão automática e bidirecional entre banco de dados D1 do CDP Edge e sistemas CRM externos, sincronizando leads, compras e jornada do cliente em tempo real ou batch, com mapeamento inteligente de campos, webhooks robustos, schedules otimizados por CRM e monitoramento completo da saúde da integração.
1408
+ ```
1409
+
1410
+ ---
1411
+
1412
+ ## 🎯 FORMATO DE SAÍDA
1413
+
1414
+ Retornar os 3 deliverables em formato Markdown.
1415
+
1416
+ O Master Orchestrator deve salvar:
1417
+ - `crm-webhook-handlers.js` — Funções de webhook para Worker
1418
+ - `crm-mapping.md` — Mapeamento completo de campos (D1 → CRM)
1419
+ - `sync-schedule.md` — Configuração de sincronização por CRM