Seguranca e Conformidade

Dados de pacientes exigem responsabilidade. O DentFlow foi construído com isso.

Clinicas que enviam mensagens de WhatsApp para pacientes sem consentimento documentado estao expostas a sancoes da ANPD. O DentFlow trata os dois problemas como nao-negociaveis.

Consentimento LGPD automatizado para todos os pacientes
Isolamento multi-tenant enforced em nível de banco de dados (RLS)
Revogacao imediata por palavra-chave (PARAR, STOP, SAIR)
API oficial Meta (sem BSP intermediario)
Exportacao de dados de pacientes disponível (Art. 18 LGPD)

Nenhum dado de paciente é processado sem consentimento documentado.

Na primeira mensagem de qualquer paciente novo, o DentFlow envia automaticamente uma solicitacao de consentimento conforme a Lei 13.709/2018. O paciente precisa responder com uma palavra-chave de aceitacao antes que qualquer dado seja armazenado ou processado.

O consentimento é registrado com timestamp por paciente, por clínica.

Revogacao imediata

Se o paciente enviar PARAR, STOP, SAIR, CANCELAR, UNSUBSCRIBE ou DESCADASTRAR a qualquer momento, o DentFlow revoga o consentimento imediatamente, envia uma confirmacao de descadastramento e para todo processamento automatico. Sem delay. Sem intervencao humana.

Fluxo de consentimento - primeiro contato
1
Paciente envia primeira mensagem no WhatsApp
"Para continuar, precisamos do seu consentimento conforme a Lei 13.709/2018. Responda SIM para aceitar o tratamento de dados."
2
Paciente responde SIM
3
Consentimento registrado com timestamp. IA inicia atendimento normal.

Os dados de uma clínica nunca aparecem para outra.

O DentFlow é uma plataforma multi-tenant: cada clínica é um tenant isolado com um ID próprio que está em todas as tabelas do banco de dados. Políticas de Row-Level Security (RLS) no Supabase garantem em nível de banco que uma consulta de qualquer clínica nunca retorna dados de outra.

O isolamento é enforced no banco, nao apenas no código da aplicacao. Permissoes de execucao de funcoes sensíveis foram auditadas e corrigidas em múltiplos ciclos durante o desenvolvimento.

Arquitetura de isolamento
Clinica A - Dr. Carlos
clinic_id: uuid-a / pacientes, agenda, financeiro isolados
RLS enforced no banco de dados
Clinica B - Dra. Fernanda
clinic_id: uuid-b / sem acesso aos dados da Clinica A
dentflow.app/clinic-admin/settings/team
Equipe e Permissoes
Usuario
Papel
Status
MR
Mauricio Resendi
mauricio@clinicateste.com
Administrador
Ativo
AG
Agnoelson
agnoelson@clinicateste.com
Dentista
Ativo
JE
Jessica
jessica@clinicateste.com
Dentista
Ativo
AN
Ana - Recepcionista
ana@clinicateste.com
Recepcionista
Ativo

Configuracao de papeis e permissoes por usuario

Cada pessoa na clínica ve apenas o que precisa ver.

O DentFlow tem seis perfis de acesso, com permissoes enforced no servidor - nao é possível acessar dados fora do próprio escopo mesmo com manipulacao do browser. O clinic_id de cada sessao e resolvido do cookie de autenticacao no servidor, nunca do corpo da requisicao.

Administrador
Acesso completo - agenda, pacientes, financeiro, equipe, configuracoes
Dentista
Propria agenda e prontuarios. Sem acesso financeiro.
Recepcionista
Agenda e pacientes. Sem dados financeiros.
Assistente
Agenda e atendimento basico.
Sales
Representante comercial da plataforma. clinic_id=null. Ve apenas prospects atribuídos a si. Zero acesso a dados de clínicas.
Platform Admin
Wagner e equipe DentFlow. Acesso a todas as clínicas, painel de custo de IA, logs de email, ajuste de créditos. Nunca exposto a pacientes.

Auditoria de créditos - append-only.

A tabela de auditoria de ajustes de créditos nao tem UPDATE nem DELETE permitido por política. Todo ajuste manual gera um registro permanente com: quem fez, quando, qual clínica, qual pool (IA ou campanha), qual o delta e qual a justificativa.

Nao é possível apagar esse historico.

WhatsApp via API oficial Meta.

