cdp-edge 2.3.8 → 2.5.1

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 (29) hide show
  1. package/README.md +304 -639
  2. package/bin/cdp-edge.js +3 -2
  3. package/dist/commands/validate.js +248 -84
  4. package/dist/sdk/cdpTrack.js +2095 -0
  5. package/dist/sdk/cdpTrack.min.js +64 -0
  6. package/dist/sdk/install-snippet.html +10 -0
  7. package/extracted-skill/tracking-events-generator/agents/devops-agent.md +22 -0
  8. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +53 -0
  9. package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
  10. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +60 -6
  11. package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
  12. package/extracted-skill/tracking-events-generator/agents/utm-agent.md +285 -154
  13. package/extracted-skill/tracking-events-generator/anti-blocking.js +1 -1
  14. package/extracted-skill/tracking-events-generator/cdpTrack.js +10 -18
  15. package/extracted-skill/tracking-events-generator/engagement-scoring.js +2 -2
  16. package/extracted-skill/tracking-events-generator/micro-events.js +1 -1
  17. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
  18. package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
  19. package/package.json +5 -1
  20. package/scripts/build-sdk.js +106 -0
  21. package/server-edge-tracker/index.ts +174 -6
  22. package/server-edge-tracker/modules/intelligence.ts +155 -2
  23. package/server-edge-tracker/modules/ml/quiz.ts +343 -0
  24. package/server-edge-tracker/modules/ml/roas.ts +255 -0
  25. package/server-edge-tracker/modules/nurture.ts +257 -0
  26. package/server-edge-tracker/modules/utils.ts +2 -0
  27. package/server-edge-tracker/schema-quiz.sql +52 -0
  28. package/server-edge-tracker/schema-sales-engine.sql +113 -0
  29. package/templates/quiz-funnel.md +83 -19
@@ -1,61 +1,222 @@
1
- # UTM Agent — Agente de Geração de UTMs Obfuscadas
1
+ # UTM Agent — CDP Edge
2
2
 
3
- ## Role
4
- Especialista em gerar estruturas de UTM parametrizadas para segmentação de público, com valores **obfuscados/racheados** para proteção de dados sensíveis na URL.
3
+ **Papel:** Gerador automático de UTMs completas — usa o contexto já coletado pelo CDP Edge para produzir cada string de UTM pronta, por plataforma e por formato de anúncio. O cliente copia e cola.
5
4
 
6
- ## When This Agent Runs
7
- - Após o **Page Analyzer** identificar o tipo de página/produto
8
- - Antes de gerar os parâmetros de tracking no SDK
9
- - Quando o usuário precisa configurar campanhas com categorização de valor
5
+ ---
10
6
 
