Health score: transformar dezenas de sinais numa nota que o CSM confia
Um health score é fácil de construir e difícil de fazer valer alguma coisa. Você pega vinte e tantos sinais de uma rede de postos — uso da plataforma, frequência de contato, situação financeira, engajamento no WhatsApp, tickets de suporte, tempo de contrato — joga numa fórmula, e sai um número. A parte difícil nunca foi a matemática. Foi fazer o CSM olhar aquele número e confiar nele o suficiente para agir. Este é o post sobre a parte difícil.
A matemática é a parte fácil
Combinar dezenas de sinais numa nota única é um problema conhecido. Você normaliza cada sinal, dá um peso, agrega. Dá para fazer num fim de tarde. A IA inclusive ajuda a esboçar a estrutura rápido: quais dimensões agrupam quais sinais, como ponderar, como lidar com sinal faltante.
O problema é que um número sozinho não convence ninguém. Se a tela mostra "Rede X: saúde 42" e o CSM acabou de falar com o dono da rede, que estava eufórico com os resultados, uma de duas coisas acontece: ou ele desconfia do score, ou ele desconfia do próprio faro. Nas duas, você perdeu. Um score que contradiz a realidade sem explicar por quê não é um dado, é um ruído com aparência de autoridade.
Por isso a decisão de design mais importante não foi a fórmula. Foi que o score precisa se explicar. Ao lado da nota, o CSM vê o que puxou ela para baixo: "sem contato há semanas", "faturamento em atraso", "queda no uso". A nota é o resumo; a explicação é o que a torna acionável. O CSM não precisa acreditar no número por fé — ele vê a conta.
Por que uma nota errada e confiante é pior do que nenhuma
Essa é a lição que orientou o resto. Um score ausente é um problema óbvio: o CSM sabe que não sabe, e vai atrás. Um score errado com cara de certo é um problema silencioso: ele age com base numa mentira sem perceber que é mentira.
Os jeitos de estar confiantemente errado que mais nos preocuparam:
- Cache velho. O score foi calculado, guardado, e o mundo mudou. A rede que aparece "saudável" na tela quebrou faz duas semanas; o número só não foi atualizado.
- Sinal faltante tratado como sinal bom. Se "sem tickets de suporte" e "não temos dado de tickets" caem no mesmo balde, uma rede sobre a qual você não sabe nada parece uma rede saudável. É o pior tipo de falso positivo.
- Peso que não corresponde à realidade do negócio. Um sinal tecnicamente disponível mas que, na prática, quase nunca é preenchido pode dominar a nota sem nunca ter sido a intenção.
A postura que a gente adotou: na dúvida, o score se declara incerto em vez de fingir certeza. É melhor mostrar "dados insuficientes para esta rede" do que emitir um 80 que ninguém deveria levar a sério.
Cadência de recálculo e a briga contra o cache velho
Score é dado vivo. Ele decai. E a maior fonte de desconfiança que a gente enfrentou não foi fórmula ruim — foi cache defasado.
O recálculo roda como um job agendado no Trigger.dev, recomputando a saúde das redes em lote, em ciclo. Simples no conceito, cheio de armadilha na prática:
- N+1 mata o cron. Recalcular rede por rede, uma query de cada vez, sobre milhares de redes, faz o job estourar o tempo. A saída foi paralelizar e buscar em lote em vez de serial. Um cron que timeouta é um cache que nunca atualiza — o pior dos mundos, porque parece que está funcionando.
- Trigger por linha desativado num reprocesso em massa já nos deixou com um cache silenciosamente velho: a maioria das notas parada, e ninguém sabendo. A correção foi repensar como o valor mais recente é materializado e atualizado a cada carga, em vez de depender de um gatilho frágil.
- A cadência é um tradeoff explícito. Recalcular de menos deixa o score velho; de mais desperdiça recurso e pode brigar com o pooler do banco. A frequência certa é a mais espaçada que ainda mantém a nota crível para quem age sobre ela.
O que isso ensina sobre construir com dados
Health score é um caso concreto de uma verdade mais geral: a qualidade de um número não está na fórmula, está na confiança que ele merece. E confiança se constrói com explicabilidade, com honestidade sobre incerteza, e com o dado estando fresco quando alguém olha.
Se você é o tipo de builder que se incomoda com um dashboard bonito sobre dado podre, que prefere mostrar "não sei" a chutar com confiança, e que entende que o cron das duas da manhã é tão parte do produto quanto a tela — esse é o tipo de problema que você vai encontrar aqui o tempo todo. A nota é a ponta visível. O que a sustenta é o trabalho invisível de merecer a confiança de quem depende dela.