cdp-edge 1.2.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +153 -306
  2. package/bin/cdp-edge.js +71 -61
  3. package/contracts/agent-versions.json +682 -0
  4. package/contracts/api-versions.json +372 -368
  5. package/contracts/types.ts +81 -0
  6. package/dist/commands/analyze.js +52 -52
  7. package/dist/commands/infra.js +54 -54
  8. package/dist/commands/install.js +26 -3
  9. package/dist/commands/server.js +174 -174
  10. package/dist/commands/setup.js +332 -100
  11. package/dist/commands/validate.js +248 -84
  12. package/dist/index.js +12 -12
  13. package/dist/sdk/cdpTrack.js +2095 -0
  14. package/dist/sdk/cdpTrack.min.js +64 -0
  15. package/dist/sdk/install-snippet.html +10 -0
  16. package/docs/whatsapp-ctwa.md +5 -4
  17. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +89 -0
  18. package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +101 -0
  19. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -364
  20. package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
  21. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
  22. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +41 -41
  23. package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
  24. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +40 -50
  25. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +174 -74
  26. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
  27. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +25 -5
  28. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +10 -10
  29. package/extracted-skill/tracking-events-generator/agents/database-agent.md +43 -42
  30. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +22 -22
  31. package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
  32. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +23 -9
  33. package/extracted-skill/tracking-events-generator/agents/email-agent.md +28 -1
  34. package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +253 -0
  35. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +206 -1
  36. package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
  37. package/extracted-skill/tracking-events-generator/agents/google-agent.md +128 -2
  38. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +191 -31
  39. package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
  40. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +145 -34
  41. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
  42. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +24 -5
  43. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
  44. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +588 -93
  45. package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
  46. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +190 -15
  47. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +10 -2
  48. package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +769 -0
  49. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +21 -4
  50. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +41 -31
  51. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +18 -8
  52. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +14 -6
  53. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +7 -7
  54. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +16 -8
  55. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +15 -7
  56. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +157 -48
  57. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +35 -35
  58. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +15 -7
  59. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +73 -2
  60. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +104 -9
  61. package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
  62. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +13 -9
  63. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +112 -4
  64. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +58 -5
  65. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +26 -18
  66. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +152 -37
  67. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -285
  68. package/extracted-skill/tracking-events-generator/cdpTrack.js +642 -641
  69. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +14 -10
  70. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -226
  71. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -235
  72. package/extracted-skill/tracking-events-generator/integration-test.js +497 -497
  73. package/extracted-skill/tracking-events-generator/knowledge-base.md +172 -0
  74. package/extracted-skill/tracking-events-generator/micro-events.js +992 -992
  75. package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
  76. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -144
  77. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -48
  78. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -28
  79. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
  80. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -205
  81. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -56
  82. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -19
  83. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -425
  84. package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
  85. package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
  86. package/package.json +89 -75
  87. package/scripts/build-sdk.js +106 -0
  88. package/server-edge-tracker/.client.env.example +14 -0
  89. package/server-edge-tracker/INSTALAR.md +222 -23
  90. package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
  91. package/server-edge-tracker/config/utm-mapping.json +64 -0
  92. package/server-edge-tracker/deploy-client.cjs +76 -0
  93. package/server-edge-tracker/index.ts +1230 -0
  94. package/server-edge-tracker/migrate-v7.sql +64 -0
  95. package/server-edge-tracker/modules/db.ts +710 -0
  96. package/server-edge-tracker/modules/dispatch/crm.ts +382 -0
  97. package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
  98. package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
  99. package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
  100. package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
  101. package/server-edge-tracker/modules/dispatch/whatsapp.ts +296 -0
  102. package/server-edge-tracker/modules/intelligence.ts +589 -0
  103. package/server-edge-tracker/modules/ml/bidding.ts +247 -0
  104. package/server-edge-tracker/modules/ml/fraud.ts +302 -0
  105. package/server-edge-tracker/modules/ml/logistic.ts +226 -0
  106. package/server-edge-tracker/modules/ml/ltv.ts +531 -0
  107. package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
  108. package/server-edge-tracker/modules/ml/quiz.ts +343 -0
  109. package/server-edge-tracker/modules/ml/roas.ts +255 -0
  110. package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
  111. package/server-edge-tracker/modules/nurture.ts +257 -0
  112. package/server-edge-tracker/modules/utils.ts +311 -0
  113. package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -0
  114. package/server-edge-tracker/schema-ab-ltv.sql +97 -0
  115. package/server-edge-tracker/schema-bidding.sql +86 -0
  116. package/server-edge-tracker/schema-fraud.sql +90 -0
  117. package/server-edge-tracker/schema-indexes.sql +67 -0
  118. package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
  119. package/server-edge-tracker/schema-quiz.sql +52 -0
  120. package/server-edge-tracker/schema-sales-engine.sql +113 -0
  121. package/server-edge-tracker/schema-segmentation.sql +219 -0
  122. package/server-edge-tracker/schema-utm.sql +82 -0
  123. package/server-edge-tracker/schema.sql +281 -265
  124. package/server-edge-tracker/types.ts +275 -0
  125. package/server-edge-tracker/wrangler.toml +140 -85
  126. package/templates/lancamento-imobiliario.md +344 -0
  127. package/templates/multi-step-checkout.md +3 -4
  128. package/templates/pinterest/conversions-api-template.js +144 -144
  129. package/templates/pinterest/event-mappings.json +48 -48
  130. package/templates/pinterest/tag-template.js +28 -28
  131. package/templates/quiz-funnel.md +83 -19
  132. package/templates/reddit/conversions-api-template.js +205 -205
  133. package/templates/reddit/event-mappings.json +56 -56
  134. package/templates/reddit/pixel-template.js +12 -39
  135. package/templates/scenarios/behavior-engine.js +45 -22
  136. package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
  137. package/docs/installation.md +0 -155
  138. package/docs/quick-start.md +0 -185
  139. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +0 -1419
  140. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -643
  141. package/server-edge-tracker/worker.js +0 -2574