11
- ## Inputs from Page Analyzer
12
- ```json
13
- {
14
- "page_type": "produto",
15
- "product_category": "imovel" | "automotivo" | "curso" | "outros",
16
- "url": "https://lançamentosabc.com.br/apartamento-123",
17
- "existing_utms": {} // se houver
18
- }
7
+ ## Princípio Fundamental
8
+
9
+ O CDP Edge já sabe tudo que precisa para gerar as UTMs. Nenhuma informação adicional do cliente é necessária além do que já foi coletado nas fases anteriores:
10
+
11
+ | O que o CDP Edge já sabe | De onde vem |
12
+ |---|---|
13
+ | Quais plataformas serão usadas | FASE 0-B (seleção de plataformas) |
14
+ | Se tem vídeo no funil | Page Analyzer (detecta VSL, videos, players) |
15
+ | Se tem quiz | Lead Scoring Agent (configurado na FASE 6) |
16
+ | Se tem formulário / landing page | Page Analyzer (detecta forms, CTAs) |
17
+ | Se tem Click-to-WhatsApp | Meta selecionado + CTWA habilitado automaticamente |
18
+ | Nicho e categoria do produto | Page Analyzer |
19
+ | Faixa de valor do produto | Pergunta feita pelo próprio UTM Agent na FASE 2-B |
20
+
21
+ **Com tudo isso, o UTM Agent gera uma tabela completa de UTMs prontas — o cliente não precisa inventar nenhum parâmetro.**
22
+
23
+ ---
24
+
25
+ ## O Que São as 5 Dimensões
26
+
27
+ ```
28
+ utm_source → PLATAFORMA — de qual rede de anúncio veio o lead
29
+ utm_medium → FORMATO — qual tipo de anúncio foi usado
30
+ utm_campaign → PRODUTO/FAIXA — qual produto e faixa de valor (obfuscado)
31
+ utm_content → ORIGEM — qual criativo/página/funil gerou o lead
32
+ utm_term → QUALIFICAÇÃO — classificação do quiz (preenchida pelo Worker)
19
33
  ```
20
34
 
21
- ## Workflow
35
+ `utm_term` é o único campo que o cliente **nunca** configura nos anúncios — o Worker injeta automaticamente após o Quiz Scoring Engine classificar o lead.
22
36
 
23
- ### 1. Identificar necessidade de UTM
24
- - Se `product_category` existir, perguntar ao usuário sobre categorização de valor
25
- - Exemplos de perguntas:
26
- - Para **imóveis**: "Qual a faixa de preço deste imóvel? Ex: 500k-800k, 800k-1.5M, 1M-3M"
27
- - Para **automotivos**: "Qual a faixa de valor? Ex: 50k-100k, 100k-200k, 200k-500k"
28
- - Para **cursos**: "Qual o nível/preço? Ex: básico-49, premium-199, pro-999"
37
+ ---
29
38
 
30
- ### 2. Gerar estrutura de UTM obfuscada
39
+ ## Quando Este Agente Roda
31
40
 
32
- Para cada categoria informada pelo usuário, gerar:
41
+ Após o **Lead Scoring Agent** (se quiz habilitado) e antes do **Browser Tracking Agent**.
33
42
 
34
- ```json
35
- {
36
- "utm_strategy": {
37
- "source": "facebook", // padrão, configurável
38
- "medium": "cpc", // padrão, configurável
39
- "campaign": {
40
- "pattern": "{product_category}_{obfuscated_range}",
41
- "example": "imovel_8a3f1d2b"
42
- },
43
- "content": {
44
- "pattern": "product_{obfuscated_id}",
45
- "example": "product_9c4e2a1f"
46
- },
47
- "faixa_obfuscada": {
48
- "original": "700k-1M",
49
- "obfuscated": "8a3f1d2b",
50
- "hash_method": "sha256",
51
- "salt": "CDP_EDGE_UTM_SALT"
52
- }
53
- }
54
- }
43
+ Inputs que o agente já possui ao ser chamado:
44
+ - `SELECTED_PLATFORMS` — plataformas selecionadas na FASE 0-B
45
+ - `page_analysis` — saída do Page Analyzer (tem video? tem quiz? tem form? tem CTWA?)
46
+ - `lead_scoring_config` quiz configurado? quais perguntas? qual nome do quiz?
47
+ - `utm_value_range` faixa de valor do produto (perguntada na FASE 2-B)
48
+ - `product_category` — nicho detectado pelo Page Analyzer
49
+
50
+ ---
51
+
52
+ ## Processo de Geração
53
+
54
+ ### PASSO 1 — Mapear o que foi implementado no funil
55
+
56
+ O agente lê os outputs das fases anteriores e monta um inventário de origens:
57
+
58
+ ```
59
+ INVENTÁRIO DE ORIGENS (montado automaticamente):
60
+
61
+ Plataformas ativas: [facebook, google, tiktok]
62
+ Formatos por plataforma:
63
+ facebook → [reels, stories, video, cpc, ctwa] ← detectado: tem VSL + tem CTWA
64
+ google → [cpc] ← search only
65
+ tiktok → [video] ← video in-feed
66
+ Tipos de página:
67
+ → quiz habilitado → utm_content inclui quiz_{nome_quiz}
68
+ → landing com VSL → utm_content inclui video_{tipo}
69
+ → formulário direto → utm_content inclui landing_principal
70
+ → CTWA ativo → utm_content inclui ctwa_direto
71
+ ```
72
+
73
+ ### PASSO 2 — Gerar o valor obfuscado da campanha
74
+
75
+ Com a faixa de valor informada (ex: "700k-1M"):
76
+ ```
77
+ SHA256("700k-1M" + "CDP_EDGE_UTM_SALT") → primeiros 8 chars → "8a3f1d2b"
78
+ utm_campaign = imovel_8a3f1d2b
55
79
  ```
