Skip to content

Regras RFM & Segmentação

O que é RFM

RFM é um modelo de classificação de clientes com base em três dimensões:

  • Recência: há quantos dias foi a última compra
  • Frequência: quantas compras foram feitas
  • Monetário: quanto foi gasto no total

O CRM classifica cada cliente em um de 10 segmentos baseado nessas dimensões.

Os 10 segmentos RFM

SegmentoCondiçãoInterpretação
Championsrecência ≤ 30d E (gasto > R$1.000 OU pedidos > 5)Melhores clientes ativos
Loyal Customersrecência ≤ 90d E pedidos > 5Fiéis e frequentes
Potential Loyalistrecência ≤ 60d E pedidos entre 2–4Potencial de fidelização
Recent Customersrecência ≤ 30d (padrão)Compraram recentemente
Promising30d < recência ≤ 90d E pedidos entre 2–4Bom potencial, ainda aquecidos
Need Attention90d < recência ≤ 120d E pedidos > 2Engajados mas esfriando
About To Sleep90d < recência ≤ 150dEm risco de hibernar
At Risk120d < recência ≤ 180dAlto risco de churn
Can't Lose Themrecência > 180d E (gasto > R$1.000 OU pedidos > 5)Eram valiosos, sumidos
Hibernating0 pedidos OU recência > 180dInativos

Constantes (configuráveis em crm.config.ts):

ConstanteValorUso
CHURN_DAYS180Dias para considerar hibernando
RISK_DAYS120Dias para considerar em risco
LOYAL_TOTAL_SPENTR$ 1.000Gasto mínimo para "loyal"
LOYAL_ORDER_COUNT5Pedidos mínimos para "loyal"

Quando o RFM é recalculado

Cron às 7h diário: rfm-analysis.service.ts executa um CTE SQL que recalcula todos os clientes da organização.

Por transação: Quando uma venda é registrada, updateCustomerMetrics() recalcula imediatamente os campos totalSpent, orderCount, lastOrder e rfmStatus do cliente.

Manual: POST /rfm/recompute força recálculo.

Migração de segmentos

O módulo RFM rastreia migrações entre segmentos entre dois períodos:

Positivas: cliente migrou de segmento negativo → positivo
Negativas: cliente migrou de segmento positivo → negativo

Disponível em GET /rfm/migrations?currentPeriod=...&previousPeriod=...

Segmentação por filtros

A inteligência CRM vai além do RFM — permite criar segmentos com filtros combinados:

Exemplo de regra de segmento

json
{
  "rules": [
    {
      "logic": "AND",
      "filters": [
        { "category": "rfm", "field": "rfmStatus", "operator": "in", "value": ["champions", "loyal"] },
        { "category": "characteristic", "field": "city", "operator": "eq", "value": "São Paulo" }
      ]
    }
  ]
}

Filtros de data relativa

ValorResolve para
hojeData atual
ontemD-1
este_mesInício do mês
mes_passadoInício/fim do mês anterior
ultimo_anoInício do ano
ultimos_{N}_diasD-N
ultimos_{N}_mesesN meses atrás

Proteção de timeout

Queries de segmentação têm timeout:

  • Preview: 12s (statement) / 15s (transação) — retorna { timedOut: true } graciosamente
  • Recálculo background: 60s (statement)

Exportação de segmento

GET /crm/intelligence/segments/:id/export retorna CSV com dados mascarados (LGPD):

CampoMascaramento
Emailx***@dominio.com
Telefone***XXXX (últimos 4 dígitos)
NomeSem mascaramento
Cidade/UFSem mascaramento
Total gastoSem mascaramento
Última compraSem mascaramento

Limite: EXPORT_LIMIT clientes por exportação (configurável).