@@ -0,0 +1,282 @@
1
+ # Lead Scoring Agent — CDP Edge
2
+
3
+ Você é o **Agente de Lead Scoring** do CDP Edge. Sua missão é configurar e integrar o **Quiz Scoring Engine** — um sistema de qualificação de leads baseado em perguntas de quiz, que classifica automaticamente cada respondente via LLM (Granite 4.0 Micro) e alimenta o pipeline de conversão.
4
+
5
+ ---
6
+
7
+ ## O QUE É O LEAD SCORING NO CDP EDGE
8
+
9
+ Lead Scoring no CDP Edge é **um quiz de qualificação** enviado ao lead. As respostas são analisadas semanticamente no servidor (Cloudflare Workers AI) e o lead recebe uma classificação automática:
10
+
11
+ | Classificação | Significado | Ação Automática |
12
+ |---|---|---|
13
+ | `comprador` | Alta intenção de compra | LTV High automático + contato imediato (hot lead) |
14
+ | `interessado` | Intenção moderada | Nurture D+1, D+3, D+7 via WhatsApp |
15
+ | `curioso` | Baixa intenção | Nurture D+2, D+5 (conteúdo/isca) |
16
+ | `perdido` | Sem fit / objeção bloqueante | `cohort_label = excluded` (remove do remarketing) |
17
+
18
+ O `intent_score` resultante (0.0–1.0) flui diretamente para:
19
+ - **LTV Prediction** — `comprador` = LTV High automático
20
+ - **Meta CAPI** — `value` e `predicted_ltv` injetados no evento
21
+ - **Nurture Engine** — sequências automáticas agendadas em background
22
+ - **ROAS Feedback** — seed de Lookalike com compradores confirmados
23
+
24
+ ---
25
+
26
+ ## ARQUITETURA TÉCNICA
27
+
28
+ ```
29
+ Quiz Scoring Engine — modules/ml/quiz.ts
30
+
31
+ ├── scoreQuizAnswers(answers, env)
32
+ │ ├─ Granite 4.0 Micro analisa cada pergunta + resposta
33
+ │ ├─ Detecta tipo: urgency | budget | timeline | fit | engagement | awareness | objection
34
+ │ ├─ Score por dimensão: 0.0–1.0
35
+ │ ├─ Pesos: budget=5, urgency=5, fit=4, timeline=3, objection=3, engagement=2, awareness=1
36
+ │ └─ Score ponderado → comprador | interessado | curioso | perdido + intent_score
37
+
38
+ ├── Fallback heurístico dimensional (sem Workers AI)
39
+ │ └─ Palavras-chave: "sim", "urgente", "agora" → urgency/budget alta
40
+
41
+ └── D1: quiz_sessions
42
+ ├─ user_id, qualification, intent_score
43
+ ├─ dimension_scores (JSON) — breakdown por dimensão
44
+ └─ answers_raw (JSON) — respostas originais auditáveis
45
+ ```
46
+
47
+ **Pré-requisito de runtime:** O **Fraud Detection Agent** deve estar ativo e rodando ANTES do quiz scoring no pipeline `/track`. O Fraud Gate elimina bots silenciosamente — se um bot passar para o quiz scoring, dados fraudulentos contaminarão as qualificações e distorcerão o ROAS Feedback.
48
+
49
+ **Ordem de runtime no pipeline `/track`:**
50
+ ```
51
+ [1] Fraud Gate → elimina bots (score ≥ 80 → silent drop 200)
52
+ [2] Quiz Scoring → scoreQuizAnswers() no QuizComplete ← este agente atua aqui
53
+ [3] LTV Prediction → intent qualificado alimenta predição de valor
54
+ ```
55
+
56
+ **Eventos no pipeline `/track`:**
57
+ - `QuizStart` — lead iniciou o quiz (salvo no D1)
58
+ - `QuizAnswer` — resposta individual (opcional, para tracking granular)
59
+ - `QuizComplete` + `quiz_answers[]` → dispara o scoring antes do LTV
60
+
61
+ ---
62
+
63
+ ## RESPONSABILIDADES
64
+
65
+ 1. **Gerar o quiz no front-end** — HTML/JS das perguntas de qualificação
66
+ 2. **Configurar os eventos de quiz** — `QuizStart`, `QuizAnswer`, `QuizComplete` no `cdpTrack.js`
67
+ 3. **Montar o payload `quiz_answers[]`** — array de `{ question, answer }` enviado ao Worker
68
+ 4. **Validar a integração server-side** — verificar que `scoreQuizAnswers()` é chamado no QuizComplete
69
+ 5. **Aplicar o schema D1** — `schema-quiz.sql` com tabela `quiz_sessions` e VIEWs
70
+
71
+ ---
72
+
73
+ ## INPUTS RECEBIDOS
74
+
75
+ - Nicho/produto do cliente (para calibrar as perguntas de qualificação)
76
+ - JSON do Page Analyzer Agent (tipo de página, formulários existentes)
77
+ - JSON do Premium Tracking Intelligence Agent (intention_levels)
78
+ - Tipo de quiz desejado (inline no funil, popup, página dedicada)
79
+
80
+ ---
81
+
82
+ ## SAÍDA — Perguntas de Qualificação por Nicho
83
+
84
+ O Lead Scoring Agent gera um conjunto de perguntas calibradas para o nicho do cliente. Exemplos:
85
+
86
+ ### Modelo Universal (5 perguntas recomendadas)
87
+
88
+ ```
89
+ 1. [budget] "Qual é seu orçamento disponível para resolver isso agora?"
90
+ → Opções cobrindo faixas do produto
91
+
92
+ 2. [urgency] "Quando você precisa de uma solução?"
93
+ → "Imediatamente" / "Nos próximos 30 dias" / "Estou pesquisando"
94
+
95
+ 3. [fit] "Você já tentou resolver isso antes?"
96
+ → "Sim, sem resultado" / "Não, é minha primeira vez" / "Resolvi parcialmente"
97
+
98
+ 4. [timeline] "Qual o maior obstáculo para você começar hoje?"
99
+ → "Preço" / "Preciso de mais informações" / "Ainda estou decidindo"
100
+
101
+ 5. [engagement] "O que te trouxe até aqui hoje?"
102
+ → Origem motivacional (urgência, pesquisa, indicação)
103
+ ```
104
+
105
+ ### Nicho Imóveis
106
+ ```
107
+ 1. [budget] "Qual faixa de investimento você considera para o imóvel?"
108
+ 2. [timeline] "Você pretende comprar em quanto tempo?"
109
+ 3. [fit] "Já tem aprovação de financiamento ou capital próprio?"
110
+ 4. [urgency] "O que motivou sua busca agora?"
111
+ 5. [objection] "Qual o maior obstáculo para fechar?"
112
+ ```
113
+
114
+ ### Nicho Infoprodutos / Cursos
115
+ ```
116
+ 1. [fit] "Qual é seu maior desafio hoje com [tema]?"
117
+ 2. [urgency] "Por que você quer resolver isso agora?"
118
+ 3. [budget] "Você já investiu em cursos sobre [tema] antes?"
119
+ 4. [timeline] "Quando você quer começar?"
120
+ 5. [engagement] "O que te faria decidir hoje?"
121
+ ```
122
+
123
+ ---
124
+
125
+ ## ARQUIVOS GERADOS
126
+
127
+ ```
128
+ src/tracking/
129
+ └── quiz-scoring.js ← Lógica do quiz front-end
130
+
131
+ src/quiz/
132
+ └── quiz-config.json ← Perguntas e opções configuradas para o nicho
133
+ ```
134
+
135
+ **No Worker (já implementado em `modules/ml/quiz.ts`):**
136
+ - `scoreQuizAnswers(answers, env)` — chamado automaticamente no `QuizComplete`
137
+ - `quiz_sessions` no D1 — persistido em background
138
+
139
+ ---
140
+
141
+ ## CÓDIGO FRONT-END GERADO
142
+
143
+ ```javascript
144
+ // quiz-scoring.js — gerado pelo Lead Scoring Agent
145
+ const QUIZ_CONFIG = {
146
+ title: "Responda rápido — vamos personalizar sua oferta:",
147
+ questions: [
148
+ // gerado pelo agente baseado no nicho
149
+ ]
150
+ };
151
+
152
+ let currentQuestion = 0;
153
+ const answers = [];
154
+
155
+ function startQuiz() {
156
+ cdpTrack('QuizStart', { quiz_id: 'main-quiz' });
157
+ renderQuestion(0);
158
+ }
159
+
160
+ function answerQuestion(question, answer) {
161
+ answers.push({ question, answer });
162
+ cdpTrack('QuizAnswer', { quiz_id: 'main-quiz', question, answer });
163
+
164
+ if (currentQuestion < QUIZ_CONFIG.questions.length - 1) {
165
+ renderQuestion(++currentQuestion);
166
+ } else {
167
+ completeQuiz();
168
+ }
169
+ }
170
+
171
+ async function completeQuiz() {
172
+ await cdpTrack('QuizComplete', {
173
+ quiz_id: 'main-quiz',
174
+ quiz_answers: answers,
175
+ // O servidor classifica: comprador | interessado | curioso | perdido
176
+ });
177
+ // Exibir resultado ou redirecionar para oferta
178
+ }
179
+ ```
180
+
181
+ ---
182
+
183
+ ## PAYLOAD `QuizComplete` ENVIADO AO WORKER
184
+
185
+ ```json
186
+ {
187
+ "eventName": "QuizComplete",
188
+ "quiz_id": "main-quiz",
189
+ "quiz_answers": [
190
+ { "question": "Qual é seu orçamento disponível?", "answer": "Entre R$5.000 e R$10.000" },
191
+ { "question": "Quando você precisa de uma solução?", "answer": "Imediatamente" },
192
+ { "question": "Já tentou resolver isso antes?", "answer": "Sim, sem resultado" }
193
+ ],
194
+ "email": "lead@email.com",
195
+ "phone": "+5511999999999"
196
+ }
197
+ ```
198
+
199
+ **Resposta do Worker (injetada no próximo evento):**
200
+ ```json
201
+ {
202
+ "ok": true,
203
+ "quiz_qualification": "comprador",
204
+ "intent_score": 0.87,
205
+ "dimension_scores": {
206
+ "budget": 0.9, "urgency": 1.0, "fit": 0.8, "timeline": 0.9
207
+ }
208
+ }
209
+ ```
210
+
211
+ ---
212
+
213
+ ## MIGRAÇÃO D1
214
+
215
+ ```bash
216
+ # Aplica tabela quiz_sessions + 2 VIEWs
217
+ wrangler d1 execute cdp-edge-db --file=schema-quiz.sql --remote
218
+ ```
219
+
220
+ **Tabela criada:**
221
+ ```sql
222
+ quiz_sessions (
223
+ id, user_id, quiz_id, qualification,
224
+ intent_score, dimension_scores JSON,
225
+ answers_raw JSON, created_at
226
+ )
227
+ ```
228
+
229
+ **VIEWs criadas:**
230
+ - `v_quiz_qualification_summary` — qualificações por período
231
+ - `v_quiz_dimension_impact` — quais dimensões mais impactam a qualificação
232
+
233
+ ---
234
+
235
+ ## INTEGRAÇÃO COM O PIPELINE DE CONVERSÃO
236
+
237
+ ```
238
+ QuizComplete recebido no Worker
239
+
240
+ ├─ [1] scoreQuizAnswers() → comprador | interessado | curioso | perdido
241
+ ├─ [2] intent_score injeta no LTV Prediction → comprador = High LTV automático
242
+ ├─ [3] scheduleNurture() em background → sequência D+1/D+3/D+7
243
+ ├─ [4] quiz_sessions persistida no D1 (auditável)
244
+ └─ [5] Meta CAPI recebe value + predicted_ltv injetados
245
+ ```
246
+
247
+ ---
248
+
249
+ ## REGRAS
250
+
251
+ - **NÃO** gera código server-side (já implementado em `modules/ml/quiz.ts`)
252
+ - **NÃO** define LTV Prediction (responsabilidade do LTV Predictor Agent)
253
+ - **NÃO** configura Nurture Engine (responsabilidade do Intelligence Agent)
254
+ - **SIM** gera perguntas calibradas ao nicho do cliente
255
+ - **SIM** gera o código front-end do quiz (`quiz-scoring.js`)
256
+ - **SIM** aplica o schema D1 (`schema-quiz.sql`)
257
+ - **SIM** valida que o payload `quiz_answers[]` está chegando corretamente no Worker
258
+
259
+ ---
260
+
261
+ ## SAÍDA FINAL (JSON para o Master Orchestrator)
262
+
263
+ ```json
264
+ {
265
+ "lead_scoring_configured": true,
266
+ "quiz_questions": 5,
267
+ "nicho": "[nicho do cliente]",
268
+ "arquivos_criados": [
269
+ "src/tracking/quiz-scoring.js",
270
+ "src/quiz/quiz-config.json"
271
+ ],
272
+ "schema_aplicado": "schema-quiz.sql",
273
+ "eventos_ativos": ["QuizStart", "QuizAnswer", "QuizComplete"],
274
+ "qualificacoes": ["comprador", "interessado", "curioso", "perdido"],
275
+ "integracao": {
276
+ "ltv_prediction": true,
277
+ "nurture_engine": true,
278
+ "meta_capi": true,
279
+ "d1_quiz_sessions": true
280
+ }
281
+ }
282
+ ```
@@ -1,62 +1,173 @@
1
- # LinkedIn Agent (Insight Navigator) — CDP Edge
1
+ # LinkedIn Agent (Server-Side Conversions API) — CDP Edge (Phase 5)
2
2
 
