Voltar para a página inicial

Hora da Saída — Como construí um SaaS para acabar com o caos na saída escolar

Como desenvolvi uma plataforma SaaS completa para automatizar a saída escolar — eliminando filas, gritaria e insegurança nos portões. Neste devlog, compartilho a arquitetura com Fastify, BullMQ, Socket.io e React Native, as decisões técnicas por trás do processamento assíncrono de pickups, turmas temporárias, importação com IA e onboarding via WhatsApp.

Por Allison Verdam22 de julho de 20269 mins de leitura
react nativetypescriptSaaSDevlogFastifyReactNode.jsExpoPrismaWebSocketBullMQProjeto Pessoal

🏫 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:

  1. O sinal toca

  2. Pais se amontoam no portão

  3. Gritam o nome dos filhos

  4. Uma funcionária tenta identificar quem é quem no meio da confusão

  5. 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:

  1. A escola cadastra alunos, turmas, responsáveis e professores na plataforma

  2. Cada responsável é vinculado a seus filhos específicos — somente eles podem solicitar a retirada

  3. Quando chega na escola, o responsável abre o app e toca em "Solicitar Saída"

  4. O professor da turma recebe uma notificação instantânea (push + WebSocket)

  5. O professor prepara o aluno e marca como "Concluído"

  6. 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:

  1. Responsável solicita retirada → Request chega na API

  2. Validações → O sistema verifica: o responsável está vinculado a esse aluno? A assinatura está ativa? Já existe um pickup pendente?

  3. Job na fila → Em vez de processar na request, o pickup vai para o BullMQ. Isso mantém a resposta rápida e desacoplada

  4. Worker processa → Cria o registro no banco, emite evento WebSocket para a "room" da escola, e dispara push notification para os professores da turma

  5. 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 um activeClassId (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 a classId

  • Quando 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:

  1. O admin faz upload de uma planilha (.xlsx, .xls ou .csv) — pode ser a planilha que a escola já usa, sem formato específico

  2. O sistema parseia o arquivo com a lib xlsx e envia o conteúdo bruto para um webhook do n8n

  3. O n8n usa IA para interpretar os dados e retorna um JSON estruturado com turmas, alunos, responsáveis e staff

  4. O admin revisa os dados no frontend e confirma a importação

  5. 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. 🤙