Pular para o conteúdo

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.

3.1

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
3.2

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.

Fig. 01Multi-tenant
  1. Web appNext.js 16 · VercelAPI routesoperações privilegiadas
  2. SupabaseJWT do usuário · RLS por tenant_id
  3. Edge FunctionsDeno
  4. IntegraçõesWhatsApp · Focus NFe · Groq

Uma clínica, um tenant · backup pg_dump no R2

Fig. 02Transcrição e resumo
  1. Gravaçãobrowser
  2. Storagepor clínica
  3. Edge FunctionDeno
  4. WhisperGroq · transcrição
  5. Llama 3.3 70BGroq · resumo
  6. 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.

  1. 6.1
    Nã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.

  2. 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.

  3. 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.

  4. 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.

  5. 6.5
    Nã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.