56
80
 
57
- ### 3. Mapeamento reversível (para o Worker)
58
- Gerar o arquivo `utm-mapping.json` com:
81
+ Registrar no `utm-mapping.json` para de-obfuscação no Worker.
82
+
83
+ ### PASSO 3 — Gerar a tabela completa de UTMs prontas
84
+
85
+ Para CADA combinação de plataforma × formato × origem que existe no funil:
86
+
87
+ ---
88
+
89
+ ## Saída — Tabela de UTMs Prontas para o Cliente
90
+
91
+ O agente entrega uma tabela assim, gerada automaticamente com base no que foi implementado:
92
+
93
+ ```markdown
94
+ # UTMs do Projeto [NOME DO CLIENTE]
95
+ # Geradas pelo CDP Edge — copie e cole em cada campanha
96
+
97
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
98
+ ## META ADS
99
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
100
+
101
+ ### Campanhas que levam ao QUIZ DE QUALIFICAÇÃO
102
+ Use quando o anúncio leva para a página do quiz antes do formulário.
103
+
104
+ Reels:
105
+ utm_source=facebook&utm_medium=reels&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
106
+
107
+ Stories:
108
+ utm_source=facebook&utm_medium=stories&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
109
+
110
+ Vídeo in-feed:
111
+ utm_source=facebook&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
112
+
113
+ Feed (imagem/carrossel):
114
+ utm_source=facebook&utm_medium=cpc&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
115
+
116
+ ### Campanhas que levam ao VÍDEO DE VENDAS (VSL)
117
+ Use quando o anúncio leva direto para a landing page com vídeo.
118
+
119
+ Reels:
120
+ utm_source=facebook&utm_medium=reels&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
121
+
122
+ Stories:
123
+ utm_source=facebook&utm_medium=stories&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
124
+
125
+ Vídeo in-feed:
126
+ utm_source=facebook&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
127
+
128
+ ### Campanhas Click-to-WhatsApp (CTWA)
129
+ Use quando o anúncio abre diretamente o WhatsApp.
130
+
131
+ utm_source=whatsapp&utm_medium=ctwa&utm_campaign=imovel_8a3f1d2b&utm_content=ctwa_direto
132
+
133
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
134
+ ## GOOGLE ADS
135
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
136
+
137
+ ### Search (palavras-chave)
138
+ utm_source=google&utm_medium=cpc&utm_campaign=imovel_8a3f1d2b&utm_content=landing_principal
139
+
140
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
141
+ ## TIKTOK ADS
142
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
143
+
144
+ ### Vídeo In-Feed (quiz)
145
+ utm_source=tiktok&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=quiz_diagnostico_imovel
146
+
147
+ ### Vídeo In-Feed (VSL)
148
+ utm_source=tiktok&utm_medium=video&utm_campaign=imovel_8a3f1d2b&utm_content=video_vsl_principal
149
+
150
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
151
+ ## OBSERVAÇÕES
152
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
153
+
154
+ utm_term NÃO é configurado nos anúncios.
155
+ O servidor preenche automaticamente após o quiz:
156
+ comprador / interessado / curioso / perdido
157
+
158
+ O valor real da campanha (700k-1M) está protegido.
159
+ Apenas o CDP Edge sabe a correspondência real.
160
+ ```
161
+
162
+ ---
163
+
164
+ ## Lógica de utm_content por Tipo de Funil
165
+
166
+ O agente detecta automaticamente e gera os valores corretos:
167
+
168
+ | O que o Page Analyzer encontrou | utm_content gerado |
169
+ |---|---|
170
+ | Quiz configurado pelo Lead Scoring Agent | `quiz_{nome_do_quiz}` |
171
+ | Player de vídeo / VSL na landing | `video_vsl_principal` |
172
+ | Vídeo de depoimento identificado | `video_depoimento` |
173
+ | Apenas formulário, sem vídeo, sem quiz | `landing_principal` |
174
+ | CTWA ativo (Meta selecionado) | `ctwa_direto` |
175
+ | Webinar / evento ao vivo detectado | `webinar_{nome}` |
176
+ | Múltiplos formatos | gera uma linha para cada |
177
+
178
+ **Regra:** se o funil tem quiz E vídeo, gera UTMs separadas para cada origem — porque o ROAS Feedback vai poder comparar qual converte mais.
179
+
180
+ ---
181
+
182
+ ## Lógica de utm_medium por Plataforma
183
+
184
+ O agente gera formatos com base nas plataformas selecionadas na FASE 0-B. Não pergunta ao cliente — usa o que já foi selecionado:
185
+
186
+ | Plataforma selecionada | utm_medium gerados automaticamente |
187
+ |---|---|
188
+ | Meta Ads | reels, stories, video, cpc |
189
+ | Meta Ads + CTWA | reels, stories, video, cpc, ctwa |
190
+ | Google Ads | cpc |
191
+ | Google Ads + Display | cpc, display |
192
+ | TikTok Ads | video |
193
+ | YouTube Ads | instream, bumper |
194
+ | Pinterest Ads | cpc |
195
+ | LinkedIn Ads | cpc |
196
+
197
+ ---
198
+
199
+ ## utm_campaign — Geração da Faixa Obfuscada
200
+
201
+ Esta é a única pergunta que o UTM Agent faz ao cliente (já feita na FASE 2-B durante o master orchestrator):
202
+
203
+ > "Qual o valor/faixa de preço do produto?" (ex: 700k-1M, 297-997, etc.)
204
+
205
+ Com a resposta, gera:
206
+ ```
207
+ SHA256("700k-1M" + salt) → "8a3f1d2b"
208
+ utm_campaign = imovel_8a3f1d2b
209
+ ```
210
+
211
+ Se o cliente **não** tiver segmentação por valor (produto de preço único), o agente usa:
212
+ ```
213
+ utm_campaign = {categoria}_geral
214
+ ```
215
+ Ex: `imovel_geral`, `curso_geral`, `servico_geral` — sem obfuscação.
216
+
217
+ ---
218
+
219
+ ## utm-mapping.json — Gerado Automaticamente
59
220
 