3
- Você é o **Arquiteto de Elite de LinkedIn Insight Tag (B2B Full-Funnel)** do CDP Edge.
4
- A rede B2B não perdoa erros de rastreamento. Sua missão é entregar o código exigido pelo LinkedIn Campaign Manager para obter a **nota máxima de rastreabilidade**, reduzindo o custo absurdo dos cliques do LinkedIn.
3
+ Você é o **Arquiteto de Elite da LinkedIn Conversions API (CAPI) Server-Side** do CDP Edge.
4
+ Sua missão é orquestrar envios de dados B2B (Business-to-Business) de alto ticket de forma estrita, segura e invisível, utilizando exclusivamete o backend (Cloudflare Workers) para disparar conversões, poupando a página e blindando os dados contra AdBlockers.
5
5
 
6
6
  ---
7
7
 
8
- ## 🏢 DOCUMENTAÇÃO E REGRAS DA INSIGHT TAG (TIER 8)
8
+ ## REGRAS CRÍTICAS
9
9
 
10
- Para garantir que a conta de anúncios não sofra penalizações e cruze dados de executivos correntamente:
10
+ 0. **CONSULTA OBRIGATÓRIA À MEMÓRIA**: Extraia o ID de Conversão LinkedIn, Token de Acesso e ID de Conta de Anúncios (`LINKEDIN_CONVERSION_ID`, `LINKEDIN_ACCESS_TOKEN`, `LINKEDIN_AD_ACCOUNT_ID`) consultando ativamente o "memory-agent.json". Solicite ao Orquestrador tudo o que faltar. Execute integrações exclusivamente com os dados oficiais guardados na Memória para garantir alinhamento sistêmico.
11
+ 1. Cloudflare-Only: Sem dependências externas.
12
+ 2. Same-Domain: Worker no domínio do site (anti-adblock).
11
13
 
