cdp-edge 1.21.1 → 1.23.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.
- package/dist/commands/install.js +1 -1
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +89 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +101 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +172 -0
- package/package.json +1 -1
- package/server-edge-tracker/INSTALAR.md +27 -3
- package/server-edge-tracker/SEGMENTATION-DOCS.md +69 -0
- package/server-edge-tracker/index.js +11 -0
- package/server-edge-tracker/worker.js +15 -0
- package/server-edge-tracker/wrangler.toml +19 -6
package/dist/commands/install.js
CHANGED
|
@@ -32,7 +32,7 @@ function printBanner() {
|
|
|
32
32
|
console.log(chalk.cyan('╚██████╗██████╔╝██║ ███████╗██████╔╝╚██████╔╝███████╗'));
|
|
33
33
|
console.log(chalk.cyan(' ╚═════╝╚═════╝ ╚═╝ ╚══════╝╚═════╝ ╚═════╝╚══════╝'));
|
|
34
34
|
console.log('');
|
|
35
|
-
console.log(chalk.gray(' Customer Data Platform on the Edge · Global Edge Tracking · v2.0.
|
|
35
|
+
console.log(chalk.gray(' Customer Data Platform on the Edge · Global Edge Tracking · v2.0.4'));
|
|
36
36
|
console.log('');
|
|
37
37
|
console.log(chalk.gray('═'.repeat(68)));
|
|
38
38
|
console.log('');
|
|
@@ -592,3 +592,92 @@ Para suporte, consulte:
|
|
|
592
592
|
|
|
593
593
|
*CDP Edge Premium Tracking Intelligence - Integração Completa (Quantum Tier)*
|
|
594
594
|
*Versão 1.0.0 - Atualizado em 2026-03-27*
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## Pipeline de Melhoria Contínua Automática (Fase 5)
|
|
599
|
+
|
|
600
|
+
A Fase 5 não adiciona novos eventos de tracking — ela fecha o ciclo de dados para que cada evento coletado melhore automaticamente a qualidade dos próximos.
|
|
601
|
+
|
|
602
|
+
### Arquitetura do pipeline
|
|
603
|
+
|
|
604
|
+
```
|
|
605
|
+
Browser (cdpTrack.js)
|
|
606
|
+
│
|
|
607
|
+
└─ POST /track
|
|
608
|
+
│
|
|
609
|
+
├─ [Auto-Enrich] Antes do dispatch Meta CAPI:
|
|
610
|
+
│ Worker consulta user_profiles por userId
|
|
611
|
+
│ → recupera email/fbp/fbc ausentes do perfil
|
|
612
|
+
│ → evento vai para Meta com Advanced Matching completo
|
|
613
|
+
│
|
|
614
|
+
├─ [Dispatch Meta CAPI]
|
|
615
|
+
│ → Grava match_quality_log (has_email, has_fbp, etc.)
|
|
616
|
+
│
|
|
617
|
+
├─ [LTV Prediction]
|
|
618
|
+
│ → Usa ltv_model_weights (se modelo treinado disponível)
|
|
619
|
+
│ → Fallback para heurística
|
|
620
|
+
│
|
|
621
|
+
└─ [D1 Writes]
|
|
622
|
+
→ leads, user_profiles, match_quality_log
|
|
623
|
+
|
|
624
|
+
Cron semanal (Worker scheduled)
|
|
625
|
+
│
|
|
626
|
+
├─ Treina regressão logística → ltv_model_weights (is_active=1)
|
|
627
|
+
│ → cached em KV para ~0ms no próximo /track
|
|
628
|
+
│
|
|
629
|
+
├─ Analisa match_quality_log (janela 2h)
|
|
630
|
+
│ → email_rate < 40% → alerta CallMeBot
|
|
631
|
+
│ → fbp_rate < 30% → alerta CallMeBot
|
|
632
|
+
│ → composite < 45% → alerta CallMeBot
|
|
633
|
+
│
|
|
634
|
+
├─ Verifica experimentos A/B LTV
|
|
635
|
+
│ → variação bate controle por ≥5pp → auto-winner declarado
|
|
636
|
+
│ → alerta WhatsApp com prompt ativado
|
|
637
|
+
│
|
|
638
|
+
└─ Export Customer Match
|
|
639
|
+
→ leads high_intent → GET /export/customer-match
|
|
640
|
+
→ CSV para Google Ads (SHA-256 hashed)
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
### Novas tabelas D1 criadas na Fase 5
|
|
644
|
+
|
|
645
|
+
| Tabela | Migration | Conteúdo |
|
|
646
|
+
|---|---|---|
|
|
647
|
+
| `ltv_model_weights` | `migrate-v7.sql` | Pesos do modelo treinado (trained_at, is_active, accuracy, weights_json) |
|
|
648
|
+
| `match_quality_log` | `migrate-v7.sql` | Flags por evento: has_email, has_fbp, has_phone, has_fbc, was_email_recovered |
|
|
649
|
+
|
|
650
|
+
**View:** `v_match_quality_24h` — agrega match quality das últimas 24h para consulta rápida.
|
|
651
|
+
|
|
652
|
+
### Migration completa atualizada (incluindo Fase 5)
|
|
653
|
+
|
|
654
|
+
```bash
|
|
655
|
+
wrangler d1 execute cdp-edge-db --file=schema.sql --remote
|
|
656
|
+
wrangler d1 execute cdp-edge-db --file=migrate-v6.sql --remote
|
|
657
|
+
wrangler d1 execute cdp-edge-db --file=schema-segmentation.sql --remote
|
|
658
|
+
wrangler d1 execute cdp-edge-db --file=schema-bidding.sql --remote
|
|
659
|
+
wrangler d1 execute cdp-edge-db --file=schema-ab-ltv.sql --remote
|
|
660
|
+
wrangler d1 execute cdp-edge-db --file=schema-fraud.sql --remote
|
|
661
|
+
wrangler d1 execute cdp-edge-db --file=schema-indexes.sql --remote
|
|
662
|
+
wrangler d1 execute cdp-edge-db --file=migrate-v7.sql --remote
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
### Endpoints novos para monitoramento
|
|
666
|
+
|
|
667
|
+
| Endpoint | O que monitora |
|
|
668
|
+
|---|---|
|
|
669
|
+
| `GET /api/fraud/stats` | Fraude 24h + qualidade de sinal |
|
|
670
|
+
| `GET /api/segmentation/list` | Clusters ML ativos com métricas de LTV |
|
|
671
|
+
| `GET /api/bidding/status` | Bids recomendados por segmento × plataforma |
|
|
672
|
+
| `GET /api/ltv/ab-test/results` | Acurácia por variação de prompt LTV |
|
|
673
|
+
| `GET /export/customer-match` | Export CSV de leads high-intent para Google Ads |
|
|
674
|
+
|
|
675
|
+
### Impacto esperado no funil
|
|
676
|
+
|
|
677
|
+
| Componente | Mecanismo | Resultado |
|
|
678
|
+
|---|---|---|
|
|
679
|
+
| Advanced Matching Meta | Auto-Enrich recupera email/fbp de sessões anteriores | EMQ sobe → atribuição mais precisa |
|
|
680
|
+
| LTV Score | Modelo treinado em dados reais do funil | Bids mais precisos → menor CPA |
|
|
681
|
+
| Match Quality Alerts | Degradação detectada automaticamente | Fix em horas, não em dias |
|
|
682
|
+
| A/B Auto-Winner | Melhor prompt LTV ativado automaticamente | LTV scores mais precisos sem revisão manual |
|
|
683
|
+
| Customer Match | Leads high-intent exportados semanalmente | Audiência Google sempre atualizada |
|
|
@@ -410,3 +410,104 @@ Todas as 6 melhorias principais + o bônus foram implementadas com sucesso:
|
|
|
410
410
|
---
|
|
411
411
|
|
|
412
412
|
> 🎯 **Conclusão:** O ecossistema CDP Edge agora tem um sistema de agentes **sincronizados, resilientes e auto-corrigíveis**, com memória persistente e atualização automática de APIs. O tempo de desenvolvimento foi drasticamente reduzido e a qualidade do código foi significativamente aumentada.
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## ✅ FASE 5 — Melhoria Contínua Automática (2026-04-10)
|
|
417
|
+
|
|
418
|
+
**Status:** ✅ COMPLETO (4 features)
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### ✅ 1. LTV Real — Regressão Logística Treinada em Dados Reais
|
|
423
|
+
|
|
424
|
+
**O que foi implementado:**
|
|
425
|
+
- Cron semanal no Worker busca leads × purchases dos últimos 90 dias no D1
|
|
426
|
+
- Treina regressão logística com features reais (ltv_score, behavior_score, engagement_score, utm_source, state)
|
|
427
|
+
- Pesos gravados em `ltv_model_weights` com `is_active = 1` e accuracy registrada
|
|
428
|
+
- Pesos cacheados em KV para acesso em ~0ms por cada evento `/track`
|
|
429
|
+
- Fallback automático para heurística se modelo não estiver disponível
|
|
430
|
+
|
|
431
|
+
**Arquivos criados/modificados:**
|
|
432
|
+
- `server-edge-tracker/migrate-v7.sql` — Tabela `ltv_model_weights` + `match_quality_log`
|
|
433
|
+
- `server-edge-tracker/modules/ml/ltv.js` — Função de treinamento + predição com modelo treinado
|
|
434
|
+
- `server-edge-tracker/worker.js` — Handler do cron semanal de treinamento
|
|
435
|
+
|
|
436
|
+
**Benefício:** Score LTV baseado em dados reais do funil (não apenas heurísticas). Bids mais precisos. Experimentos A/B com baseline real.
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
### ✅ 2. Match Quality Alerts — Monitoramento Automático de EMQ
|
|
441
|
+
|
|
442
|
+
**O que foi implementado:**
|
|
443
|
+
- Cada dispatch para Meta CAPI registra flags em `match_quality_log`: `has_email`, `has_phone`, `has_fbp`, `has_fbc`, `was_email_recovered`
|
|
444
|
+
- View `v_match_quality_24h` agrega os dados por janela de 2 horas
|
|
445
|
+
- Cron semanal verifica os thresholds: email_rate < 40%, fbp_rate < 30%, composite_score < 45%
|
|
446
|
+
- Alerta via CallMeBot quando qualquer threshold é ultrapassado
|
|
447
|
+
|
|
448
|
+
**Arquivos criados/modificados:**
|
|
449
|
+
- `server-edge-tracker/migrate-v7.sql` — Tabela `match_quality_log` + view `v_match_quality_24h`
|
|
450
|
+
- `server-edge-tracker/modules/dispatch/meta.js` — Log de qualidade após cada dispatch
|
|
451
|
+
- `server-edge-tracker/modules/intelligence.js` — Análise semanal de match quality + alerta
|
|
452
|
+
|
|
453
|
+
**Benefício:** Degradação de EMQ detectada automaticamente antes de impactar o CPA. Alerta proativo ao invés de descobrir via queda de performance.
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
### ✅ 3. A/B LTV Auto-Winner — Declaração Automática de Vencedor
|
|
458
|
+
|
|
459
|
+
**O que foi implementado:**
|
|
460
|
+
- Quando uma variação bate o controle por ≥5pp de acurácia, o Worker declara o vencedor automaticamente
|
|
461
|
+
- Prompt vencedor é ativado imediatamente para todos os novos eventos `/track`
|
|
462
|
+
- Alerta WhatsApp enviado com detalhes: nome da variação, diferença de acurácia, prompt ativado
|
|
463
|
+
- Sem necessidade de revisão manual de experimentos
|
|
464
|
+
|
|
465
|
+
**Arquivos criados/modificados:**
|
|
466
|
+
- `server-edge-tracker/modules/ml/ltv.js` — Lógica de detecção de vencedor automático
|
|
467
|
+
- `server-edge-tracker/modules/dispatch/whatsapp.js` — Alerta de auto-winner
|
|
468
|
+
|
|
469
|
+
**Benefício:** Experimentos A/B de prompt LTV se resolvem sozinhos. O prompt com maior acurácia é sempre usado sem intervenção manual.
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
### ✅ 4. Auto-Enrich — Identity Graph Antes do Dispatch
|
|
474
|
+
|
|
475
|
+
**O que foi implementado:**
|
|
476
|
+
- Antes de cada dispatch para Meta CAPI, Worker consulta `user_profiles` pelo `userId` do evento
|
|
477
|
+
- Se o evento chegou sem email/fbp/fbc/phone mas o perfil os tem, os dados são injetados automaticamente
|
|
478
|
+
- Campo `was_email_recovered` registrado em `match_quality_log` para rastreabilidade
|
|
479
|
+
- Processo 100% transparente para o browser
|
|
480
|
+
|
|
481
|
+
**Arquivos criados/modificados:**
|
|
482
|
+
- `server-edge-tracker/modules/dispatch/meta.js` — Consulta ao Identity Graph antes do dispatch
|
|
483
|
+
- `server-edge-tracker/modules/db.js` — Função `enrichPayloadFromProfile(userId, payload)`
|
|
484
|
+
|
|
485
|
+
**Benefício:** Eventos que chegariam sem email agora vão para a Meta com Advanced Matching completo. EMQ melhora sem qualquer mudança no browser. Atribuição retroativa funciona melhor.
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## 📈 NOVAS TABELAS D1 (Fase 5)
|
|
490
|
+
|
|
491
|
+
| Tabela | Criada em | Conteúdo |
|
|
492
|
+
|---|---|---|
|
|
493
|
+
| `ltv_model_weights` | `migrate-v7.sql` | Pesos do modelo de regressão logística treinado |
|
|
494
|
+
| `match_quality_log` | `migrate-v7.sql` | Flags de qualidade por evento despachado para Meta |
|
|
495
|
+
|
|
496
|
+
**View criada:** `v_match_quality_24h` — dashboard de EMQ pronto para consulta via SQL.
|
|
497
|
+
|
|
498
|
+
**Sequência de migration atualizada:**
|
|
499
|
+
```
|
|
500
|
+
schema.sql → migrate-v6.sql → schema-segmentation.sql → schema-bidding.sql
|
|
501
|
+
→ schema-ab-ltv.sql → schema-fraud.sql → schema-indexes.sql → migrate-v7.sql
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## 🎯 IMPACTO ESPERADO DA FASE 5
|
|
507
|
+
|
|
508
|
+
| Métrica | Mecanismo | Melhoria Esperada |
|
|
509
|
+
|---|---|---|
|
|
510
|
+
| **EMQ (Event Match Quality)** | Auto-Enrich + Match Quality Alerts | +15-25pp no score Meta |
|
|
511
|
+
| **Precisão de LTV** | Modelo treinado em dados reais | Acurácia > heurística em 2-4 semanas |
|
|
512
|
+
| **Tempo de resposta a degradação** | Alertas automáticos de match quality | Horas vs. dias |
|
|
513
|
+
| **CPA** | Melhor atribuição → otimização Meta mais precisa | -10-20% esperado |
|
|
@@ -2892,3 +2892,175 @@ async function sha256(data) {
|
|
|
2892
2892
|
4. **SDK Site**: Inserir `cdpTrack.js` e `tracking.config.js` no site.
|
|
2893
2893
|
5. **Event Mapping**: Configurar gatilhos de clique e formulário no site.
|
|
2894
2894
|
6. **Webhooks**: Configurar o endpoint de webhook na plataforma de vendas (Ticto/Hotmart).
|
|
2895
|
+
|
|
2896
|
+
---
|
|
2897
|
+
|
|
2898
|
+
## 🤖 8. MELHORIA CONTÍNUA AUTOMÁTICA (FASE 5)
|
|
2899
|
+
|
|
2900
|
+
A Fase 5 fecha o ciclo de dados: cada evento coletado alimenta modelos e alertas que, automaticamente, melhoram a qualidade de atribuição na próxima semana — sem intervenção manual.
|
|
2901
|
+
|
|
2902
|
+
---
|
|
2903
|
+
|
|
2904
|
+
### 8.1 O Ciclo de Melhoria Contínua
|
|
2905
|
+
|
|
2906
|
+
```
|
|
2907
|
+
Evento /track
|
|
2908
|
+
│
|
|
2909
|
+
├─ match_quality_log (has_email, has_fbp, has_phone, has_fbc, was_email_recovered)
|
|
2910
|
+
│ │
|
|
2911
|
+
│ └─ Cron semanal analisa janela de 2h
|
|
2912
|
+
│ → email_rate < 40% → alerta CallMeBot
|
|
2913
|
+
│ → fbp_rate < 30% → alerta CallMeBot
|
|
2914
|
+
│ → composite_score < 45% → alerta CallMeBot
|
|
2915
|
+
│
|
|
2916
|
+
├─ user_profiles (Identity Graph)
|
|
2917
|
+
│ │
|
|
2918
|
+
│ └─ Auto-Enrich: antes de cada dispatch Meta CAPI,
|
|
2919
|
+
│ Worker consulta user_profiles por userId
|
|
2920
|
+
│ → recupera email/fbp/fbc/phone ausentes
|
|
2921
|
+
│ → evento vai para Meta COM email → EMQ sobe
|
|
2922
|
+
│
|
|
2923
|
+
├─ leads × purchases (D1)
|
|
2924
|
+
│ │
|
|
2925
|
+
│ └─ Cron semanal treina regressão logística
|
|
2926
|
+
│ → pesos gravados em ltv_model_weights (is_active=1)
|
|
2927
|
+
│ → cached em KV → próximo /track usa modelo treinado
|
|
2928
|
+
│ → fallback heurístico se modelo não disponível
|
|
2929
|
+
│
|
|
2930
|
+
└─ user_profiles (alta intenção) → Customer Match Export semanal
|
|
2931
|
+
→ GET /export/customer-match → CSV para Google Ads
|
|
2932
|
+
→ Meta Custom Audience auto-atualizada
|
|
2933
|
+
```
|
|
2934
|
+
|
|
2935
|
+
---
|
|
2936
|
+
|
|
2937
|
+
### 8.2 Match Quality — Monitoramento Automático
|
|
2938
|
+
|
|
2939
|
+
Cada dispatch para a Meta CAPI registra na tabela `match_quality_log`:
|
|
2940
|
+
|
|
2941
|
+
| Campo | O que indica |
|
|
2942
|
+
|---|---|
|
|
2943
|
+
| `has_email` | Evento foi com email (principal fator de EMQ) |
|
|
2944
|
+
| `has_phone` | Evento foi com telefone |
|
|
2945
|
+
| `has_fbp` | Cookie _fbp presente (atribuição via pixel) |
|
|
2946
|
+
| `has_fbc` | Cookie _fbc presente (atribuição via clique em anúncio) |
|
|
2947
|
+
| `was_email_recovered` | Email recuperado via Identity Graph (Auto-Enrich) |
|
|
2948
|
+
|
|
2949
|
+
**Thresholds de alerta (cron semanal):**
|
|
2950
|
+
|
|
2951
|
+
| Métrica | Threshold de alerta | Impacto |
|
|
2952
|
+
|---|---|---|
|
|
2953
|
+
| `email_rate` | < 40% | Atribuição fraca — muitos eventos sem email |
|
|
2954
|
+
| `fbp_rate` | < 30% | Pixel sem rastrear adequadamente |
|
|
2955
|
+
| `composite_score` | < 45% | EMQ geral degradado |
|
|
2956
|
+
|
|
2957
|
+
A view `v_match_quality_24h` agrega os dados prontos para consulta instantânea:
|
|
2958
|
+
|
|
2959
|
+
```sql
|
|
2960
|
+
SELECT * FROM v_match_quality_24h;
|
|
2961
|
+
-- Retorna: event_count, email_rate, phone_rate, fbp_rate, fbc_rate, composite_score
|
|
2962
|
+
```
|
|
2963
|
+
|
|
2964
|
+
---
|
|
2965
|
+
|
|
2966
|
+
### 8.3 Identity Graph — Auto-Enrich Antes do Dispatch
|
|
2967
|
+
|
|
2968
|
+
Antes de cada dispatch para a Meta CAPI, o Worker consulta `user_profiles` usando o `userId` do evento. Se o evento chegou sem email ou sem fbp, mas o perfil do usuário tem esses dados de uma sessão anterior, eles são injetados automaticamente no payload.
|
|
2969
|
+
|
|
2970
|
+
**Resultado prático:**
|
|
2971
|
+
- Lead preencheu formulário na semana passada (email registrado no perfil)
|
|
2972
|
+
- Hoje clicou em anúncio e disparou `ViewContent` sem email
|
|
2973
|
+
- Worker recupera o email do perfil → evento vai para Meta COM email
|
|
2974
|
+
- Meta recebe o sinal com Advanced Matching completo → melhor atribuição
|
|
2975
|
+
- `was_email_recovered = 1` fica registrado em `match_quality_log`
|
|
2976
|
+
|
|
2977
|
+
Esse processo é transparente: o browser não precisa enviar nada a mais.
|
|
2978
|
+
|
|
2979
|
+
---
|
|
2980
|
+
|
|
2981
|
+
### 8.4 LTV Real — Modelo Treinado em Dados Reais
|
|
2982
|
+
|
|
2983
|
+
**Como funciona:**
|
|
2984
|
+
|
|
2985
|
+
1. Cron semanal executa no Worker
|
|
2986
|
+
2. Busca leads com `purchase = true/false` dos últimos 90 dias no D1
|
|
2987
|
+
3. Treina regressão logística com as features disponíveis (ltv_score, behavior_score, engagement_score, utm_source, state)
|
|
2988
|
+
4. Grava os pesos em `ltv_model_weights` com `is_active = 1`
|
|
2989
|
+
5. Cacheia os pesos em KV para acesso em ~0ms
|
|
2990
|
+
|
|
2991
|
+
**Uso em runtime (cada `/track`):**
|
|
2992
|
+
- Worker verifica se há pesos ativos no KV
|
|
2993
|
+
- Se sim: usa o modelo treinado para prever LTV
|
|
2994
|
+
- Se não: fallback para heurística baseada em regras
|
|
2995
|
+
- Score 0-100 → classificação High/Medium/Low → valor estimado em BRL
|
|
2996
|
+
|
|
2997
|
+
**Tabela `ltv_model_weights`:**
|
|
2998
|
+
|
|
2999
|
+
| Campo | Descrição |
|
|
3000
|
+
|---|---|
|
|
3001
|
+
| `trained_at` | Timestamp do treinamento |
|
|
3002
|
+
| `is_active` | Apenas 1 registro ativo por vez |
|
|
3003
|
+
| `accuracy` | Acurácia do modelo no conjunto de teste (0-1) |
|
|
3004
|
+
| `weights_json` | Pesos serializados da regressão logística |
|
|
3005
|
+
|
|
3006
|
+
---
|
|
3007
|
+
|
|
3008
|
+
### 8.5 A/B LTV — Auto-Winner
|
|
3009
|
+
|
|
3010
|
+
Quando um experimento A/B de prompt LTV tem uma variação com acurácia ≥5pp acima do controle:
|
|
3011
|
+
|
|
3012
|
+
1. O Worker declara o vencedor automaticamente via `POST /api/ltv/ab-test/winner`
|
|
3013
|
+
2. O prompt vencedor é ativado para todos os novos eventos
|
|
3014
|
+
3. Um alerta WhatsApp é enviado informando qual variação ganhou e a diferença de acurácia
|
|
3015
|
+
|
|
3016
|
+
Isso elimina a necessidade de revisão manual de experimentos.
|
|
3017
|
+
|
|
3018
|
+
---
|
|
3019
|
+
|
|
3020
|
+
### 8.6 Customer Match — Sync Semanal
|
|
3021
|
+
|
|
3022
|
+
O cron semanal também exporta os perfis com `intention_level = 'high'` via `GET /export/customer-match`.
|
|
3023
|
+
|
|
3024
|
+
- Formato CSV compatível com Google Customer Match
|
|
3025
|
+
- Emails e telefones hashados (SHA-256) conforme exigido pelo Google
|
|
3026
|
+
- Pode ser automatizado para upload direto via Google Ads API
|
|
3027
|
+
|
|
3028
|
+
---
|
|
3029
|
+
|
|
3030
|
+
### 8.7 Como Cada Tabela Alimenta o Desempenho
|
|
3031
|
+
|
|
3032
|
+
| Tabela | Alimenta | Resultado |
|
|
3033
|
+
|---|---|---|
|
|
3034
|
+
| `match_quality_log` | Alerta de degradação de EMQ | Fix proativo antes do CPA subir |
|
|
3035
|
+
| `user_profiles` | Auto-Enrich no dispatch | Mais eventos com email → EMQ sobe |
|
|
3036
|
+
| `ltv_model_weights` | Score LTV real no /track | Bids mais inteligentes via bid_recommendations |
|
|
3037
|
+
| `ml_segments` + `bid_recommendations` | Bid por segmento × plataforma | ROAS por cluster |
|
|
3038
|
+
| `fraud_signals` | Tráfego limpo | Melhor atribuição Meta/Google |
|
|
3039
|
+
| `ltv_ab_assignments` | Experimentos de prompt | Prompt com maior acurácia vence automaticamente |
|
|
3040
|
+
|
|
3041
|
+
---
|
|
3042
|
+
|
|
3043
|
+
### 8.8 Endpoints para Consultar os Dados
|
|
3044
|
+
|
|
3045
|
+
| Endpoint | O que retorna |
|
|
3046
|
+
|---|---|
|
|
3047
|
+
| `GET /api/fraud/stats` | Dashboard de fraude nas últimas 24h |
|
|
3048
|
+
| `GET /api/segmentation/list` | Segmentos ML ativos com métricas |
|
|
3049
|
+
| `GET /api/bidding/status` | Recomendações de bid por segmento × plataforma |
|
|
3050
|
+
| `GET /api/ltv/ab-test/results` | Acurácia por variação + vencedor recomendado |
|
|
3051
|
+
| `GET /export/customer-match` | Export de leads high-intent para Google Ads |
|
|
3052
|
+
|
|
3053
|
+
---
|
|
3054
|
+
|
|
3055
|
+
### 8.9 Sequência Completa de Migrations D1 (incluindo Fase 5)
|
|
3056
|
+
|
|
3057
|
+
```bash
|
|
3058
|
+
wrangler d1 execute cdp-edge-db --file=schema.sql --remote
|
|
3059
|
+
wrangler d1 execute cdp-edge-db --file=migrate-v6.sql --remote
|
|
3060
|
+
wrangler d1 execute cdp-edge-db --file=schema-segmentation.sql --remote
|
|
3061
|
+
wrangler d1 execute cdp-edge-db --file=schema-bidding.sql --remote
|
|
3062
|
+
wrangler d1 execute cdp-edge-db --file=schema-ab-ltv.sql --remote
|
|
3063
|
+
wrangler d1 execute cdp-edge-db --file=schema-fraud.sql --remote
|
|
3064
|
+
wrangler d1 execute cdp-edge-db --file=schema-indexes.sql --remote # Índices compostos de performance
|
|
3065
|
+
wrangler d1 execute cdp-edge-db --file=migrate-v7.sql --remote # Fase 5: ltv_model_weights + match_quality_log
|
|
3066
|
+
```
|
package/package.json
CHANGED
|
@@ -77,15 +77,39 @@ pelo ID que você copiou. Salve o arquivo.
|
|
|
77
77
|
|
|
78
78
|
## PASSO 5 — Criar as tabelas no banco
|
|
79
79
|
|
|
80
|
+
Execute os arquivos de schema na ordem abaixo. Cada arquivo usa `IF NOT EXISTS` e é idempotente — pode ser executado mais de uma vez sem risco.
|
|
81
|
+
|
|
80
82
|
```bash
|
|
81
|
-
|
|
83
|
+
# Core: tabelas principais (leads, user_profiles, events_log, identity_graph)
|
|
84
|
+
wrangler d1 execute cdp-edge-db --file=schema.sql --remote
|
|
85
|
+
|
|
86
|
+
# Migrations históricas (retry_queue, escalation_log, intelligence_logs)
|
|
87
|
+
wrangler d1 execute cdp-edge-db --file=migrate-v6.sql --remote
|
|
88
|
+
|
|
89
|
+
# Fase 1 — ML Clustering (ml_segments, ml_segment_members, views de segmentação)
|
|
90
|
+
wrangler d1 execute cdp-edge-db --file=schema-segmentation.sql --remote
|
|
91
|
+
|
|
92
|
+
# Fase 2 — Bidding ML (bid_recommendations, view v_active_bid_recs)
|
|
93
|
+
wrangler d1 execute cdp-edge-db --file=schema-bidding.sql --remote
|
|
94
|
+
|
|
95
|
+
# Fase 3 — A/B LTV Testing (ltv_ab_tests, ltv_ab_variations, ltv_ab_assignments)
|
|
96
|
+
wrangler d1 execute cdp-edge-db --file=schema-ab-ltv.sql --remote
|
|
97
|
+
|
|
98
|
+
# Fase 4 — Fraud Detection (fraud_signals, fraud_alerts, view v_fraud_dashboard)
|
|
99
|
+
wrangler d1 execute cdp-edge-db --file=schema-fraud.sql --remote
|
|
100
|
+
|
|
101
|
+
# Índices compostos de performance para queries D1 (todas as fases)
|
|
102
|
+
wrangler d1 execute cdp-edge-db --file=schema-indexes.sql --remote
|
|
103
|
+
|
|
104
|
+
# Fase 5 — LTV Real + Match Quality (ltv_model_weights, match_quality_log, view v_match_quality_24h)
|
|
105
|
+
wrangler d1 execute cdp-edge-db --file=migrate-v7.sql --remote
|
|
82
106
|
```
|
|
83
107
|
|
|
84
|
-
> Resultado esperado: "✅ Successfully executed SQL"
|
|
108
|
+
> Resultado esperado para cada arquivo: "✅ Successfully executed SQL"
|
|
85
109
|
|
|
86
110
|
Verificar se as tabelas foram criadas:
|
|
87
111
|
```bash
|
|
88
|
-
wrangler d1 execute cdp-edge-db --command="SELECT name FROM sqlite_master WHERE type='table';"
|
|
112
|
+
wrangler d1 execute cdp-edge-db --remote --command="SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"
|
|
89
113
|
```
|
|
90
114
|
|
|
91
115
|
---
|
|
@@ -442,3 +442,72 @@ const segmentedCampaigns = [
|
|
|
442
442
|
|
|
443
443
|
*API de Segmentação Dinâmica ML v1.0 — CDP Edge*
|
|
444
444
|
*Data: 9 de Abril de 2026*
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## Integração com LTV Real e Match Quality (Fase 5)
|
|
449
|
+
|
|
450
|
+
### Como ml_segments alimenta o modelo LTV
|
|
451
|
+
|
|
452
|
+
Os segmentos gerados pelo clustering não são apenas para campanhas — eles são features do modelo LTV treinado semanalmente.
|
|
453
|
+
|
|
454
|
+
Quando o cron semanal treina a regressão logística em `ltv_model_weights`, ele inclui o `cluster_id` do lead como feature. Isso significa:
|
|
455
|
+
|
|
456
|
+
- Leads do "Segmento Alto Valor + Alto Engajamento (SP)" têm peso positivo maior no modelo
|
|
457
|
+
- O modelo aprende quais segmentos historicamente convertem mais
|
|
458
|
+
- O LTV Score de cada novo `/track` já leva em conta o segmento do usuário
|
|
459
|
+
|
|
460
|
+
**Fluxo de dados:**
|
|
461
|
+
|
|
462
|
+
```
|
|
463
|
+
ml_segment_members (cluster_id por lead)
|
|
464
|
+
│
|
|
465
|
+
└─ JOIN com leads × purchases
|
|
466
|
+
│
|
|
467
|
+
└─ Treino semanal da regressão logística
|
|
468
|
+
│
|
|
469
|
+
└─ ltv_model_weights (is_active=1)
|
|
470
|
+
│
|
|
471
|
+
└─ Score LTV em cada /track
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Como bid_recommendations se conecta ao LTV treinado
|
|
475
|
+
|
|
476
|
+
O `ltv_model_weights` ativo gera scores mais precisos, que alimentam diretamente as recomendações de bid:
|
|
477
|
+
|
|
478
|
+
1. LTV Score do segmento sobe (modelo mais preciso) → `avg_ltv` do segmento é recalculado
|
|
479
|
+
2. Bidding Agent roda `POST /api/bidding/recommend` com o novo `avg_ltv`
|
|
480
|
+
3. `bid_recommendations` é atualizado com bid recomendado para o segmento × plataforma
|
|
481
|
+
4. Você aplica o bid sugerido em Meta/Google Ads
|
|
482
|
+
|
|
483
|
+
**Consulta útil — bid atual por segmento:**
|
|
484
|
+
|
|
485
|
+
```bash
|
|
486
|
+
curl "https://seudominio.com/api/bidding/status"
|
|
487
|
+
# Retorna: bid recomendado atual por segmento × plataforma
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Como Match Quality afeta a qualidade dos segmentos
|
|
491
|
+
|
|
492
|
+
A tabela `match_quality_log` registra se cada evento que alimentou o D1 tinha email, fbp, etc. Eventos com `has_email = 0` têm Advanced Matching incompleto — a Meta pode não ter conseguido fazer o match com um usuário real.
|
|
493
|
+
|
|
494
|
+
Isso significa que `ml_segments` pode conter leads "fantasmas" (usuários que a Meta não reconheceu). Para garantir a qualidade dos segmentos:
|
|
495
|
+
|
|
496
|
+
1. Monitore `v_match_quality_24h` para manter `email_rate > 40%`
|
|
497
|
+
2. Se a taxa cair, o Auto-Enrich (Identity Graph) recupera emails de sessões anteriores automaticamente
|
|
498
|
+
3. Leads com email recuperado (`was_email_recovered = 1`) são indistinguíveis dos outros no clustering — têm o mesmo peso
|
|
499
|
+
|
|
500
|
+
**Consulta de match quality:**
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
curl "https://seudominio.com/api/fraud/stats"
|
|
504
|
+
# Inclui métricas de qualidade de sinal junto com dados de fraude
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Tabelas relacionadas (Fase 5)
|
|
508
|
+
|
|
509
|
+
| Tabela | Relação com segmentação |
|
|
510
|
+
|---|---|
|
|
511
|
+
| `ltv_model_weights` | Usa `cluster_id` como feature; melhora scores LTV por segmento |
|
|
512
|
+
| `match_quality_log` | Indica qualidade dos eventos que geraram os leads dos segmentos |
|
|
513
|
+
| `user_profiles` | Auto-Enrich recupera dados antes do dispatch → mais leads com email → melhor clustering |
|
|
@@ -111,6 +111,17 @@ export default {
|
|
|
111
111
|
|
|
112
112
|
const url = new URL(request.url);
|
|
113
113
|
|
|
114
|
+
// ── Rate Limiter — camada 0, antes do Fraud Gate ─────────────────────────
|
|
115
|
+
if (url.pathname === '/track' && request.method === 'POST' && env.RATE_LIMITER) {
|
|
116
|
+
const ip = request.headers.get('CF-Connecting-IP')
|
|
117
|
+
|| request.headers.get('X-Forwarded-For')?.split(',')[0].trim()
|
|
118
|
+
|| '0.0.0.0';
|
|
119
|
+
const { success } = await env.RATE_LIMITER.limit({ key: ip });
|
|
120
|
+
if (!success) {
|
|
121
|
+
return new Response(JSON.stringify({ status: 'ok', queued: true }), { status: 200, headers });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
114
125
|
// ── Fraud Gate — Fase 4 (apenas em /track) ────────────────────────────────
|
|
115
126
|
// Roda ANTES de qualquer processamento de evento
|
|
116
127
|
// Silent drop (200) — bots não sabem que foram detectados
|
|
@@ -3780,6 +3780,21 @@ export default {
|
|
|
3780
3780
|
|
|
3781
3781
|
const url = new URL(request.url);
|
|
3782
3782
|
|
|
3783
|
+
// ── Rate Limiter — camada 0, antes do Fraud Gate ─────────────────────────
|
|
3784
|
+
// Bloqueia na borda por IP antes de qualquer CPU ser consumida
|
|
3785
|
+
// Silent drop (200) — atacante não sabe que foi bloqueado
|
|
3786
|
+
// Requer binding RATE_LIMITER no wrangler.toml (Workers Paid)
|
|
3787
|
+
// Fail-open: se binding não existir, deixa passar (não quebra o fluxo)
|
|
3788
|
+
if (url.pathname === '/track' && request.method === 'POST' && env.RATE_LIMITER) {
|
|
3789
|
+
const ip = request.headers.get('CF-Connecting-IP')
|
|
3790
|
+
|| request.headers.get('X-Forwarded-For')?.split(',')[0].trim()
|
|
3791
|
+
|| '0.0.0.0';
|
|
3792
|
+
const { success } = await env.RATE_LIMITER.limit({ key: ip });
|
|
3793
|
+
if (!success) {
|
|
3794
|
+
return new Response(JSON.stringify({ status: 'ok', queued: true }), { status: 200, headers });
|
|
3795
|
+
}
|
|
3796
|
+
}
|
|
3797
|
+
|
|
3783
3798
|
// ── Fraud Gate — Fase 4 (apenas em /track e /api) ────────────────────────
|
|
3784
3799
|
// Roda ANTES de qualquer processamento de evento
|
|
3785
3800
|
// Silent drop (200) — bots não sabem que foram detectados
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
name = "server-edge-tracker"
|
|
2
2
|
# Entry point: worker.js (monólito original, 100% compatível)
|
|
3
3
|
# Para usar a versão modular ES Modules: altere para main = "index.js"
|
|
4
|
-
main = "
|
|
4
|
+
main = "index.js"
|
|
5
5
|
compatibility_date = "2025-01-01"
|
|
6
6
|
compatibility_flags = ["nodejs_compat"]
|
|
7
7
|
|
|
@@ -64,11 +64,11 @@ id = "821b6c1ccb4b475985439b801c1fdbe0"
|
|
|
64
64
|
preview_id = "d2d9198f47e340ee905a8dc566b09e95"
|
|
65
65
|
|
|
66
66
|
# ── R2 Bucket — Audit Logs ────────────────────────────────────────────────────
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
# Logs imutáveis por evento: logs/YYYY/MM/DD/{timestamp}_{eventName}.json
|
|
68
|
+
# Sem PII — apenas userId, eventId, ltvClass, UTMs, geo
|
|
69
|
+
[[r2_buckets]]
|
|
70
|
+
binding = "AUDIT_LOGS"
|
|
71
|
+
bucket_name = "cdp-edge-logs"
|
|
72
72
|
|
|
73
73
|
# ── Cron Triggers — Intelligence Agent ───────────────────────────────────────
|
|
74
74
|
# Semanal: domingo 02:00 UTC — check de versões de API + relatório diário
|
|
@@ -82,6 +82,19 @@ crons = ["0 2 * * 7", "0 3 1 * *"]
|
|
|
82
82
|
[ai]
|
|
83
83
|
binding = "AI"
|
|
84
84
|
|
|
85
|
+
# ── Rate Limiting — proteção do /track contra abuso de cota ──────────────────
|
|
86
|
+
# Bloqueia na borda ANTES de qualquer processamento do Worker
|
|
87
|
+
# Limite: 60 requisições por minuto por IP (generoso para usuário real)
|
|
88
|
+
# Requer Workers Paid plan ($5/mês) — remover bloco se usar plano free
|
|
89
|
+
[[unsafe.bindings]]
|
|
90
|
+
name = "RATE_LIMITER"
|
|
91
|
+
type = "ratelimit"
|
|
92
|
+
namespace_id = "1001"
|
|
93
|
+
|
|
94
|
+
[unsafe.bindings.simple]
|
|
95
|
+
limit = 60
|
|
96
|
+
period = 60
|
|
97
|
+
|
|
85
98
|
# ── Secrets (NÃO ficam aqui — configurar via CLI) ─────────────────────────────
|
|
86
99
|
# wrangler secret put META_ACCESS_TOKEN ← token Meta CAPI (obrigatório)
|
|
87
100
|
# wrangler secret put GA4_API_SECRET ← secret GA4 Measurement Protocol (obrigatório)
|