Article image
Pedro Guimarães
Pedro Guimarães06/08/2026 16:03
Compartilhe

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

Compartilhe
Comentários (0)