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.
@@ -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.3'));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdp-edge",
3
- "version": "1.21.1",
3
+ "version": "1.23.0",
4
4
  "description": "CDP Edge - Quantum Tracking - Sistema multi-agente para tracking digital Cloudflare Native (Workers + D1)",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -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
- wrangler d1 execute cdp-edge-db --file=schema.sql
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 = "worker.js"
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
- # ⚠️ PENDENTE: Habilitar R2 no Cloudflare Dashboard antes de descomentar
68
- # Dashboard R2 Enable depois: wrangler r2 bucket create cdp-edge-logs
69
- # [[r2_buckets]]
70
- # binding = "AUDIT_LOGS"
71
- # bucket_name = "cdp-edge-logs"
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)