Case 02 · SaaS para clínicas · 2025 – hoje
Dental Smart.
SaaS para clínicas odontológicas. Sou o engenheiro do produto desde 2025: multi-tenant com RLS, NFS-e, WhatsApp e transcrição de consultas com IA em produção.
Ficha técnica
- Papel
- Arquitetura, backend e IA
- Período
- 2025 – hoje
- Stack
- Next.js 16 · React 19 · Supabase · Postgres RLS · Edge Functions · Groq
- IA
- Em produção · Transcrição e resumo de consultas
- Clínicas
~20clínicas ativas
- Churn
0nenhuma clínica cancelou
- IA
fev/2026transcrição de consultas em produção
01 / Problema
A clínica inteira num sistema só.
RLSum tenant por clínica · isolado no banco
Clínicas odontológicas precisavam de agenda, financeiro, NFS-e e WhatsApp num só sistema. E cada clínica só pode ver os próprios dados, porque são dados de saúde de pacientes.
Conversei com dentistas, recepcionistas e auxiliares.
02 / Contexto
Do banco ao front.
O produto já existia quando assumi a engenharia. Tornei o produto multi-tenant, com um tenant por clínica, e sigo construindo hoje.
03 / Meu papel
Engenharia ponta a ponta.
Engenharia.
- SaaS multi-tenant em Next.js e Supabase, com isolamento por RLS
- Transcrição e resumo de consultas com Whisper e Llama
- Fila de mensagens de WhatsApp com variações geradas por LLM
- NFS-e via Focus NFe e assinatura de contrato por WhatsApp
- Admin do SaaS para provisionar clínicas
- CI no GitHub Actions e backup do banco no R2
Escopo.
- Agenda, pacientes e planos de tratamento
- Financeiro com DRE e CRM com funil no WhatsApp
- Estoque, próteses e relatórios
04 / Arquitetura
Isolamento no banco.
- Web appNext.js 16 · VercelAPI routesoperações privilegiadas
- SupabaseJWT do usuário · RLS por tenant_id
- Edge FunctionsDeno
- IntegraçõesWhatsApp · Focus NFe · Groq
Uma clínica, um tenant · backup pg_dump no R2
- Gravaçãobrowser
- Storagepor clínica
- Edge FunctionDeno
- WhisperGroq · transcrição
- Llama 3.3 70BGroq · resumo
- Resultadosalvo por clínica
Em produção desde fev/2026
05 / Onde a IA entra
Na consulta, não no dinheiro.
- Transcrição
- Em produçãoWhisper large-v3-turbo transcreve a gravação da consulta. Llama 3.3 70B resume. Os dois rodam na Groq.
- Mensagens
- Um LLM gera variações das mensagens de WhatsApp. O envio sai de uma fila agendada. Não é agente.
- Conciliação
- DecisãoPor regras, sem IA.
06 / Decisões e trade-offs
Onde a IA não entrou.
- 6.1Não usado
Conciliação sem IA.
Decidi não usar IA na conciliação bancária. Ela ficou em regras: autodetecção de colunas do CSV e dedupe. O import de OFX foi removido em abr/2026, por ser uma feature sem uso.
- 6.2
Isolamento na RLS.
Cada clínica é um tenant. O browser fala com o Supabase usando o JWT do usuário, e a RLS por tenant_id isola os dados no Postgres.
- 6.3
Privilégio só no servidor.
Gestão de usuários, assinatura de contrato, NFS-e e PDF passam por API routes do Next, com o client admin no servidor.
- 6.4
Variação de texto, não agente.
O LLM só reescreve a mensagem. Quem dispara o envio é uma fila com cron. Sem tool calling.
- 6.5Não construído
Radiografia fora do escopo.
A análise de radiografia não foi construída. Priorizamos o financeiro, que tinha demanda mais urgente.
07 / Resultado
Nenhuma clínica cancelou.
~20 clínicas ativas, cada uma num tenant isolado por RLS.
- IAEm produçãoTranscrição e resumo de consultas na Groq, desde fev/2026.