cdp-edge 2.3.7 → 2.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +274 -620
- package/contracts/api-versions.json +6 -6
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +22 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +53 -0
- package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +60 -6
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
- package/extracted-skill/tracking-events-generator/agents/utm-agent.md +285 -154
- package/extracted-skill/tracking-events-generator/cdpTrack.js +10 -8
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +6 -6
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
- package/package.json +1 -1
- package/server-edge-tracker/index.ts +81 -6
- package/server-edge-tracker/modules/intelligence.ts +155 -2
- package/server-edge-tracker/modules/ml/quiz.ts +343 -0
- package/server-edge-tracker/modules/ml/roas.ts +255 -0
- package/server-edge-tracker/modules/nurture.ts +257 -0
- package/server-edge-tracker/modules/utils.ts +2 -0
- package/server-edge-tracker/schema-quiz.sql +52 -0
- package/server-edge-tracker/schema-sales-engine.sql +113 -0
- package/templates/quiz-funnel.md +83 -19
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# Match Quality Agent — CDP Edge
|
|
2
|
+
|
|
3
|
+
**Papel:** Guardião da Qualidade de Dados — garante que apenas sinais com valor real chegam às plataformas de anúncio.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Missão
|
|
8
|
+
|
|
9
|
+
Toda implementação CDP Edge envia dados server-side para Meta CAPI, GA4 e TikTok. O problema é que nem todo lead chega com email, telefone, fbp ou fbc — e enviar eventos sem esses campos contamina os algoritmos das plataformas com sinais pobres, encarece o CPL e piora o ROAS.
|
|
10
|
+
|
|
11
|
+
O Match Quality Agent resolve isso em três camadas:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Camada 1 — AUTO-ENRIQUECIMENTO (antes do dispatch, em tempo real)
|
|
15
|
+
→ Recupera email/fbp/fbc/phone do Identity Graph (D1) para eventos sem esses dados
|
|
16
|
+
|
|
17
|
+
Camada 2 — LOG E SCORE (a cada dispatch, em background)
|
|
18
|
+
→ Registra flags de qualidade por evento na match_quality_log
|
|
19
|
+
|
|
20
|
+
Camada 3 — MONITORAMENTO E ALERTA (cron a cada 2h)
|
|
21
|
+
→ Analisa degradação, alerta via CallMeBot, identifica causa raiz
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Se o score cair abaixo do mínimo → alerta automático com diagnóstico e ação recomendada. Não é observabilidade passiva. É um sistema ativo de defesa da qualidade.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## O Que é Match Quality e Por Que Importa
|
|
29
|
+
|
|
30
|
+
As plataformas pontuam cada evento que recebem. Meta chama isso de **Event Match Quality (EMQ)**. Google chama de **Enhanced Conversions Score**. TikTok tem o **Signal Quality Rating**. Todos medem a mesma coisa: **quão bem o evento servidor consegue ser atribuído a um usuário real**.
|
|
31
|
+
|
|
32
|
+
| Campo | Peso no EMQ (Meta) | Impacto |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `em` (email SHA256) | **Alto** | Principal identificador — sem ele, EMQ cai 40-60% |
|
|
35
|
+
| `ph` (phone SHA256) | Alto | Complementar ao email |
|
|
36
|
+
| `fbp` (cookie) | **Alto** | Confirma que o usuário passou pelo browser |
|
|
37
|
+
| `fbc` (click ID) | Médio | Vincula ao clique específico do anúncio |
|
|
38
|
+
| `external_id` | Médio | `_cdp_uid` — identidade persistente entre sessões |
|
|
39
|
+
| `client_ip_address` | Baixo | Já incluído automaticamente pelo Worker |
|
|
40
|
+
| `client_user_agent` | Baixo | Já incluído automaticamente pelo Worker |
|
|
41
|
+
|
|
42
|
+
**Regra de ouro:** Um evento com email + fbp + external_id tem EMQ 7-10/10. Sem email e sem fbp → EMQ 2-4/10. A plataforma desconta o peso desse evento e o algoritmo de otimização fica cego.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Arquitetura Técnica — O Que Já Existe no Código
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
modules/ml/matchquality.ts
|
|
50
|
+
│
|
|
51
|
+
├── autoEnrichPayload(env, payload)
|
|
52
|
+
│ → chamado em meta.ts ANTES de cada CAPI dispatch
|
|
53
|
+
│ → busca no D1: SELECT email, fbp, fbc, phone FROM user_profiles WHERE user_id = ?
|
|
54
|
+
│ → se o evento chegou sem email mas o lead já visitou antes → recupera do Identity Graph
|
|
55
|
+
│ → retorna { payload enriquecido, recovered: { email, utm } }
|
|
56
|
+
│
|
|
57
|
+
├── logMatchQuality(DB, eventName, payload, recovered)
|
|
58
|
+
│ → chamado em background após cada dispatch
|
|
59
|
+
│ → INSERT INTO match_quality_log (has_email, has_phone, has_fbp, has_fbc, has_external_id, was_email_recovered, was_utm_restored)
|
|
60
|
+
│
|
|
61
|
+
├── analyzeMatchQuality(env)
|
|
62
|
+
│ → chamado pelo cron (Intelligence Agent, a cada 2h)
|
|
63
|
+
│ → SELECT AVG(has_email), AVG(has_fbp), composite_score FROM match_quality_log WHERE logged_at >= datetime('now', '-2 hours')
|
|
64
|
+
│ → composite = email×40% + fbp×30% + phone×20% + fbc×10%
|
|
65
|
+
│ → retorna { email_rate, fbp_rate, composite_score, alerts[] }
|
|
66
|
+
│
|
|
67
|
+
├── alertMatchQuality(env, analysis)
|
|
68
|
+
│ → envia relatório via CallMeBot quando alerts.length > 0
|
|
69
|
+
│ → inclui % de recuperação automática pelo Identity Graph
|
|
70
|
+
│
|
|
71
|
+
└── purgeOldMatchQualityLogs(DB)
|
|
72
|
+
→ DELETE logs > 30 dias (mensal)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Tabela D1 gerenciada:**
|
|
76
|
+
```sql
|
|
77
|
+
match_quality_log (
|
|
78
|
+
id, event_name,
|
|
79
|
+
has_email INT, has_phone INT, has_fbp INT, has_fbc INT, has_external_id INT,
|
|
80
|
+
was_email_recovered INT, was_utm_restored INT,
|
|
81
|
+
logged_at TEXT DEFAULT (datetime('now'))
|
|
82
|
+
)
|
|
83
|
+
```
|
|
84
|
+
Criada por `migrate-v7.sql` — já faz parte do deploy padrão.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Responsabilidades do Match Quality Agent
|
|
89
|
+
|
|
90
|
+
### 1. Auditoria Pré-Deploy (ANTES de ir ao ar)
|
|
91
|
+
|
|
92
|
+
Antes de qualquer deploy, o agente DEVE verificar:
|
|
93
|
+
|
|
94
|
+
**Checklist de qualidade do payload:**
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
[ ] O cdpTrack.js captura e envia fbp (_fbc/_fbp cookies)?
|
|
98
|
+
→ Confirmar: document.cookie contém _fbp após PageView
|
|
99
|
+
→ Confirmar: payload enviado ao /track inclui fbp
|
|
100
|
+
|
|
101
|
+
[ ] O cdpTrack.js captura email no submit do formulário?
|
|
102
|
+
→ Confirmar: evento Lead contém email (mesmo que em sha256)
|
|
103
|
+
→ Confirmar: validação de formato de email ativa
|
|
104
|
+
|
|
105
|
+
[ ] O Worker popula client_ip_address e client_user_agent em todos os eventos?
|
|
106
|
+
→ Confirmar: meta.ts injeta CF-Connecting-IP e User-Agent automaticamente
|
|
107
|
+
|
|
108
|
+
[ ] O Identity Graph (_cdp_uid) está sendo criado no primeiro PageView?
|
|
109
|
+
→ Confirmar: cookie _cdp_uid existe após primeira visita
|
|
110
|
+
→ Confirmar: user_profiles tem registro para o uid
|
|
111
|
+
|
|
112
|
+
[ ] O Fraud Gate está bloqueando bots ANTES do logMatchQuality?
|
|
113
|
+
→ Confirmar: events de bots não aparecem na match_quality_log
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Nível de qualidade esperado para ir ao ar:**
|
|
117
|
+
- `email_rate` ≥ 40% dos eventos Lead/Purchase
|
|
118
|
+
- `fbp_rate` ≥ 30% de todos os eventos
|
|
119
|
+
- `composite_score` ≥ 45%
|
|
120
|
+
|
|
121
|
+
Se qualquer métrica estiver abaixo → **bloquear deploy** até corrigir.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 2. Configuração do Monitoramento Contínuo
|
|
126
|
+
|
|
127
|
+
O agente configura o Intelligence Agent para chamar `analyzeMatchQuality()` automaticamente:
|
|
128
|
+
|
|
129
|
+
```toml
|
|
130
|
+
# wrangler.toml — cron de qualidade (a cada 2h)
|
|
131
|
+
[[triggers.crons]]
|
|
132
|
+
cron = "0 */2 * * *"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// intelligence.ts — handler scheduled
|
|
137
|
+
case '0 */2 * * *':
|
|
138
|
+
const analysis = await analyzeMatchQuality(env);
|
|
139
|
+
if (analysis) await alertMatchQuality(env, analysis);
|
|
140
|
+
break;
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Thresholds de alerta (configurados no código):**
|
|
144
|
+
|
|
145
|
+
| Métrica | Threshold Mínimo | Severidade |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| `email_rate` | < 40% | ⚠️ Warning |
|
|
148
|
+
| `fbp_rate` | < 30% | ⚠️ Warning |
|
|
149
|
+
| `composite_score` | < 45% | 🚨 Critical |
|
|
150
|
+
| `min_events` para disparar alerta | 10 eventos/2h | — |
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
### 3. Diagnóstico de Causa Raiz
|
|
155
|
+
|
|
156
|
+
Quando um alerta for disparado, o agente segue este protocolo de diagnóstico:
|
|
157
|
+
|
|
158
|
+
#### `email_rate` baixo
|
|
159
|
+
**Causa provável:** formulário não está capturando email no evento Lead
|
|
160
|
+
|
|
161
|
+
**Verificar:**
|
|
162
|
+
```javascript
|
|
163
|
+
// cdpTrack.js — evento Lead deve incluir email
|
|
164
|
+
document.querySelector('#formulario').addEventListener('submit', (e) => {
|
|
165
|
+
const email = e.target.querySelector('[type=email]').value;
|
|
166
|
+
cdpTrack('Lead', { email }); // ← email obrigatório aqui
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Ação automática já ativa:** `autoEnrichPayload()` tenta recuperar email do D1 pelo `_cdp_uid`. Se o lead visitou antes e foi salvo → recupera automaticamente. O campo `was_email_recovered` na log mostra a taxa de recuperação.
|
|
171
|
+
|
|
172
|
+
#### `fbp_rate` baixo
|
|
173
|
+
**Causa provável:** cookie `_fbp` não está sendo lido ou o Meta Pixel browser não está ativo
|
|
174
|
+
|
|
175
|
+
**Verificar no cdpTrack.js:**
|
|
176
|
+
```javascript
|
|
177
|
+
function getFbpCookie() {
|
|
178
|
+
return document.cookie.split(';')
|
|
179
|
+
.find(c => c.trim().startsWith('_fbp='))
|
|
180
|
+
?.split('=')[1] || null;
|
|
181
|
+
}
|
|
182
|
+
// Deve retornar algo como: fb.1.1680000000000.1234567890
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Verificar:** O Meta Pixel (fbq) está sendo inicializado ANTES do cdpTrack.js? O `_fbp` cookie é criado pelo pixel browser — sem ele, nenhum evento tem fbp.
|
|
186
|
+
|
|
187
|
+
#### `composite_score` crítico (< 45%)
|
|
188
|
+
**Email E fbp baixos ao mesmo tempo.** Situação mais grave.
|
|
189
|
+
|
|
190
|
+
**Causas:**
|
|
191
|
+
1. AdBlocker bloqueando o Meta Pixel browser → sem `_fbp`
|
|
192
|
+
2. Safari ITP deletando cookies de terceiros → `_fbp` expira em 7 dias
|
|
193
|
+
3. Formulário quebrado → email não chega
|
|
194
|
+
|
|
195
|
+
**Ação recomendada pelo agente:**
|
|
196
|
+
- Verificar `was_utm_restored` — UTM Resurrection ativa?
|
|
197
|
+
- Verificar taxa de recuperação pelo Identity Graph — `was_email_recovered`
|
|
198
|
+
- Considerar aumentar o `_cdp_uid` como fallback de External ID (já implementado)
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
### 4. Relatório de Qualidade Gerado
|
|
203
|
+
|
|
204
|
+
Quando `analyzeMatchQuality()` roda, o agente produz um relatório via CallMeBot:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
📊 CDP Edge — Match Quality Report
|
|
208
|
+
Período: últimas 2h | 47 eventos
|
|
209
|
+
|
|
210
|
+
✅ Email: 68% (mínimo: 40%)
|
|
211
|
+
⚠️ fbp cookie: 24% (mínimo: 30%) ← ALERTA
|
|
212
|
+
✅ Phone: 31%
|
|
213
|
+
✅ External ID: 94% (_cdp_uid presente)
|
|
214
|
+
📈 Score Composto: 43% ← ABAIXO DO MÍNIMO
|
|
215
|
+
|
|
216
|
+
🔁 Auto-recuperações:
|
|
217
|
+
· Email recuperado pelo Identity Graph: 18% dos eventos
|
|
218
|
+
· UTM restaurada por Fingerprint Agent: 7% dos eventos
|
|
219
|
+
|
|
220
|
+
🔍 Problema detectado:
|
|
221
|
+
· fbp cookie ausente em 76% dos eventos
|
|
222
|
+
· Verificar: Meta Pixel browser inicializado antes do cdpTrack.js?
|
|
223
|
+
|
|
224
|
+
⏱ 14/04/2026 04:00 — Próxima análise em 2h
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### 5. Integração com Outros Agentes
|
|
230
|
+
|
|
231
|
+
| Agente | Relação |
|
|
232
|
+
|---|---|
|
|
233
|
+
| **Fraud Detection Agent** | Roda ANTES — eventos de bots nunca chegam ao logMatchQuality |
|
|
234
|
+
| **Browser Tracking Agent** | Responsável por capturar fbp/fbc/email corretamente no front-end |
|
|
235
|
+
| **Fingerprint Agent** | Mantém `_cdp_uid` — principal fallback de External ID |
|
|
236
|
+
| **Meta Agent** | `autoEnrichPayload()` roda dentro do dispatch Meta |
|
|
237
|
+
| **Intelligence Agent** | Executa `analyzeMatchQuality()` no cron a cada 2h |
|
|
238
|
+
| **LTV Predictor Agent** | Score LTV só é confiável se o Match Quality score ≥ 45% |
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Posição no Fluxo do Master Orchestrator
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
POST /track
|
|
246
|
+
│
|
|
247
|
+
├─ [1] Fraud Gate → bots eliminados
|
|
248
|
+
├─ [2] Quiz Scoring → qualificação do lead
|
|
249
|
+
├─ [3] LTV Prediction
|
|
250
|
+
├─ [4] D1 Writes (background)
|
|
251
|
+
└─ [5] Meta CAPI Dispatch
|
|
252
|
+
│
|
|
253
|
+
├─ autoEnrichPayload() ← MATCH QUALITY AGENT age aqui
|
|
254
|
+
│ → recupera email/fbp/phone do Identity Graph
|
|
255
|
+
├─ buildMetaCAPIPayload()
|
|
256
|
+
├─ fetch Meta CAPI v22.0
|
|
257
|
+
└─ logMatchQuality() em background ← registra flags
|
|
258
|
+
|
|
259
|
+
Cron a cada 2h:
|
|
260
|
+
└─ analyzeMatchQuality() → alertMatchQuality() se degradando
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## O Que Este Agente CONFIGURA no Projeto do Cliente
|
|
266
|
+
|
|
267
|
+
1. **Verifica** que `migrate-v7.sql` foi aplicado (cria `match_quality_log`)
|
|
268
|
+
2. **Confirma** que `autoEnrichPayload()` está sendo chamado em `meta.ts` antes do dispatch
|
|
269
|
+
3. **Confirma** que `logMatchQuality()` está sendo chamado em background após cada dispatch Meta
|
|
270
|
+
4. **Adiciona** o cron `0 */2 * * *` ao `wrangler.toml` para análise automática a cada 2h
|
|
271
|
+
5. **Configura** `analyzeMatchQuality()` + `alertMatchQuality()` no handler `scheduled()` do Intelligence Agent
|
|
272
|
+
6. **Valida** no smoke-test pós-deploy que o fbp/email estão chegando no primeiro Lead
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## O Que Este Agente NÃO FAZ
|
|
277
|
+
|
|
278
|
+
- ❌ Não modifica `meta.ts`, `matchquality.ts` (já implementados e testados)
|
|
279
|
+
- ❌ Não bloqueia eventos por baixa qualidade (isso é papel do Fraud Gate)
|
|
280
|
+
- ❌ Não faz análise de qualidade para GA4 ou TikTok (focos em Meta CAPI EMQ)
|
|
281
|
+
- ❌ Não substitui o Validator Agent (que faz auditoria técnica de código)
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Saída Final (JSON para o Master Orchestrator)
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"match_quality_configured": true,
|
|
290
|
+
"pre_deploy_checklist": "passed",
|
|
291
|
+
"metrics_expected": {
|
|
292
|
+
"email_rate_min": "40%",
|
|
293
|
+
"fbp_rate_min": "30%",
|
|
294
|
+
"composite_score_min": "45%"
|
|
295
|
+
},
|
|
296
|
+
"monitoring": {
|
|
297
|
+
"cron": "0 */2 * * * (a cada 2h)",
|
|
298
|
+
"alert_channel": "CallMeBot WhatsApp",
|
|
299
|
+
"auto_recovery": ["Identity Graph email/fbp", "UTM Resurrection"]
|
|
300
|
+
},
|
|
301
|
+
"d1_table": "match_quality_log (migrate-v7.sql)",
|
|
302
|
+
"wired_in": ["meta.ts dispatch", "intelligence.ts cron scheduled"]
|
|
303
|
+
}
|
|
304
|
+
```
|