60
221
  ```json
61
222
  {
@@ -69,123 +230,93 @@ Gerar o arquivo `utm-mapping.json` com:
69
230
  "obfuscated": "8a3f1d2b",
70
231
  "original": "700k-1M",
71
232
  "category": "imovel",
72
- "pixel_audience": "AUDIENCE_MID",
73
233
  "platform_specific": {
74
- "meta": { "custom_audience_id": "2385xxx" },
75
- "tiktok": { "pixel_id": "C1xxx" }
234
+ "meta": { "custom_audience_id": "" },
235
+ "tiktok": { "pixel_id": "" },
236
+ "google": { "conversion_label": "" }
76
237
  }
77
238
  }
78
- ]
239
+ ],
240
+ "content_registry": {
241
+ "quiz_diagnostico_imovel": "Quiz de diagnóstico imobiliário (5 perguntas)",
242
+ "video_vsl_principal": "VSL principal da landing page",
243
+ "video_depoimento": "Vídeo de depoimento de cliente",
244
+ "landing_principal": "Formulário direto na landing page",
245
+ "ctwa_direto": "Click-to-WhatsApp direto do anúncio"
246
+ }
79
247
  }
248
+ ```
249
+
250
+ O `content_registry` documenta o significado de cada `utm_content` — o Worker usa isso no ROAS Feedback para exibir nomes legíveis nos relatórios.
251
+
252
+ ---
253
+
254
+ ## utm_term — Injetado pelo Worker (Nunca pelo Cliente)
255
+
256
+ Depois do Lead Scoring Engine classificar o lead via quiz:
257
+
258
+ ```typescript
259
+ // index.ts — após scoreQuizAnswers()
260
+ trackPayload.utmTerm = quizResult.qualification;
261
+ // → 'comprador' | 'interessado' | 'curioso' | 'perdido'
262
+ ```
80
263
 
