Comparação fato a fato do cálculo de Recência, Frequência, Valor, Nota e Segmento entre as três referências que temos. Documento descritivo — nada foi alterado no backend.
Onde as três concordam, onde divergem, e por quê.
| Fato | Planilha (Erlan) | BI do TRON (dado real) | Nosso gateway | Situação |
|---|---|---|---|---|
| Recência | Dias sem compra → 30/60/90/120 | Segue 30/60/90/120 (legenda de ≤3d é falsa) | 30/60/90/120 | bate · 28/29 |
| Frequência | Nº de meses c/ compra em 12m | Opaco (ETL do DW) | Nº de meses c/ compra em 12m | só planilha · 15/29 |
| Valor | Faixa fixa de R$ (fat. 12m) | Opaco (nem quintil, nem faixa) | Faixa fixa de R$ — cortes do Erlan | decisão aberta · 7/29 |
| F+M médio (FM) | ROUNDUP((F+M)/2) |
(entra no segmento) | ROUND((F+V)/2) |
bate |
| Nota | Não existe soma; saída = segmento | R+F+V (3–15) |
R+F+V (3–15) |
bate BI |
| Segmento | Matriz 5×5 R × FM | 11 segmentos, matriz R × FM | Matriz 5×5 R × FM (idêntica à planilha) | bate |
| Janela / população | R = histórico · F/M = 12m | Estático (pré-calculado no DW) | R = histórico · F/V = 12m · população = quem faturou no período | alinhado |
A tela de RFM do BI exibe uma legenda (R5 ≤3 dias, Frequência por “pedidos/semana”,
Valor por “quintis 20%”). Mas quando revertemos o dado real da tabela do DW
(T_RFV_027713), ele não segue essa legenda.
Prova na Recência — dias reais por score do BI: R5 3–25 · R4 33–54 · R3 61–75 · R2 97–111 · R1 112+. Isso é a régua 30/60/90/120 da planilha, não o “≤3 dias” da legenda.
Por isso a orientação foi: “siga na planilha e veja o quanto bate com o BI — a legenda pode estar errada.” E bateu (28 de 29 clientes na Recência).
A régua da planilha, o que o BI faz de verdade, e o que está no nosso gateway.
Dias desde a última compra (todo o histórico) até hoje.
Nº de meses distintos com compra nos últimos 12 meses.
Média de Frequência e Valor, arredondada pra cima.
ROUNDUP((F+M)/2)ROUND((F+V)/2) — idêntico p/ meios-inteiros · batePontuação geral do cliente.
R+F+V (vai até 15)R+F+V · bate BIAs três concordam no método: faixa fixa de R$ sobre o faturamento dos últimos 12 meses. Confirmado na planilha: os cortes são números fixos, sem nenhuma função de quintil/percentil/rank. E o Valor do BI não muda quando filtro a data → é estático, não é quintil dinâmico.
O problema: os cortes do Erlan são de outro cliente. No TRON (fat. 12m de R$10 a ~R$3M, média R$27k) quase todo mundo cai abaixo de R$50k → vira V1. A distribuição atual mostra isso: V1 5427 · V2 565 · V3 566 · V4 462 · V5 565 — o Valor praticamente não separa ninguém.
Decisão pendente (sua): manter o literal do Erlan, ou usar o mesmo método (faixa fixa) com cortes na escala do TRON (≈ 30k/15k/7k/3k, da distribuição real) para o Valor voltar a discriminar. Não mudei nada — só registrei aqui.
Idêntica na planilha e no nosso gateway. Eixo X = Recência (1→5), eixo Y = F+M médio (5→1). Campeões exige R5 e FM5 (a versão antiga do nosso doc marcava R5·FM4 como Campeões — está corrigido no código).
→ Recência aumenta para a direita · ↑ Frequência+Valor aumenta para cima
Recência e Nota do BI batem porque são deriváveis das vendas. Já Frequência e Valor
do BI vêm de colunas pré-calculadas na tabela T_RFV_027713 (MySQL do HorusBI),
populadas por um ETL fora do Protheus, ao qual não temos acesso. Sinais de que são opacos:
Decisão de projeto (registrada): o gateway define a sua própria versão, calculada do Protheus e responsiva aos filtros (requisito do PO), seguindo a planilha. R e Nota coincidem com o BI; F e V seguem a planilha e por isso divergem dos números do BI — o que é esperado e transparente.
Cruzamento por cliente (n = 29) do gateway contra o dado do BID do TRON.
| Dimensão | Acerto vs BI | Leitura |
|---|---|---|
| Recência | 28 / 29 (97%) | Régua da planilha = dado do BI. ok |
| Nota | bate | Soma R+F+V, vai até 15. ok |
| Segmento | bate | Matriz 5×5 célula a célula. ok |
| Frequência | 15 / 29 | BI opaco; seguimos a planilha. nossa versão |
| Valor | 7 / 29 | BI opaco + cortes do Erlan degeneram no TRON. rever cortes |
A planilha também classifica cada cliente por atividade — pode virar um card/filtro futuro:
| Status | Regra (planilha) |
|---|---|
| Sem compra | Faturamento 12m = 0 |
| Inativo | Dias sem compra > 90 |
| Pré-Inativo | Dias sem compra entre 60 e 90 |
| Ativo | Caso contrário |
Extraído da aba Carteira de Clientes (4.358 clientes) do “RFM - Erlan.xlsx”. Fórmulas literais.
| Score | R — Dias sem compra | F — Nº meses c/ compra (12m) | M — Fat. últimos 12m (R$) |
|---|---|---|---|
| 5 | ≤ 30 | = 12 | ≥ 1.000.000 |
| 4 | 31 – 60 | 9 – 11 | 500.000 – 999.999,99 |
| 3 | 61 – 90 | 6 – 8 | 200.000 – 499.999,99 |
| 2 | 91 – 120 | 3 – 5 | 50.000 – 199.999,99 |
| 1 | ≥ 121 | ≤ 2 | ≤ 49.999,99 |
Mesma matriz da seção 04, com os nomes exatos e a regra (R, Média F+M):
| # | Segmento | Regra (R · FM) |
|---|---|---|
| 01 | Campeões | R5 · FM5 |
| 02 | Clientes Leais | R3-5 · FM4-5 (exceto R5·FM5) |
| 03 | Potenciais Clientes Leais | R4-5 · FM2-3 |
| 04 | Clientes Recentes | R5 · FM1 |
| 05 | Promissores | R4 · FM1 |
| 06 | Precisam de Atenção | R3 · FM3 |
| 07 | Prestes a Dormir | R3 · FM1-2 |
| 08 | Em Risco | R1-2 · FM3-4 |
| 09 | Não Pode Perdê-los | R1-2 · FM5 |
| 10 | Hibernando | R2 · FM2 |
| 11 | Perdidos | R1 · FM1-2 · e R2·FM1 |
Além do RFM: Qtd. de SKUs (36–25m / 24–13m / 12m), Partic. % do faturamento 12m, Comparativo de faturamento de 2 anos com flag Crescendo/Caindo (faturamento e SKUs), Soma de faturamento 36m, Soma de positivação 36m, flags Compraram por janela, e Tipo de Cliente (ex.: Recorrente).
Três passos, repetíveis em qualquer cliente, para garantir que a régua foi lida certo.
| Cód. | Dias | Meses 12m | Fat. 12m | R · F · M | FM | Segmento (planilha) |
|---|---|---|---|---|---|---|
| 852 | 10 | 11 | 4.134.612 | 5 · 4 · 5 | 5 | 01-Campeões |
| 6 | 49 | 11 | 4.905.203 | 4 · 4 · 5 | 5 | 02-Clientes Leais |
| 833 | 10 | 5 | 964.358 | 5 · 2 · 4 | 3 | 03-Potenciais Leais |
| 11254 | 3 | 2 | 29.046 | 5 · 1 · 1 | 1 | 04-Clientes Recentes |
| 12515 | 51 | 2 | 18.284 | 4 · 1 · 1 | 1 | 05-Promissores |
| 15843 | 67 | 5 | 903.985 | 3 · 2 · 4 | 3 | 06-Precisam de Atenção |
| 23387 | 67 | 3 | 143.127 | 3 · 2 · 2 | 2 | 07-Prestes a Dormir |
| 12374 | 114 | 4 | 1.411.305 | 2 · 2 · 5 | 4 | 08-Em Risco |
| 16533 | 99 | 2 | 228.827 | 2 · 1 · 3 | 2 | 10-Hibernando |
| 1051 | 645 | 1 | 331.397 | 1 · 1 · 3 | 2 | 11-Perdidos |
| Cliente | Dias | Meses 12m | Fat. 12m | R · F · V | Nota | Segmento (gateway) |
|---|---|---|---|---|---|---|
| 009282 | 0 | 13 | 3.220.216 | 5 · 5 · 5 | 15 | Campeões |
| 000382 | 28 | 10 | 705.526 | 5 · 4 · 4 | 13 | Clientes leais |
| 008687 | 51 | 6 | 486.296 | 4 · 3 · 3 | 10 | Potenciais leais |
| 103072 | 64 | 1 | 524.920 | 3 · 1 · 4 | 8 | Precisam de atenção |
| 000579 | 1 | 13 | 497.645 | 5 · 5 · 3 | 13 | Clientes leais |
Imprime insumos + scores de 10 clientes para conferir na mão — php artisan tinker:
Abra o report da matriz RFM (traz Código + R/F/V por cliente), escolha um cliente e compare: Recência e Nota batem; Frequência e Valor divergem — vêm do ETL do DW, são opacos (esperado, ver seção 05).
Nada foi alterado para produzir este documento — é uma leitura do estado atual (código
backend/app/Support/Protheus/RfmScore.php e RfmRepository.php), das fórmulas da
planilha “RFM - Erlan.xlsx” e do dado revertido do BI (T_RFV_027713).
Observação: o arquivo backend/docs/regras-metricas.md ainda descreve a versão antiga
do RFM (≤3 dias / quintil) — está defasado em relação ao código; a correção dele fica como próximo passo,
quando você decidir os cortes do Valor.