Founder · engenharia solo · construído em 2026, MVP rodando em stack publicada. O comercial de uma loja vive no WhatsApp, mas o WhatsApp não tem funil, não tem follow-up e não tem número. O Steadly é a camada comercial em cima: um pipeline kanban editável, leads com origem e temperatura, tarefas de follow-up e KPIs, tudo multi-tenant e com a marca de cada loja. É o produto companheiro do Ledio, meu SaaS de IA no WhatsApp: escrevi o dispatcher de saída do lado do Ledio justamente pra alimentar este CRM, então lead novo e negócio ganho circulam entre os dois automaticamente.
O que ele resolve
Uma concessionária vende pelo WhatsApp, então a conversa está em todo lugar e o funil não está em lugar nenhum. Ninguém sabe dizer quantos leads entraram na semana, quais esfriaram, nem quem deveria retornar hoje. O Steadly coloca uma camada comercial de verdade em cima: um funil kanban que a própria loja modela, leads com origem e temperatura, tarefas de follow-up que se adiam sozinhas todo dia quando não são feitas, e KPIs com snapshot por empresa e por vendedor.
O companheiro do Ledio
Steadly e Ledio são dois produtos meus que precisavam se encontrar no meio do caminho. O Ledio atende o WhatsApp com IA mas era puramente inbound: nunca avisava ninguém que um contato tinha nascido. Em vez de fazer o CRM ficar consultando, escrevi o dispatcher de saída dentro do próprio Ledio, então contato novo empurra pro Steadly. No sentido inverso, uma fila BullMQ empurra leads novos e negócios ganhos do CRM pro Ledio, e o CRM consegue mandar mensagem de WhatsApp direto de um negócio com o contexto de IA já preenchido a partir da etapa do funil.
O token nunca chega no JavaScript
O browser nunca fala com a API NestJS pra dado autenticado. O access token vive só num cookie httpOnly, rotacionado no refresh e removido antes de qualquer resposta chegar ao cliente, e toda chamada passa por um proxy BFF com allowlist de recursos que injeta o header Authorization e propaga um request id. O esqueci-minha-senha responde igual existindo ou não a conta, então o endpoint não vira um oráculo de enumeração de contas.
White-label sem um fork por cliente
Dez cores de marca do tenant são derivadas em cerca de 28 CSS custom properties, com acessibilidade embutida na derivação: contraste mínimo de 4.5, um foreground legível escolhido por superfície, e um focus ring verificado em 3:1. O onboarding consegue extrair a paleta direto do logo enviado, quantizando pixels num canvas no browser. Aplicar as cores do cliente às cegas produziria telas ilegíveis, então o tema é calculado, não copiado, e os módulos ligam por tenant via feature flag em vez de ramificar o código.
Realtime como sinal, não como dado
Os gateways de socket só emitem um sinal de invalidação; o cliente então invalida o cache do React Query e refaz o fetch pelo BFF autenticado. Nenhum dado de tenant trafega pelo socket, então existe exatamente um caminho autorizado até ele. O próprio kanban se move de forma otimista com dnd-kit e faz rollback quando a API recusa. Leads também chegam do Meta Lead Ads por OAuth por tenant e um webhook de leadgen, com um sync de recuperação via Graph API pros que o webhook perde.
- Onde guardar o token de sessão no frontend?Cookie httpOnly atrás de um proxy BFFSe o JavaScript consegue ler o token, qualquer XSS vira tomada de conta completa. Manter em cookie httpOnly elimina essa classe de ataque inteira. O custo é uma fricção real: todo recurso novo do backend precisa de entrada manual na allowlist do proxy, e o handshake do socket precisou de uma exceção controlada.
- Backend dentro do Next ou um serviço separado?NestJS separado em clean architectureMulti-tenancy, RBAC, filas e webhooks de entrada pedem um servidor de verdade, não route handlers; o Next fica com a UI e o BFF. O trade-off que doeu: dois deploys, dois repositórios, e um contrato duplicado no fake API contra o qual a suíte ponta a ponta roda, que mantenho sincronizado à mão.
- Como integrar com o Ledio se ele era só inbound?Escrever o dispatcher de saída dentro do LedioA premissa do MVP estava invertida: o Ledio nunca disparava webhook pra fora, então o CRM teria que ficar consultando. Como os dois códigos são meus, pagar por código novo do lado do Ledio comprou push confiável em vez de uma gambiarra de sync que apodreceria. O sentido de entrada é autenticado com assinatura HMAC e é idempotente por telefone normalizado.
- Empurrar todo lead novo pro WhatsApp automaticamente?Automático, mas com opt-in por lojaCriar um contato no Ledio dispara uma mensagem real de WhatsApp. Fazer isso silenciosamente pra todo lead metralharia o número da própria loja e é caminho direto pra ela ser banida, então cada loja opta explicitamente, não há reenvio, e o opt-out é respeitado.
- Realtime empurrando dado ou só invalidação?Só sinais, dado sempre pelo BFFDado de tenant deve ter exatamente um caminho autenticado e autorizado, e um payload de socket viraria silenciosamente um segundo. O custo é um round-trip a mais de refetch por evento, barato perto de auditar isolamento em dois lugares.
- Uma lib de i18n ou strings tipadas em código?Um objeto const tipado com funçõesO produto é pt-BR de locale único, então chave faltando deve ser erro de compilação e pluralização deve ser código testável, não convenção de template. Isso também torna estruturalmente impossível um placeholder não interpolado vazar pra tela. O trade-off: um segundo idioma significaria refatoração.
- Ago 2026Contexto de IA por etapa e rotação self-service do segredo
- Ago 2026Sincronia bidirecional com o Ledio e webhook de entrada verificado por HMAC
- Ago 2026E-mail transacional e a primeira conexão com o Ledio
- Jul 2026Redesign completo, bottom nav mobile, wizard de onboarding
- Jul 2026Meta Lead Ads com OAuth self-service e sync de recuperação
- Jul 2026BFF de auth e kanban drag-and-drop otimista
- Jul 2026Bootstrap: core multi-tenant, etapas, leads e negócios
Um MVP construído e publicado em 2026: um CRM white-label multi-tenant cujo tema é derivado do logo de cada cliente sob regras de contraste, cujo token de sessão nunca chega no JavaScript, e que é integrado nos dois sentidos com o Ledio pra que um lead nascido no WhatsApp caia no funil e um negócio ganho volte pra lá. O trabalho atual é endurecer essa integração e o contexto de IA carregado por etapa do funil.