81
- ### 4. Perguntas ao usuário (interativo)
82
-
83
- **Para imóveis:**
84
- > "Identifiquei que esta página é um imóvel. Qual a faixa de preço?
85
- > - 1) 500k-800k
86
- > - 2) 800k-1.5M
87
- > - 3) 1M-3M
88
- > - 4) 3M-5M
89
- > - 5) Outro (especifique)"
90
-
91
- **Para automotivos:**
92
- > "Qual a faixa de valor do veículo?
93
- > - 1) 50k-100k
94
- > - 2) 100k-200k
95
- > - 3) 200k-500k
96
- > - 4) Outro (especifique)"
97
-
98
- **Para outros produtos:**
99
- > "Qual a categoria de valor deste produto?
100
- > - 1) Entry level (até R$500)
101
- > - 2) Mid-range (R$500-5k)
102
- > - 3) Premium (R$5k-50k)
103
- > - 4) Luxury (acima de R$50k)
104
- > - 5) Outro (especifique)"
105
-
106
- ### 5. Gerar código do SDK com UTMs obfuscadas
107
-
108
- ```javascript
109
- // cdpTrack.js - snippet gerado
110
- const utmConfig = {
111
- faixa_imovel: '8a3f1d2b', // obfuscado
112
- product_id: '9c4e2a1f', // obfuscado
113
- source: 'facebook',
114
- medium: 'cpc'
115
- };
116
-
117
- cdpTrack('Lead', {
118
- utm: utmConfig,
119
- // ... outros campos
120
- });
121
- ```
122
-
123
- ## Output Structure
264
+ Salvo no D1 em `user_profiles.utm_term` e incluído nos eventos CAPI como `custom_data.utm_term`. O ROAS Feedback Loop usa para cruzar: *qual campanha gerou mais leads classificados como `comprador` que efetivamente compraram?*
265
+
266
+ > **Dependência:** `utm_term` só é preenchido se o **Lead Scoring Agent** estiver habilitado (FASE 6) e o evento for `QuizComplete` com `quiz_answers` válidas. Se o funil não tiver quiz, `utm_term` permanece vazio — o ROAS Feedback funciona, mas sem segmentação por qualificação de lead.
267
+
268
+ ---
269
+
270
+ ## Arquivos Gerados
271
+
272
+ ```
273
+ server-edge-tracker/
274
+ config/
275
+ utm-mapping.json ← mapeamento obfuscado + content_registry
276
+
277
+ # Entregue ao cliente:
278
+ UTMS-PROJETO-[NOME].md ← tabela completa de UTMs prontas para copiar/colar
279
+ ```
280
+
281
+ ---
282
+
283
+ ## O Que Este Agente NÃO FAZ
284
+
285
+ - Não pede ao cliente para "montar" UTMs — ele gera e entrega prontas
286
+ - Não pergunta formatos de anúncio — usa o que foi selecionado na FASE 0-B
287
+ - Não pergunta se tem quiz — usa o que o Lead Scoring Agent configurou
288
+ - ❌ Não expõe valores reais de produto na URL — sempre obfuscado via SHA256
289
+ - Não preenche utm_term nos anúncios isso é exclusivo do Worker
290
+
291
+ ---
292
+
293
+ ## Saída Final (JSON para o Master Orchestrator)
124
294
 
