cdp-edge 1.21.0 → 1.22.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.
@@ -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 |
@@ -113,10 +113,21 @@ wrangler d1 execute cdp-edge-db --file=schema-ab-ltv.sql --remote
113
113
 
114
114
  # Fase 4: Fraud Detection
115
115
  wrangler d1 execute cdp-edge-db --file=schema-fraud.sql --remote
116
+
117
+ # Índices compostos de performance (queries D1)
118
+ wrangler d1 execute cdp-edge-db --file=schema-indexes.sql --remote
119
+
120
+ # Fase 5: LTV Model (regressão logística) + Match Quality Log
121
+ wrangler d1 execute cdp-edge-db --file=migrate-v7.sql --remote
116
122
  ```
117
123
 
118
124
  Após cada migração: confirmar sucesso antes de prosseguir.
119
125
 
126
+ > **Fase 5 cria duas tabelas críticas:**
127
+ > - `ltv_model_weights` — pesos do modelo LTV treinado semanalmente pelo cron
128
+ > - `match_quality_log` — registra flags de qualidade de dados (has_email, has_fbp, etc.) a cada CAPI dispatch
129
+ > Sem essas tabelas: o modelo LTV não persiste e o Match Quality Alert não funciona.
130
+
120
131
  ---
121
132
 
122
133
  ## PROCEDURE `*rollback`
@@ -306,6 +306,33 @@ async function checkApiDepreciations(env) {
306
306
 
307
307
  ---
308
308
 
309
+ ### MONITORAMENTO AUTOMÁTICO DE MATCH QUALITY (CRON SEMANAL)
310
+
311
+ O Intelligence Agent monitora a qualidade dos dados enviados ao Meta CAPI a cada execução do cron.
312
+ Os dados são lidos da tabela `match_quality_log` (populada automaticamente pelo Worker a cada dispatch).
313
+
314
+ **Thresholds obrigatórios — alertar via CallMeBot se:**
315
+
316
+ | Métrica | Threshold mínimo | Ação automática |
317
+ |---|---|---|
318
+ | `email_rate` | 40% dos eventos com email | Alerta ⚠️ — verificar Identity Graph |
319
+ | `fbp_rate` | 30% dos eventos com cookie fbp | Alerta ⚠️ — verificar cdpTrack.js |
320
+ | `composite_score` | 45% (email×0.4 + fbp×0.3 + phone×0.2 + fbc×0.1) | Alerta 🚨 CRÍTICO |
321
+
322
+ **O cron semanal executa automaticamente (sem intervenção manual):**
323
+ 1. `_trainLtvModel(env)` — re-treina regressão logística com últimos 5000 leads do D1; pesos salvos em `ltv_model_weights` e cache KV invalidado
324
+ 2. `_autoDecideAbWinner(env)` — declara winner de A/B LTV se melhoria ≥ 5pp vs controle; alerta WhatsApp automático
325
+ 3. `_analyzeMatchQuality(env)` — analisa janela 2h; dispara alertas CallMeBot se abaixo dos thresholds
326
+ 4. `syncMetaCustomAudience(env)` — sincroniza leads high_intent com Meta Custom Audience
327
+
328
+ **Auto-recuperação integrada ao dispatch:**
329
+ - Antes de cada envio ao Meta CAPI, o Worker tenta enriquecer automaticamente o payload consultando o Identity Graph pelo `userId` (recupera email, fbp, fbc, phone ausentes)
330
+ - Resultado de recuperação é logado em `match_quality_log.was_email_recovered`
331
+
332
+ **Pré-requisito de infraestrutura:** `migrate-v7.sql` deve estar aplicada no D1 (tabelas `ltv_model_weights` + `match_quality_log`).
333
+
334
+ ---
335
+
309
336
  ### CHECK DE NOVOS PARÂMETROS DE EVENT MATCH QUALITY
310
337
 
311
338
  O Intelligence Agent DEVE buscar novos parâmetros que melhoram a nota de atribuição:
@@ -1285,7 +1285,7 @@ Spawnar o **Intelligence Agent** para realizar auditoria completa da stack:
1285
1285
 
1286
1286
  **2. Infraestrutura Cloudflare**
1287
1287
  - `wrangler.toml` — bindings D1, KV, Queue, AI estão todos declarados
1288
- - `schema.sql` e migrations — todas as fases (core, segmentation, bidding, ab-ltv, fraud) aplicadas
1288
+ - `schema.sql` e migrations — todas as fases aplicadas na ordem: core segmentation bidding ab-ltv fraud → schema-indexes → **migrate-v7** (LTV model + Match Quality)
1289
1289
  - Worker.js — endpoints ativos correspondem à arquitetura esperada
1290
1290
 
1291
1291
  **3. Conformidade e Qualidade de Sinal**
@@ -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.0",
3
+ "version": "1.22.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
@@ -46,13 +46,13 @@ CREATE INDEX IF NOT EXISTS idx_profiles_email_updated
46
46
 
47
47
  -- ── fraud_signals: dashboard e alertas ───────────────────────────────────────
48
48
 
49
- -- handleFraudAlerts: filtra por ip + período
50
- CREATE INDEX IF NOT EXISTS idx_fraud_ip_created
51
- ON fraud_signals(ip_address, created_at DESC);
49
+ -- handleFraudAlerts: filtra por ip + período (coluna: detected_at)
50
+ CREATE INDEX IF NOT EXISTS idx_fraud_ip_detected
51
+ ON fraud_signals(ip_address, detected_at DESC);
52
52
 
53
53
  -- handleFraudStats: fraud_score >= threshold ordenado por data
54
- CREATE INDEX IF NOT EXISTS idx_fraud_score_created
55
- ON fraud_signals(fraud_score DESC, created_at DESC);
54
+ CREATE INDEX IF NOT EXISTS idx_fraud_score_detected
55
+ ON fraud_signals(fraud_score DESC, detected_at DESC);
56
56
 
57
57
  -- ── ltv_ab_assignments: resultados de A/B test ───────────────────────────────
58
58
 
@@ -62,6 +62,6 @@ CREATE INDEX IF NOT EXISTS idx_ab_testid_class
62
62
 
63
63
  -- ── ml_segment_members: join com leads para bidding ─────────────────────────
64
64
 
65
- -- handleBiddingRecommend: segment_id lookup
65
+ -- handleBiddingRecommend: segment_id lookup (coluna: assigned_at)
66
66
  CREATE INDEX IF NOT EXISTS idx_seg_members_segid
67
- ON ml_segment_members(segment_id, joined_at DESC);
67
+ ON ml_segment_members(cluster_id, assigned_at DESC);
@@ -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
@@ -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)