Appearance
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
| Segmento | Condição | Interpretação |
|---|---|---|
| Champions | recência ≤ 30d E (gasto > R$1.000 OU pedidos > 5) | Melhores clientes ativos |
| Loyal Customers | recência ≤ 90d E pedidos > 5 | Fiéis e frequentes |
| Potential Loyalist | recência ≤ 60d E pedidos entre 2–4 | Potencial de fidelização |
| Recent Customers | recência ≤ 30d (padrão) | Compraram recentemente |
| Promising | 30d < recência ≤ 90d E pedidos entre 2–4 | Bom potencial, ainda aquecidos |
| Need Attention | 90d < recência ≤ 120d E pedidos > 2 | Engajados mas esfriando |
| About To Sleep | 90d < recência ≤ 150d | Em risco de hibernar |
| At Risk | 120d < recência ≤ 180d | Alto risco de churn |
| Can't Lose Them | recência > 180d E (gasto > R$1.000 OU pedidos > 5) | Eram valiosos, sumidos |
| Hibernating | 0 pedidos OU recência > 180d | Inativos |
Constantes (configuráveis em crm.config.ts):
| Constante | Valor | Uso |
|---|---|---|
CHURN_DAYS | 180 | Dias para considerar hibernando |
RISK_DAYS | 120 | Dias para considerar em risco |
LOYAL_TOTAL_SPENT | R$ 1.000 | Gasto mínimo para "loyal" |
LOYAL_ORDER_COUNT | 5 | Pedidos 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 → negativoDisponí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
| Valor | Resolve para |
|---|---|
hoje | Data atual |
ontem | D-1 |
este_mes | Início do mês |
mes_passado | Início/fim do mês anterior |
ultimo_ano | Início do ano |
ultimos_{N}_dias | D-N |
ultimos_{N}_meses | N 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):
| Campo | Mascaramento |
|---|---|
x***@dominio.com | |
| Telefone | ***XXXX (últimos 4 dígitos) |
| Nome | Sem mascaramento |
| Cidade/UF | Sem mascaramento |
| Total gasto | Sem mascaramento |
| Última compra | Sem mascaramento |
Limite: EXPORT_LIMIT clientes por exportação (configurável).