🏫 Hora da Saída — Como construí um SaaS para acabar com o caos na saída escolar
Se você já foi buscar uma criança na escola, sabe exatamente do que eu estou falando: dezenas de pais e responsáveis aglomerados no portão, gritando nomes, empurrando, sem organização nenhuma. É barulho, é fila, é insegurança. Qualquer pessoa pode gritar o nome de uma criança e, na correria, ela sai.
Esse problema me incomodava há muito tempo. E foi aí que nasceu o Hora da Saída — uma plataforma SaaS que automatiza e torna seguro o processo de retirada de alunos em escolas e cursos extracurriculares.
Neste devlog, quero compartilhar as decisões técnicas, a arquitetura, os desafios e o estado atual do projeto.
🎯 O Problema
A saída escolar no Brasil (e em muitos lugares do mundo) funciona basicamente assim:
O sinal toca
Pais se amontoam no portão
Gritam o nome dos filhos
Uma funcionária tenta identificar quem é quem no meio da confusão
A criança sai — e torça para que seja realmente com o responsável certo
Os problemas são óbvios:
Segurança zero — Não há verificação de quem está buscando
Filas e aglomeração — Todo mundo chega ao mesmo tempo
Barulho — Literalmente uma gritaria de nomes
Estresse — Tanto para os pais quanto para professores e funcionários
💡 A Solução
Com o Hora da Saída, o fluxo muda completamente:
A escola cadastra alunos, turmas, responsáveis e professores na plataforma
Cada responsável é vinculado a seus filhos específicos — somente eles podem solicitar a retirada
Quando chega na escola, o responsável abre o app e toca em "Solicitar Saída"
O professor da turma recebe uma notificação instantânea (push + WebSocket)
O professor prepara o aluno e marca como "Concluído"
O responsável vê a atualização em tempo real no app
Sem filas. Sem gritaria. Com segurança.
🏗️ Arquitetura — 4 Módulos Independentes
O projeto é composto por 4 módulos, cada um com seu repositório/pasta independente:
1. Backend (API)
O coração do sistema. Uma API REST + WebSocket construída com:
Fastify 5 — Framework HTTP rápido e modular para Node.js
Prisma + PostgreSQL — ORM type-safe com um schema que modela toda a hierarquia escola → turma → aluno → responsável
Socket.io — WebSocket para atualizações em tempo real (cada escola é uma "room")
BullMQ + Redis — Filas de jobs assíncronos para pickup processing, emails, pagamentos e exclusão de contas
Argon2 — Hash de senhas (mais seguro que bcrypt)
Zod 4 — Validação de schemas em runtime
A autenticação usa JWT com access token (15min) + refresh token (30 dias), incluindo proteção brute-force: após 5 tentativas falhas, a conta é bloqueada por 15 minutos.
2. App Mobile (React Native + Expo)
O app que os responsáveis, professores e administradores usam no dia a dia:
React Native 0.83 + Expo SDK 55 — Cross-platform com suporte a web
Zustand — Estado global leve e reativo
Push Notifications — Professores recebem alertas instantâneos quando um responsável solicita retirada
WebSocket — Tudo atualiza em tempo real, sem precisar dar refresh
O app também funciona como PWA-like no navegador, com um container estilo mobile para que a versão web tenha a mesma experiência.
3. Web Admin (React + Vite)
O painel de administração onde a escola gerencia tudo:
React 19 + Vite 8 — Build instantâneo e DX excelente
React Router 7 — Rotas protegidas por role (ADMIN, TEACHER, etc.)
Páginas completas: Dashboard, CRUD de Alunos/Turmas/Responsáveis/Professores, Billing, Importação em Massa, Painel de TV
Landing Page integrada — O mesmo domínio serve tanto o site público quanto o painel admin
4. OTA Server
Um servidor Express simples que gerencia atualizações Over-The-Air para o app mobile via expo-updates. Permite publicar correções e melhorias sem depender de aprovação da App Store/Play Store.
⚡ O Fluxo de Pickup por Dentro
Esse é o fluxo core do sistema e onde as decisões técnicas mais interessantes estão:
Responsável solicita retirada → Request chega na API
Validações → O sistema verifica: o responsável está vinculado a esse aluno? A assinatura está ativa? Já existe um pickup pendente?
Job na fila → Em vez de processar na request, o pickup vai para o BullMQ. Isso mantém a resposta rápida e desacoplada
Worker processa → Cria o registro no banco, emite evento WebSocket para a "room" da escola, e dispara push notification para os professores da turma
Professor atualiza status → WAITING → COMPLETED. Novo evento WebSocket atualiza todos os clientes conectados
A decisão de usar filas para o processamento de pickups foi crucial. No horário de saída, dezenas de responsáveis solicitam ao mesmo tempo. Sem fila, a API ficaria sobrecarregada. Com BullMQ, cada solicitação é processada de forma ordenada e resiliente.
🎓 Turmas Temporárias — Uma Feature que Fez Diferença
Uma situação real: o aluno está na turma do 3º ano, mas naquele momento está na aula de educação física com outro professor. Se o responsável solicita a retirada, quem recebe a notificação?
Para resolver isso, criamos o conceito de turmas temporárias:
O aluno tem uma
classId(turma permanente) e umactiveClassId(turma temporária)O professor de educação física "puxa" os alunos para sua turma temporária
As notificações de pickup vão para os professores da
activeClassId(se existir), senão para aclassIdQuando o pickup é concluído, o
activeClassIdé resetado automaticamente
Parece simples, mas essa feature elimina a confusão de "o aluno não está na sala" que acontece diariamente em escolas reais.
📊 Modelo de Negócio — SaaS com Trial
O Hora da Saída opera com um modelo SaaS em 3 planos:
Starter (R$ 149/mês) — Até 100 alunos
Escolar (R$ 249/mês) — Até 300 alunos
Premium (R$ 349/mês) — Alunos ilimitados
Toda escola começa com 15 dias de trial grátis. O pagamento é processado via Asaas (gateway brasileiro), e toda a integração — criação de clientes, assinaturas, upgrades — é feita assincronamente via BullMQ para não bloquear o fluxo de cadastro.
🤖 Importação com IA — De Planilha para Sistema em Minutos
Um dos maiores atritos para a adoção de qualquer sistema escolar é a migração de dados. Nenhuma escola quer cadastrar 300 alunos manualmente.
Para resolver isso, criei uma importação inteligente com IA:
O admin faz upload de uma planilha (.xlsx, .xls ou .csv) — pode ser a planilha que a escola já usa, sem formato específico
O sistema parseia o arquivo com a lib
xlsxe envia o conteúdo bruto para um webhook do n8nO n8n usa IA para interpretar os dados e retorna um JSON estruturado com turmas, alunos, responsáveis e staff
O admin revisa os dados no frontend e confirma a importação
Tudo é inserido no banco em uma única transação
A IA entende planilhas nos mais diversos formatos — com headers diferentes, colunas fora de ordem, dados misturados. Isso elimina a necessidade de um "template de importação".
🔐 Segurança e LGPD
Como lidamos com dados de menores, a segurança é prioridade:
Argon2 para hash de senhas (resistente a ataques de GPU)
Rate limiting em todas as rotas (500 req/min global, 5/hora para registro e 3/hora para recuperação de senha)
Helmet para headers de segurança
Brute-force protection com lock de 15 minutos após 5 tentativas
Exclusão de conta LGPD completa: solicitação → confirmação por email → período de arrependimento → exclusão definitiva via worker assíncrono
Consentimento rastreado com timestamp de aceite dos termos
📱 Onboarding via WhatsApp
Uma decisão de produto que impactou muito a adoção: em vez de enviar email para os responsáveis (que muitos não checam), o admin gera um setup-link e envia via WhatsApp.
O responsável recebe uma mensagem do tipo: "Olá! A escola X está usando o Hora da Saída. Clique aqui para configurar sua senha e começar a usar". O link leva para a página de reset de senha, e pronto — a pessoa já está no sistema.
Isso é muito mais efetivo que email para o público-alvo (pais brasileiros), e custou zero em infraestrutura de messaging.
📺 Painel de TV — A Cereja do Bolo
Muitas escolas têm uma TV na recepção ou na sala dos professores. O Hora da Saída tem uma rota dedicada /tv que exibe as solicitações de retirada ativas em tela cheia, atualizando em tempo real via WebSocket.
O professor olha para a TV, vê que chegou um responsável para buscar o João da turma 3A, e já prepara o aluno. Sem celular, sem distração, sem esquecer.
🛠️ Stack Completo
Para quem é dev e quer os detalhes técnicos, aqui vai o stack completo:
🚀 Próximos Passos
O projeto está funcional e em uso, mas tem muito pela frente:
Histórico de pickups — Relatórios detalhados para a gestão escolar
QR Code na chegada — Responsável escaneia um QR no portão para solicitar ainda mais rápido
App nativo na loja — Publicar nas stores (hoje roda via Expo Go e web)
Integração com sistemas escolares — Importar dados automaticamente de ERPs educacionais
Multi-idioma — Expandir para outros países
💬 Conclusão
O Hora da Saída nasceu de uma frustração real e evoluiu para um SaaS completo com autenticação robusta, processamento assíncrono, tempo real via WebSocket, push notifications, importação com IA e muito mais.
Se você é dono de escola, coordenador pedagógico, ou conhece alguém que sofre com a saída escolar — me chama. Estou buscando as primeiras escolas parceiras para validar e refinar o produto.
E da uma olhada no nosso site: https://horadasaida.app/
E se você é dev e curtiu a arquitetura, sinta-se à vontade para trocar ideia nos comentários. Adoro discutir decisões técnicas. 🤙