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 TRON (200k/140k/80k/20k) | resolvido |
| 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, sem quintil (confirmado na planilha; e o V do BI não muda ao filtrar data → é estático). O que faltava eram os cortes certos: os do Erlan (1M/500k/200k/50k) são de outro cliente e no TRON jogavam quase tudo em V1. O PO definiu os cortes do TRON (jul/2026):
Distribuição agora (população da tela — quem faturou no mês, ~350 clientes): V1 40% · V2 36% · V3 9% · V4 7% · V5 8% — o Valor voltou a discriminar. (Sobre a base inteira, incluindo dormentes, o V1 fica pesado — mas a tela só mostra a população do perÃodo.)
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 | diverge do BI | V do BI é opaco (ETL); com os cortes do TRON a distribuição na tela é saudável (V1 40%…V5 8%). cortes TRON |
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 |
âš ï¸ Os cortes de R$ do Valor (coluna M) acima são do Erlan (outro cliente). No nosso gateway o Valor usa os cortes do TRON (definidos pelo PO): V5 ≥200k · V4 ≥140k · V3 ≥80k · V2 ≥20k · V1 <20k. As réguas de R e F são as mesmas.
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) |
|---|---|---|---|---|---|---|
| 002606 | 4 | 6 | 281.141 | 5 · 3 · 5 | 13 | Clientes leais |
| 000736 | 3 | 7 | 144.745 | 5 · 3 · 4 | 12 | Clientes leais |
| 001236 | 3 | 10 | 135.302 | 5 · 4 · 3 | 12 | Clientes leais |
| 000526 | 3 | 1 | 49.704 | 5 · 1 · 2 | 8 | Potenciais leais |
| 000590 | 4 | 2 | 15.797 | 5 · 1 · 1 | 7 | Clientes recentes |
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).
A peça que fecha a leitura da tela. Os rótulos da matriz do BI somam ~6.226, mas ao
clicar num segmento o BI traz muito menos clientes. O rótulo conta linhas duplicadas
(cliente × perÃodo no T_RFV_027713), não clientes distintos.
| Segmento | Clientes distintos | Notas / cliente (hist.) |
|---|---|---|
| Campeões | 44 | 238 |
| Clientes leais | 83 | 104 |
| Potenciais leais | 667 | 40 |
| Prestes a dormir | 306 | 25 |
| Perdidos | 470 | 15 |
| Promissores | 152 | 8 |
| Clientes recentes | 142 | 7 |
| Segmento | Rótulo matriz (BI) | Drill-down real (BI) | Nosso (distinto) | |
|---|---|---|---|---|
| Campeões | 463 | 25 | 44 | V/F opaco |
| Potenciais leais | 2.402 | 645 | 667 | ≈ bate |
| Total | ~6.226 | ~2.016 | 2.030 | ≈ bate |
Não há erro na nossa contagem — a nossa matriz já conta clientes distintos
(COUNT(DISTINCT cliente)), que é o número real que o BI só revela no drill-down. O rótulo
6.226 é artefato de contagem (notas duplicadas). Nosso total (2.030) bate com o real do BI (~2.016);
as diferenças por segmento (ex.: Campeões 44 × 25) são a divergência de F/V já conhecida (ETL do DW).
O BI traz 70 nesse segmento; nós 36. Cruzando a lista exata dos 70 do BI com o nosso cálculo, a diferença fica clara — e não é população nem Recência.
| Dimensão | Resultado | Veredito |
|---|---|---|
| Na nossa base? | 70 de 70 presentes | ok |
| Compraram em 2026? | 70 de 70 (nenhum “+1 ano sem comprarâ€) | população ok |
| Recência | 70 de 70 = R3 (idêntico ao BI) | R bate |
| Frequência (F3·F2·F1) | BI 3·26·41 × nós 14·34·22 | diverge |
| Valor (V5·V4·V3·V2·V1) | BI 22·25·22·1·0 × nós 0·0·2·39·29 | diverge muito |
Não é população (os ~2.031 do nosso RFM batem com os ~1.968 do Horus) nem Recência (bate cliente a cliente).
A divergência está em Frequência e Valor, porque no BI elas vêm pré-calculadas do ETL do DW
(T_RFV_027713) e não da planilha aplicada ao Protheus.
Valor: nós usamos faixa fixa nos cortes do TRON (200k/140k/80k/20k). Esses cortes são altos para a escala do TRON (faturamento 12m médio ~R$27k), então quase todo cliente cai em V1–V2 — enquanto o V do BI é espalhado (V3–V5), com cara de quintil. Testei cortes fixos e quintil em 12m/24m/histórico: nenhuma janela reproduz o V do BI.
Frequência: nossa contagem de meses com compra em 12m dá mais alta que a do BI (o ETL conta menos meses).
Decisão: seguimos a planilha 100% (R, F, V faixa-fixa, FM, segmento). Os números
divergem do BI porque o BI ≠planilha em F e V. Para bater exato com o BI, o único caminho é espelhar a
T_RFV do DW (ler os scores prontos) — o que abandona o cálculo pela planilha e vira um espelho do BI.
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).
Atualização (jul/2026): os cortes do Valor passaram para os do TRON (200k/140k/80k/20k, definidos
pelo PO) — RfmScore::VALOR_FAIXAS, teste unitário e o backend/docs/regras-metricas.md
já estão sincronizados com este relatório.