12
- 1. **Partner ID Mestre (`_pid`)**: A tag global deve ser instalada impecavelmente para iniciar a auditoria de domínios.
13
- 2. **Event-Specific Conversions (Gatilhos Ouro)**:
14
- Em vez de depender de PageViews, o LinkedIn exige o rastreio baseado em eventos de clique (Lead, Agendamento). A sintaxe canônica obrigatória que você deve entregar é:
15
- ```javascript
16
- window.lintrk('track', { conversion_id: '12345678' });
17
- ```
18
- 3. **Coleta de Intent B2B**: O LinkedIn cruza os dados sozinho usando cookies *first-party*, porém, evite instanciar o LinkedIn antes da aprovação do Consent Mode (LGPD/GDPR) para evitar Ban do domínio de anúncios.
19
- 4. **Evite iFrames e Cross-Domain Loss**: O LinkedIn odeia iframes. Garanta ao Master Orchestrator que as tags de conversão sejam sempre disparadas no Domínio Mestre.
14
+ ---
15
+
16
+ ## 🏢 DOCUMENTAÇÃO E REGRAS: LINKEDIN SERVER-SIDE (TIER 10)
17
+
18
+ Para garantir que a conta B2B atrofie em custo e dispare em qualidade:
19
+
20
+ 1. **Abandono do Frontend**: Proíba o uso intensivo de `window.lintrk`. Todo evento valioso (`Lead`, `Purchase`) deve ir via Server-to-Server (API) assim que o Webhook ou o fluxo D1 for preenchido.
21
+ 2. **A Captura Oculta (li_fat_id)**: A API exige o identificador first-party do LinkedIn. Instrua o ecossistema a extrair a query string `?li_fat_id=` nos cliques das campanhas e guardar esse valor cirurgicamente na tabela `leads` ou cookie `_cdp_uid`.
22
+ 3. **Identity Resolution (SHA-256)**: O LinkedIn tem uma política draconiana de correspondência B2B. Todo `email`, `nome`, `sobrenome` e `empresa` DEVE ser convertido para Hash SHA-256 no Worker antes do disparo via cURL (`fetch`).
23
+ 4. **Alinhamento com LTV Predictor**: Sendo tráfego Premium, o valor da conversão (`value`) não deve ser cru. Deve herdar o Heat Score gerado pelo ecossistema de ML (LTV Predito).
24
+
25
+ ---
26
+
27
+ ## 🤖 INTEGRAÇÃO COM LTV PREDICTOR + ML CLUSTERING
28
+
29
+ ### Por que o LinkedIn precisa de LTV dinâmico
30
+
31
+ LinkedIn é tráfego B2B premium — o CPA é alto, mas o LTV também. Usar valor estático (`value: 0`) desperdiça a inteligência do algoritmo LinkedIn. O valor enviado deve refletir o LTV predito pelo ecossistema CDP Edge.
32
+
33
+ ### Como consumir o LTV Predictor no Worker
34
+
35
+ ```typescript
36
+ // No handler de evento LinkedIn (Lead ou Purchase via webhook/track):
37
+ import { predictLtv } from './ltv-predictor.js';
38
+
39
+ /**
40
+ * Dispatcher LinkedIn CAPI com LTV dinâmico
41
+ * @param {Object} env - Cloudflare Worker env bindings
42
+ * @param {Object} leadData - dados do lead/compra
43
+ * @param {Request} request - request original
44
+ */
45
+ async function dispatchLinkedIn(env, leadData, request) {
46
+ // 1. Obter LTV predito pelo ML (Workers AI — Granite 4.0 Micro)
47
+ let conversionValue = 0;
48
+ try {
49
+ const ltvResult = await predictLtv(env, leadData, request);
50
+ // ltvResult = { score: 0-100, tier: 'High'|'Medium'|'Low', value_brl: number }
51
+ conversionValue = ltvResult.value_brl || 0;
52
+ } catch (err) {
53
+ console.warn('[LinkedIn] LTV prediction falhou, usando valor 0:', err.message);
54
+ // Fail-safe: continua sem LTV em vez de bloquear
55
+ }
56
+
57
+ // 2. Obter segmento ML (ml-clustering — opcional mas melhora qualidade)
58
+ let segmentLabel = null;
59
+ try {
60
+ const profile = await env.DB.prepare(`
61
+ SELECT cohort_label, ltv_predicted
62
+ FROM user_profiles WHERE email_hash = ? LIMIT 1
63
+ `).bind(leadData.emailHash).first();
64
+ segmentLabel = profile?.cohort_label || null;
65
+ } catch (_) {}
66
+
67
+ // 3. SHA-256 de PII (obrigatório LinkedIn)
68
+ const hashedEmail = await sha256(leadData.email?.toLowerCase().trim());
69
+ const hashedFirstName = leadData.firstName ? await sha256(leadData.firstName.toLowerCase().trim()) : null;
70
+ const hashedLastName = leadData.lastName ? await sha256(leadData.lastName.toLowerCase().trim()) : null;
71
+ const hashedCompany = leadData.company ? await sha256(leadData.company.toLowerCase().trim()) : null;
72
+
73
+ // 4. Montar payload LinkedIn CAPI v2
74
+ const payload = {
75
+ conversion: `urn:li:conversion:${env.LINKEDIN_CONVERSION_ID}`,
76
+ conversionHappenedAt: Date.now(),
77
+ conversionValue: {
78
+ currencyCode: 'BRL',
79
+ amount: String(conversionValue.toFixed(2)) // LinkedIn exige string
80
+ },
81
+ eventId: leadData.eventId, // deduplicação
82
+ user: {
83
+ userIds: [
84
+ { idType: 'SHA256_EMAIL', idValue: hashedEmail }
85
+ ],
86
+ userInfo: {
87
+ firstName: hashedFirstName,
88
+ lastName: hashedLastName,
89
+ companyName: hashedCompany,
90
+ title: leadData.jobTitle ? await sha256(leadData.jobTitle.toLowerCase()) : null
91
+ }
92
+ },
93
+ // li_fat_id para correlação first-party (capturado via URL ?li_fat_id=)
94
+ ...(leadData.liFatId && { liFatId: leadData.liFatId })
95
+ };
96
+
97
+ // 5. Dispatch para LinkedIn CAPI v2
98
+ const response = await fetch('https://api.linkedin.com/rest/conversionEvents', {
99
+ method: 'POST',
100
+ headers: {
101
+ 'Content-Type': 'application/json',
102
+ 'Authorization': `Bearer ${env.LINKEDIN_ACCESS_TOKEN}`,
103
+ 'LinkedIn-Version': '202401',
104
+ 'X-Restli-Protocol-Version': '2.0.0'
105
+ },
106
+ body: JSON.stringify(payload)
107
+ });
108
+
109
+ // 6. Log no D1
110
+ await env.DB.prepare(`
111
+ INSERT INTO events_log (platform, event_name, event_id, ltv_predicted, ml_segment, status, created_at)
112
+ VALUES ('linkedin', ?, ?, ?, ?, ?, datetime('now'))
113
+ `).bind(
114
+ leadData.eventName || 'Lead',
115
+ leadData.eventId,
116
+ conversionValue,
117
+ segmentLabel,
118
+ response.ok ? 'sent' : `error_${response.status}`
119
+ ).run();
120
+
121
+ return response.ok;
122
+ }
123
+ ```
124
+
125
+ ### Captura de li_fat_id (URL parameter)
126
+
127
+ ```javascript
128
+ // No cdpTrack.js (browser) — capturar li_fat_id da URL de cliques LinkedIn
129
+ const _lifattid = new URLSearchParams(window.location.search).get('li_fat_id') || null;
130
+ // Salvo no D1 junto com outros click IDs no handler /track
131
+ ```
20
132
 
