BH Agendamentos: Construí uma solução Saas de agendamento escalável com Ruby on Rails e PostgreSQL
- #Ruby
- #PostgreSQL
- #Redis
- #RubyGems
A gestão de horários para pequenos e médios negócios — como barbearias, pet shops e clínicas — ainda enfrenta gargalos operacionais: dependência de mensagens manuais no WhatsApp, sobreposição de horários e falta de visibilidade do fluxo de caixa.
Para resolver esse problema de forma eficiente e enxuta, desenvolvi o BH Agendamentos, uma aplicação SaaS focada na gestão automatizada de serviços e agendamentos locais.
Neste artigo, compartilho as principais decisões de arquitetura, o stack utilizado e as lições aprendidas ao colocar o projeto em produção.
🛠️ O Stack Tecnológico
A escolha do stack priorizou produtividade no desenvolvimento, estabilidade em produção e baixo custo operacional:
Ruby on Rails: Escolhido pela maturidade e velocidade para estruturar regras de negócio complexas com convenção sobre configuração.
PostgreSQL: Banco de dados relacional para garantir consistência e integridade transacional (crucial para evitar double booking).
Sidekiq + Redis: Para processamento assíncrono de tarefas em segundo plano (como envio de notificações e lembretes).
Render: Infraestrutura de hospedagem para deploy contínuo da aplicação e banco de dados.
🏗️ Desafios Técnicos e Soluções de Engenharia
1. Prevenção de Concorrência e Double Booking
O maior desafio em um sistema de agendamentos é garantir que dois clientes não consigam reservar o mesmo profissional na mesma fração de segundo.
Solução: Além das validações no model do Rails, implementei restrições de unicidade e travas no nível do banco de dados PostgreSQL (database lock / unique indexes combinando prestador_id, data e horario). Isso garante integridade mesmo em requisições concorrentes.
2. Processamento Assíncrono para Lembretes
Enviar notificações na mesma thread da requisição HTTP do usuário causa lentidão na interface.
Solução: Utilizei o Sidekiq para desacoplar tarefas pesadas. Quando um agendamento é criado, um job é enfileirado para processamento assíncrono, liberando a resposta HTTP para o cliente em milissegundos.
3. Modelagem de Dados Flexível
Diferentes estabelecimentos possuem diferentes jornadas de trabalho, durações de serviço e intervalos. A modelagem precisava atender essa variação sem gerar código duplicado.
Solução: Desenvolvi uma estrutura de tabelas de horários de funcionamento vinculadas ao perfil do prestador. A interface calcula dinamicamente os slots disponíveis cruzando a duração do serviço selecionado com os horários de expediente e os agendamentos já confirmados no banco, garantindo flexibilidade total sem hardcode.
💡 O que aprendi no processo
Monólito Primeiro: Optar por um monólito bem estruturado em Rails permitiu iterar rápido sem a complexidade desnecessária de microsserviços nesta fase.
Validação no Banco importa: Nunca confie apenas na camada de aplicação para regras de concorrência. O PostgreSQL é seu melhor amigo para garantir consistência.
Foco no Problema Real: Um SaaS eficiente para negócios locais precisa ser ultra simples para o cliente final agendar em poucos cliques.
🚀 Próximos Passos
O BH Agendamentos segue em evolução contínua. As próximas implementações incluem:
Integração direta com gateways de pagamento para sinal de reserva.
Dashboard analítico de faturamento mensal para os estabelecimentos.
Notificações ativas via integração com API do WhatsApp.
O projeto está em produção e você pode conferir o código e a arquitetura no meu GitHub!
https://github.com/Peuvictor/bh_agendamentos



