← todos os projetos
no ar2025projeto pessoal

BeautyLink

agendamento online para salões

SaaS multi-tenant onde cada salão ganha uma página pública própria com serviços, galeria e agendamento, mais um painel administrativo completo.

0
banco para todos os tenants
0
telas administrativas
0
níveis de acesso
o problema

salão pequeno agenda por mensagem e caderno: horário some, cliente esquece, e não existe uma página própria para mostrar serviços, preços e trabalhos feitos.

a solução

cada salão tem um endereço próprio dentro da plataforma, com página pública gerada a partir do que ele mesmo cadastra, e agendamento que respeita a agenda real de cada profissional. do outro lado, um painel com agenda, serviços, clientes, produtos, galeria e disparo de mensagens.

arquitetura

como as peças se conectam

  1. Navegador
    página pública e painel
  2. Nginx
    HTTPS e proxy
  3. Next.js
    telas e rotas de API
  4. PostgreSQL
    um banco, tenant por endereço
módulos — 5

o que existe dentro

Página pública

no ar

vitrine por endereço próprio: serviços, preços, galeria, banner e agendamento online.

Agenda

no ar

slots calculados por profissional, serviço e duração, com bloqueio de horário ocupado.

Cadastros

no ar

profissionais, serviços, produtos e clientes.

Disparos

no ar

envio de lembretes e campanhas pela integração de mensageria.

Superadmin

no ar

gestão dos tenants e métricas de uso da plataforma.

stack

o que foi usado

Next.js 14React 18TypeScriptPostgreSQLJWT (jose)bcryptsharp
decisões — 3

decisões técnicas e o porquê

multi-tenant compartilhado

um banco só, com o tenant resolvido pelo endereço da página. mais simples de operar e de custear do que um banco por cliente.

imagem processada no upload

redimensionamento e compressão com sharp na entrada, para não servir foto de celular crua na página pública.

sessão em JWT assinado

sem tabela de sessão: o token carrega o tenant e o papel, e a verificação acontece na borda.

aprendizado

o que ficou

  • multi-tenant compartilhado é simples até a primeira consulta esquecer o filtro de tenant — o filtro tem que morar na camada de acesso a dados, nunca na tela.
  • a parte difícil de agendamento não é gravar o horário, é calcular os slots livres: duração do serviço, jornada do profissional e intervalos precisam ser uma função só.
← todos os projetospróximo projetoGround Zero