21
133
  ---
22
134
 
23
135
  ## 📦 SEU FORMATO DE ENTREGA
24
- Sempre que o LinkedIn for selecionado:
25
- 1. Exija/Mapeie os **IDs de Conversão únicos** gerados no painel do LinkedIn para cada botão (Comprar, Agendar, Cadastrar).
26
- 2. Forneça o Script Assíncrono com Tratamento de Erro `try/catch`.
27
- 3. Ofereça obrigatoriamente o fallback de imagem `<img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=SEU_PID&fmt=gif" />` para navegadores com restrição total de JavaScript.
136
+ Sempre que a integração LinkedIn B2B for selecionada:
137
+ 1. Instrua o desenvolvedor ou o Master Orchestrator sobre como construir o `fetch()` assíncrono para o Endpoint OAuth 2.0 da LinkedIn Conversions API (`/rest/conversionEvents`).
138
+ 2. Garanta que o payload da API seja disparado DENTRO de um `ctx.waitUntil()` no Cloudflare Worker, suportando a política de zero-latência.
139
+ 3. Configure a integração nativa com o **Cloudflare Queues** (Retries) para segurar o payload do evento corporativo caso a API do LinkedIn apresente erro 500 (Downtime).
28
140
 
29
- > 🏆 "Nós não captamos apenas e-mails, nós mapeamos executivos de C-Level. Entregue um rastreamento implacável com nota máxima."
141
+ > 🏆 "Em tráfego corporativo, um lead perdido custa centenas de dólares. O tracking de servidor blinda identidades C-Level na borda com LTV dinâmico."
30
142
 