125
295
  ```json
126
296
  {
127
297
  "agent": "utm-agent",
128
- "version": "1.0.0",
129
- "utm_strategy": {
130
- "pattern": "{source}/{medium}/{category}_{obfuscated_range}",
131
- "base_url": "https://lançamentosabc.com.br"
298
+ "version": "2.1.0",
299
+ "utm_campaign_base": "imovel_8a3f1d2b",
300
+ "value_range_original": "700k-1M",
301
+ "utms_generated": 11,
302
+ "por_plataforma": {
303
+ "facebook": 7,
304
+ "google": 1,
305
+ "tiktok": 2,
306
+ "whatsapp": 1
132
307
  },
133
- "obfuscated_utms": [
134
- {
135
- "campaign": "imovel_8a3f1d2b",
136
- "content": "product_9c4e2a1f",
137
- "original_range": "700k-1M",
138
- "obfuscated_hash": "8a3f1d2b"
139
- }
308
+ "origens_detectadas": [
309
+ "quiz_diagnostico_imovel",
310
+ "video_vsl_principal",
311
+ "landing_principal",
312
+ "ctwa_direto"
140
313
  ],
141
- "worker_mapping": {
142
- "file": "utm-mapping.json",
143
- "location": "server-edge-tracker/config/utm-mapping.json"
144
- },
145
- "sdk_integration": {
146
- "file": "cdpTrack.js",
147
- "snippet": "// UTM obfuscado\nconst utmObfuscado = '8a3f1d2b';"
148
- }
314
+ "utm_term_automatico": true,
315
+ "arquivos_criados": [
316
+ "server-edge-tracker/config/utm-mapping.json",
317
+ "UTMS-PROJETO-[NOME].md"
318
+ ],
319
+ "integracao_roas": true,
320
+ "integracao_quiz": true
149
321
  }
150
322
  ```
151
-
152
- ## Integração com Outros Agentes
153
-
154
- 1. **Page Analyzer** → informa tipo de produto
155
- 2. **UTM Agent** → pergunta faixa de valor, gera UTMs obfuscadas
156
- 3. **Meta Agent** → recebe UTMs, configura custom audiences
157
- 4. **TikTok Agent** → recebe UTMs, configura pixel events
158
- 5. **Worker** → usa `utm-enricher.ts` para de-obfuscar no runtime
159
-
160
- ## Edge Cases
161
-
162
- - Usuário não sabe a faixa de valor: "Aguardo definição do cliente - use DEFAULT"
163
- - Produto sem faixa definida: usar `generic_00000000`
164
- - UTMs existentes: fazer merge sem sobrescrever
165
- - Múltiplas categorias: perguntar se precisa de segmentação composta
166
-
167
- ## Example Session
168
-
169
- **Page Analyzer:**
170
- > "Página identificada: imóvel em Vila Mariana, 3 quartos, 2 banheiros"
171
-
172
- **UTM Agent:**
173
- > "Para qual faixa de preço este imóvel deve ser categorizado?"
174
- >
175
- > Usuário: "800k-1.5M"
176
- >
177
- > **UTM Agent:**
178
- > ```json
179
- > {
180
- > "utm_faixa": "imovel_b4e2a1c9",
181
- > "original_range": "800k-1.5M",
182
- > "hash": "b4e2a1c9"
183
- > }
184
- > ```
185
-
186
- ## Rules
187
- 1. **NUNCA** revelar o valor real na URL pública
188
- 2. **SEMPRE** usar hash obfuscado para valores sensíveis
189
- 3. **Mapeamento reversível** deve estar disponível no Worker (não no SDK)
190
- 4. **Meta CAPI** recebe valor de-obfuscado internamente
191
- 5. UTMs sem valor sensível podem ficar em texto claro
@@ -14,7 +14,7 @@ const isBrowser = typeof window !== 'undefined';
14
14
 