A integracao de WhatsApp do DentFlow é feita diretamente com a Meta WhatsApp Business Cloud API - nao ha um BSP intermediario adicionando camadas de custo e risco.

Cada mensagem enviada passa por verificacao de assinatura HMAC-SHA256 para garantir que o webhook é genuíno.

dentflow.app/clinic-admin/settings/whatsapp
Configuracoes WhatsApp
Conectado via Meta Business Cloud API
Numero verificado e ativo
Ativo
Phone Number ID
108xxxxxxxxxxxxx
Numero exibido
+55 11 99999-0000
Checklist de configuracao
Meta Business Manager configurado
Webhook configurado e verificado
Templates aprovados pela Meta

Painel de configuracao de WhatsApp - status da conexao Meta Business API

Mecanismos tecnicas de seguranca

Decisoes de engenharia que protegem clínicas e pacientes, nao apenas conformidade formal.

RPC atomica de créditos

consume_credits() - sem race condition

O debito de créditos é feito por uma funcao RPC no banco (SECURITY DEFINER, search_path fixo). Nao é possível debitar duas vezes o mesmo saldo em requisicoes concorrentes. Sem essa garantia, dois Webhooks Meta chegando ao mesmo tempo poderiam debitar saldo duas vezes.

Webhooks idempotentes

Meta e Stripe - deduplicacao por ID

Mensagens do Meta tem um message_id unico. Se o Meta reenviar a mesma mensagem (retry automatico), o segundo webhook retorna 200 silenciosamente sem reprocessar. O mesmo padrao e aplicado aos eventos Stripe via stripe_events.status. Previne cobrancas duplas e mensagens duplicadas.

Cron fail-closed

CRON_SECRET ausente = HTTP 500, nao execucao

Todos os endpoints de cron verificam o CRON_SECRET antes de executar. Se a variavel de ambiente estiver ausente no servidor, o endpoint retorna HTTP 500 com log [CRON_AUTH_MISCONFIG] em vez de falhar aberto. Um env var faltando nao deixa o endpoint publico.

Gate de saldo pre-chamada

IA bloqueada com saldo menor que 5 créditos

Antes de cada chamada de IA, o webhook verifica o saldo do Pool IA. Se o saldo for menor que 5 créditos, a conversa e encaminhada para atendimento humano e um escalamento e registrado. A OpenAI nunca e chamada com saldo insuficiente.

Protecoes de entrada

Rate limit de onboarding + limite de audio

No maximo 10 mensagens de onboarding por clínica por hora (previne abuso de numeros desconhecidos). Audios maiores de 8 MB sao rejeitados antes do download com resposta PT-BR ao paciente. Previne esgotamento de memoria no servidor e custo de transcricao nao autorizado.

Criptografia e rastreabilidade

AES-256 em repouso + Langfuse on-premise

Dados armazenados no Supabase (AWS ap-southeast-1) com AES-256 KMS gerenciado pela AWS. Todos os prompts e respostas de IA sao rastreados em instancia propria do Langfuse (langfuse.wolfactionstudio.com) - sem SaaS de terceiros recebendo dados de conversas de pacientes alem da OpenAI para inferencia.

Tabelas de auditoria que voce pode inspecionar.

O DentFlow mantém logs estruturados de todas as operacoes sensíveis. Clínicas podem solicitar exportacao de seus dados (Art. 18 LGPD) a qualquer momento.

Tabela O que registra Retencao Permite DELETE?
credit_adjustments Cada ajuste manual de créditos: quem fez, quando, pool, delta, razao Permanente Nao (append-only por política RLS)
ai_interaction_logs Cada chamada de IA: tipo, tokens, custo USD, modelo, duracao de audio (se transcricao) 90 dias Nao (sem politica de delete para usuarios)
whatsapp_lgpd_consents Consentimento por paciente: concedido_em, revogado_em, canal Permanente Nao
whatsapp_escalations Escalamentos para humano: intent, quem resolveu, quando 90 dias Nao
stripe_events Cada evento Stripe com status de processamento (deduplicacao de cobrancas) 90 dias (auto-cleanup) Apenas por cron autorizado
n8n_error_log Erros de automacoes externas com contexto sanitizado (sem dados de pacientes) 30 dias Nao

LGPD tratada automaticamente. Seus pacientes protegidos desde o primeiro dia.

Agende uma demo com a equipe DentFlow.

Agendar demo