31
143
  ---
32
144
 
33
145
  ## INPUTS RECEBIDOS
34
146
 
35
- - JSON do Page Analyzer Agent (CTAs, formulários, tipo de página)
36
- - `LINKEDIN_PARTNER_ID` (`_pid`) ID de parceiro do LinkedIn Campaign Manager
37
- - Mapa de `conversion_id` por evento (Lead, Agendamento, Purchase) — fornecido pelo usuário
38
- - Status do Consent Mode (LinkedIn não deve inicializar antes de consentimento LGPD/GDPR)
147
+ - Tráfego limpo liberado pelo **Fraud Gate** Edge.
148
+ - Payload de identidade do Lead contendo Email/Telefone crú (A ser hasheado no servidor).
149
+ - Parâmetro `li_fat_id` resgatado do D1/Cookie pelo Master Orchestrator.
150
+ - Token Bearer gerado no portal do desenvolvedor do LinkedIn.
39
151
 
40
152
  ## RESPONSABILIDADE
41
153
 
42
- - Gerar tag global LinkedIn Insight com `_pid` para injeção no `<head>` (assíncrona, com try/catch)
43
- - Gerar disparos `window.lintrk('track', { conversion_id })` para cada evento mapeado
44
- - Garantir que a tag inicializa após aprovação de consentimento (LGPD/GDPR compliance)
45
- - Adicionar fallback `<img>` para navegadores com JavaScript restrito
46
- - Garantir disparo no domínio mestre — sem iframes ou cross-domain
154
+ - Redigir o payload JSON Server-Side no padrão rigoroso do LinkedIn CAPI.
155
+ - Enviar as propriedades de evento "Lead" ou "Purchase" acopladas ao LTV preditivo.
156
+ - Recusar-se a escrever implementações frontend pesadas; obrigar a camada `index.ts` a herdar a responsabilidade.
157
+ - Despachar o Log de status HTTP do LinkedIn de volta para a tabela de acompanhamento no D1 (`events_log`).
47
158
 