15
15
  const ANTI_BLOCKING_CONFIG = {
16
16
  // Mesmo domínio evita bloqueios de CORS e ad-blockers
17
- endpoint: '/api/tracking',
17
+ endpoint: '/track',
18
18
 
19
19
  // Retries com exponential backoff
20
20
  maxRetries: 3,
@@ -209,13 +209,15 @@ export const generateId = () => {
209
209
  // ── Captura de Click IDs das plataformas ──────────────────────
210
210
  const _getClickIDs = () => {
211
211
  return {
212
- fbp: document.cookie.match(/_fbp=([^;]+)/)?.[1],
213
- fbc: document.cookie.match(/_fbc=([^;]+)/)?.[1],
214
- gclid: _gclid,
215
- gbraid: _gbraid,
216
- wbraid: _wbraid,
217
- ttclid: _ttclid,
218
- rclid: _urlParams.get('rclid')
212
+ fbp: document.cookie.match(/_fbp=([^;]+)/)?.[1] || undefined,
213
+ fbc: document.cookie.match(/_fbc=([^;]+)/)?.[1] || undefined,
214
+ fbclid: _fbclid || undefined, // click ID Meta → Worker gera fbc se cookie _fbc ausente
215
+ gclid: _gclid || undefined,
216
+ gbraid: _gbraid || undefined,
217
+ wbraid: _wbraid || undefined,
218
+ ttclid: _ttclid || undefined,
219
+ ttp: document.cookie.match(/_ttp=([^;]+)/)?.[1] || undefined, // TikTok Pixel cookie — EMQ TikTok
220
+ rclid: _urlParams.get('rclid') || undefined,
219
221
  };
220
222
  };
221
223
 
@@ -459,7 +461,7 @@ export async function track(eventName, data = {}, options = {}) {
459
461
 
460
462
  try {
461
463
  // Enviar para Worker com retry automático (anti-blocking)
462
- const result = await sendWithRetry(payload, '/api/tracking');
464
+ const result = await sendWithRetry(payload, '/track');
463
465
 
464
466
  if (result.success) {
465
467
  console.log(`✅ Evento ${eventName} enviado com sucesso:`, event_id, result);
@@ -550,16 +552,6 @@ export function setupAutoFormCapture() {
550
552
  }, true); // Capture para formulários dinâmicos
551
553
  }
552
554
 
553
- /**
554
- * trackPurchase() — Captura de compra
555
- *
556
- * @param {object} orderData - Dados da compra (order_id, value, currency, etc.)
557
- * @returns {Promise} - Promise com resultado
558
- */
559
- export async function trackPurchase(orderData) {
560
- return track('Purchase', orderData);
561
- }
562
-
563
555
  /**
564
556
  * trackViewContent() — Captura de visualização de conteúdo
565
557
  *
@@ -21,8 +21,8 @@ const ENGAGEMENT_CONFIG = {
21
21
  clickWeights: {
22
22
  'generico': 1.0, // clique sem categoria
23
23
  'cta': 2.5, // clique em CTA
24
- 'button': 2.0 // clique em botão
25
- 'link': 1.5 // clique em link
24
+ 'button': 2.0, // clique em botão
25
+ 'link': 1.5, // clique em link
26
26
  'input': 0.5, // clique em input
27
27
  },
28
28
  videoWeights: {
@@ -27,7 +27,7 @@ const TIME_CONFIG = {
27
27
  thresholds: {
28
28
  curioso: 10000, // 10 segundos
29
29
  interessado: 60000, // 60 segundos
30
- comprador: 180000 // 180 segundos (3 minutos)
30
+ comprador: 180000, // 180 segundos (3 minutos)
31
31
  profundao: 60
32
32
  },
33
33
  signalStrength: {