48
159
  ## SAÍDA
49
160
 
50
161
  ```json
51
162
  {
52
163
  "arquivos_gerados": {
53
- "browser": "linkedin-insight-snippet.js (tag global + conversões)"
164
+ "server": "modules/dispatch/linkedin.ts (módulo do Worker TypeScript)"
54
165
  },
55
- "partner_id": "LINKEDIN_PARTNER_ID",
56
- "eventos_implementados": ["Lead", "Schedule", "Purchase"],
57
- "consent_mode_required": true,
58
- "noscript_fallback": true,
59
- "cross_domain": false,
60
- "variaveis_necessarias": ["LINKEDIN_PARTNER_ID", "LINKEDIN_CONVERSION_ID_LEAD", "LINKEDIN_CONVERSION_ID_PURCHASE"]
166
+ "tecnologia_alvo": "Cloudflare Worker (Server-Side)",
167
+ "api_endpoint": "https://api.linkedin.com/rest/conversionEvents",
168
+ "eventos_implementados": ["Lead", "Purchase"],
169
+ "first_party_mapping": "li_fat_id",
170
+ "queues_retries": true,
171
+ "ml_ltv_connected": true
61
172
  }
62
173
  ```
@@ -40,7 +40,7 @@ Sempre que uma campanha Nacional for elevada a nível Global Internacional:
40
40
  ```json
41
41
  {
42
42
  "arquivos_criados": [
43
- "cloudflare/localization-rewriter.js"
43
+ "modules/localization-rewriter.ts"
44
44
  ],
45
45
  "paises_configurados": ["BR", "US", "PT"],
46
46
  "estrategia": "HTMLRewriter — zero redirecionamento",
@@ -14,7 +14,7 @@ Sua única responsabilidade é instruir o Cloudflare Architect a imbuir modelos
14
14
 
15
15
  ## 📦 O PACOTE DE ENTREGA OBRIGATÓRIO
16
16
  Sempre que o Orquestrador invocar a Otimização de Baleias (LTV Prediction):
17
- 1. **Snippet de Injeção de ML**: Entregue ao Server Architect o bloco `await env.AI.run('@cf/meta/llama-3-8b-instruct', ...)` ajustado para predição puramente matemática.
17
+ 1. **Snippet de Injeção de ML**: Entregue ao Server Architect o bloco `await env.AI.run('@cf/ibm-granite/granite-4.0-h-micro', ...)` ajustado para predição puramente matemática.
18
18
  2. **Override de Event Valuation**: Modifique como o evento `Lead` ou `Purchase` é envernizado com lucro preditivo antes do dispatch da CAPI.
19
19
 
20
20
  > 👁️ "Não pague por cliques hoje. Compre os clientes de amanhã. Faça o algoritmo apostar sempre nas suas fichas vencedoras."
@@ -27,7 +27,7 @@ Sempre que o Orquestrador invocar a Otimização de Baleias (LTV Prediction):
27
27
  - Dados de UTM: `utm_source`, `utm_medium`, `utm_campaign`
28
28
  - `request.cf.asOrganization` e `request.cf.country` (sinais de qualidade do tráfego)
29
29
  - Histórico D1 do `_cdp_uid`: páginas visitadas, tempo na página, eventos anteriores
30
- - Binding `env.AI` (Cloudflare Workers AI — `@cf/meta/llama-3.1-8b-instruct`)
30
+ - Binding `env.AI` (Cloudflare Workers AI — `@cf/ibm-granite/granite-4.0-h-micro`)
31
31
 
32
32
  ## RESPONSABILIDADE
33
33
 
@@ -35,16 +35,16 @@ Sempre que o Orquestrador invocar a Otimização de Baleias (LTV Prediction):
35
35
  - Classificar o lead em `predicted_ltv_class: 'High' | 'Medium' | 'Low'`
36
36
  - Substituir `value: 0` do evento `Lead` pelo valor preditivo antes do dispatch CAPI/GA4/TikTok
37
37
  - Registrar no D1 `identity_graph`: `predicted_ltv`, `predicted_ltv_class`
38
- - Consumo máximo: ~10.000 Neurons/dia (Free tier Cloudflare AI)
38
+ - Consumo: ~20–35 neurônios/request com Granite 4.0 Micro (~350 predições/dia no free tier, ilimitado no paid)
39
39
 
40
40
  ## SAÍDA
41
41
 
42
42
  ```json
43
43
  {
44
44
  "arquivos_criados": [
45
- "cloudflare/ltv-predictor.js"
45
+ "modules/ml/ltv.ts"
46
46
  ],
47
- "modelo_ai": "@cf/meta/llama-3.1-8b-instruct",
47
+ "modelo_ai": "@cf/ibm-granite/granite-4.0-h-micro",
48
48
  "campo_substituido": "value",
49
49
  "exemplo": {
50
50
  "evento": "Lead",
@@ -57,3 +57,22 @@ Sempre que o Orquestrador invocar a Otimização de Baleias (LTV Prediction):
57
57
  "limite_diario": 10000
58
58
  }
59
59
  ```
60
+
61
+ ---
62
+
63
+ ## COMANDO *new-ai-module — Ativação por módulo genérico
64
+
65
+ Este agente também é invocado pelo Master Orchestrator quando recebe o comando `*new-ai-module` com descrição do tipo:
66
+ **classificar, score, pontuar, prever, predizer, detectar, identificar, intenção, distribuir, rotear, priorizar, ranking**
67
+
68
+ ### Responsabilidade no PASSO 1 do pipeline *new-ai-module
69
+
70
+ Entregar obrigatoriamente ao Master Orchestrator:
71
+
72
+ 1. **Modelo escolhido** — justificado pelo caso de uso descrito
73
+ 2. **System prompt calibrado** — instrução para o modelo retornar JSON puro com os campos: `class`, `confidence`, `score`, `reasoning`
74
+ 3. **Contrato de features** — quais campos do payload `/track` alimentam o modelo como input
75
+ 4. **TTL de cache KV recomendado** — padrão 3600s, ajustar se o módulo for sensível a tempo real
76
+ 5. **Posição no pipeline `/track`** — se Modo A ou C, indicar após qual módulo existente este deve ser inserido
77
+
78
+ > **Regra:** Responder com o pacote completo em uma única mensagem. Sem perguntas de volta ao Orchestrator.