Smart Booking
MVP⚡ Dor do Cliente
Problemas comuns em restaurantes sem um sistema de reservas
O cenário mais comum
A maioria dos restaurantes ainda gerencia reservas por WhatsApp, telefone e caderno. À medida que o movimento cresce, o processo quebra — e quem paga o preço é o cliente e a reputação do negócio.
Canais de atendimento sem resposta
WhatsApp, telefone e Instagram acumulam mensagens sem retorno. O cliente desiste silenciosamente e vai para a concorrência — sem que o restaurante perceba.
perda de receitaSem controle centralizado
Reservas anotadas em cadernos, planilhas ou na memória. A equipe não tem visibilidade, e overbooking ou mesas não preparadas viram rotina.
risco operacionalProcesso 100% manual e repetitivo
Confirmar, reagendar, lembrar e notificar são tarefas feitas uma a uma. Tempo e energia da equipe desperdiçados em tarefas que poderiam ser automatizadas.
ineficiência operacionalZero visibilidade sobre o negócio
Sem dados históricos, é impossível saber quais horários lotam, quais mesas rendem mais ou de onde vêm os clientes. Decisões baseadas em achismo.
sem dados para crescerO Smart Booking resolve exatamente isso
Painel centralizado para o admin, página pública para o cliente reservar sem friccão, e um agente de IA que atende no WhatsApp automaticamente — 24h por dia, 7 dias por semana.
🎯 Visão do Produto
O que é o Smart Booking e como funciona
Painel Admin
Área restrita para gerenciar perfil, mesas, reservas e relatórios.
adminPágina Pública
Vitrine com fotos, calendário e formulário de reserva. Sem login.
públicoAgente IA (n8n)
Atendimento no WhatsApp com consulta e notificações automáticas.
automaçãoFluxo — Reserva pela Página Pública
Cliente acessa a página pública do restaurante
URL: smartbooking.app/r/nome-do-restaurante
Seleciona data disponível no calendário
Apenas dias com vagas são clicáveis
Preenche nome, WhatsApp, horário e nº de pessoas
Sem necessidade de criar conta
Reserva criada — status definido pelo modo de aprovação configurado
Automático: confirmed direto · Manual: pending até o admin agir · Regras: depende da antecedência
Admin notificado via painel — ícone de sino 🔔 exibe badge com reservas pendentes
Notificação in-app; admin visualiza e age direto pelo painel
Admin aprova ou rejeita pelo painel
Cliente recebe confirmação ou rejeição via WhatsApp
Agente IA envia automaticamente
Consultar minhas reservas
Busca por número de WhatsApp — disponível na página pública
O cliente informa o número de WhatsApp usado no momento da reserva. O sistema retorna todas as reservas vinculadas a esse número, ordenadas da mais recente para a mais antiga, exibindo: data, horário, número de pessoas e status atual (pending · confirmed · rejected · cancelled).
Status possíveis de uma reserva
🏗 Arquitetura Técnica
Stack, repositórios e comunicação entre camadas
| Camada | Tecnologia | Justificativa |
|---|---|---|
| Frontend | React + Preline UI | Interface responsiva, componentes prontos, duas áreas no mesmo repo |
| Backend | Node.js + Express | API REST leve e de fácil manutenção |
| Banco de Dados | Supabase (PostgreSQL) | Gerenciado, autenticação nativa, Storage para fotos, SDK JS |
| Automação / IA | n8n + Agente IA | Orquestra fluxos de WhatsApp e webhooks |
| Fotos | Supabase Storage | Upload e CDN integrado |
Multi-tenant — um usuário, N restaurantes
Um único usuário admin pode gerenciar múltiplos restaurantes. Cada restaurante tem seu próprio slug, página pública, token de API e configurações independentes. O painel exibe um seletor para alternar entre os restaurantes da conta.
Dois tipos de token
JWT (login): Autenticação do admin no painel. Rotativo a cada sessão.
API Token (UUID fixo): Usado pelo agente IA via n8n. Garante isolamento multi-tenant — cada token só acessa dados do seu restaurante.
🗄 Banco de Dados
Modelo de dados — Supabase (PostgreSQL)
users
Admins — 1 user → N restaurants
restaurants
Perfil + token de API · owner_id FK → users
restaurant_settings
Modo de aprovação e regras
restaurant_photos
Galeria pública
tables
Mesas por restaurante
reservations
Log completo de reservas
Tabela: restaurant_settings
| Coluna | Tipo | Descrição |
|---|---|---|
restaurant_id | UUID FK | Referência ao restaurante |
approval_mode | ENUM | automanualrules |
approval_rules | JSONB nullable | Regras quando mode = rules · Ex: {"same_day":"manual","advance_hours":24,"advance_mode":"auto"} |
Tabela: reservations
| Coluna | Tipo | Descrição |
|---|---|---|
guest_name | VARCHAR(150) | Nome do cliente |
guest_whatsapp | VARCHAR(30) | WhatsApp para notificações e busca de status |
occasion | VARCHAR(30) nullable | aniversarioreuniaoromanticooutro |
observations | TEXT nullable | Observações livres do cliente — alergias, preferências, pedidos especiais |
source | VARCHAR(20) | public · agent · manual |
status | VARCHAR(20) | pendingconfirmedrejected |
approved_by | UUID FK nullable | Admin que aprovou/rejeitou |
notification_sent | BOOLEAN | Se a notificação in-app ao admin foi gerada |
🔌 Endpoints da API
Todas as rotas agrupadas por domínio
Autenticação
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| POST | /api/auth/register | Cadastro de novo admin | pública |
| POST | /api/auth/login | Login e retorno do JWT | pública |
| GET | /api/auth/me | Dados do usuário logado | JWT |
Reservas — Admin
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| GET | /api/reservations | Lista com filtros | JWT |
| POST | /api/reservations | Cria reserva manual | JWT |
| PATCH | /api/reservations/:id/approve | Aprova + dispara webhook n8n | JWT |
| PATCH | /api/reservations/:id/reject | Rejeita + dispara webhook n8n | JWT |
Agente IA (X-API-Token)
Rotas compartilhadas — autenticação diferenciada
Mesmas rotas da API admin, porém autenticadas via X-API-Token. O middleware identifica o contexto pelo tipo de token e filtra os dados pelo restaurante vinculado.
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| GET | /api/availability | Disponibilidade por data, hora e capacidade | X-API-Token |
| POST | /api/reservations | Registra reserva (respeita approval_mode do restaurante) | X-API-Token |
Pública (sem autenticação)
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| GET | /api/public/reservations?whatsapp={phone} | Todas as reservas do número, ordenadas por data DESC | pública |
Configurações — Admin
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| PUT | /api/admin/restaurants/:id/settings | Atualiza modo de aprovação e regras do restaurante | JWT |
📁 Repositórios
Estrutura de pastas e variáveis de ambiente
smart-booking-frontend
smart-booking-frontend/ └── src/ ├── components/ │ ├── NotificationBell.jsx │ └── RestaurantSelector.jsx │ ├── layouts/ │ ├── AdminLayout.jsx │ └── PublicLayout.jsx │ ├── pages/ │ ├── admin/ │ │ ├── Dashboard.jsx │ │ ├── Restaurant.jsx │ │ ├── Tables.jsx │ │ ├── Reservations.jsx │ │ └── Reports.jsx │ │ │ └── public/ │ └── RestaurantProfile.jsx │ ├── services/ ├── context/ └── hooks/
smart-booking-backend
smart-booking-backend/ └── src/ ├── config/ │ ├── middlewares/ │ ├── auth.js # JWT │ └── apiToken.js # X-API-Token │ ├── modules/ │ ├── auth/ │ ├── restaurant/ │ ├── tables/ │ ├── reservations/ │ ├── public/ │ ├── agent/ │ └── reports/ │ └── utils/ └── notifier.js
🌐 Página Pública
Vitrine + calendário + formulário de reserva
Header / Capa
Imagem, nome, endereço e horários.
Galeria
Grid de fotos gerenciadas pelo Supabase Storage.
Calendário
Dias disponíveis clicáveis, passados bloqueados.
Formulário
Nome, WhatsApp, horário, nº de pessoas. Sem login.
Confirmação
"Solicitação recebida! Aguarde confirmação."
Lógica de disponibilidade
Dias passados → bloqueados · Fora do horário de funcionamento → bloqueados · Todas as mesas ocupadas → indisponível · Ao menos um horário livre → clicável · Ao clicar, exibe os horários com vagas.
💬 Notificações
In-app para o admin · WhatsApp para o cliente
Nova reserva pendente → Admin notificado in-app
Ícone de sino no painel exibe badge com o total de reservas pendentes. Ao clicar, o admin acessa a lista e pode agir diretamente.
Admin aprova ou rejeita no painel
Ação no painel atualiza o status da reserva e dispara o retorno ao cliente.
Aprovada → Cliente recebe confirmação via WhatsApp
Agente IA envia mensagem com data, hora e informações do restaurante.
Rejeitada → Cliente recebe rejeição via WhatsApp
Agente IA envia mensagem com sugestão de nova data ou contato direto.
📊 Relatórios
Métricas operacionais para decisões baseadas em dados
Reservas por Período
Total no intervalo selecionado, separado por status.
Card + gráfico de linhaReservas por Status
Distribuição entre todos os status possíveis.
Gráfico de pizzaTaxa de Ocupação
% de ocupação de cada mesa no período.
Tabela + barra de progressoHorários de Pico
Concentração de reservas confirmadas por hora.
Gráfico de barrasOrigem das Reservas
% por origem: página pública, agente IA ou manual.
Gráfico de pizzaDashboard — Cards do dia
Reservas pendentes · Confirmadas para hoje · Concluídas no mês · Taxa de ocupação atual
🚀 Sprints
Desenvolvimento incremental com entregas testáveis
Sistema funcionando: admin gerencia mesas e reservas, aprova com modo configurável e recebe notificações in-app.
Autenticação: cadastro, login e proteção de rotas
Frontend + Backend
Perfil do restaurante: criar e editar dados básicos
Frontend + Backend
Geração e exibição do token de API
Backend
Cadastro, edição e desativação de mesas
Frontend + Backend
Listagem e criação manual de reservas pelo admin
Frontend + Backend
Aprovação e rejeição de reservas + configuração do modo de aprovação (automático, manual ou por regras)
Frontend + Backend
Notificação in-app ao admin — ícone de sino 🔔 com badge de reservas pendentes
Frontend + Backend
Notificação WhatsApp ao cliente — confirmação/rejeição via Agente IA
Backend + n8n
Clientes reservam pelo site. Agente IA atende no WhatsApp. Suporte a múltiplos restaurantes.
Página pública com informações e horários
Frontend + Backend
Galeria de fotos: upload pelo admin + exibição pública
Frontend + Backend + Supabase Storage
Calendário de disponibilidade na página pública
Frontend + Backend
Formulário de reserva sem login
Frontend + Backend
Consulta de histórico de reservas por WhatsApp na página pública (ordenado por data, mais recente primeiro)
Frontend + Backend
Suporte a múltiplos restaurantes por conta — seletor no dashboard
Frontend + Backend
Endpoints do agente IA + fluxo n8n completo
Backend + n8n
Métricas operacionais e melhorias baseadas no uso real.
Dashboard com cards de resumo do dia
Frontend + Backend
Relatórios: reservas, status, ocupação, pico e origem
Frontend + Backend
Refinamentos de UX e responsividade
Frontend
Preparar o produto para múltiplos restaurantes e monetização.
Landing page do Smart Booking
Frontend
Planos e assinaturas (gratuito, básico, premium)
Frontend + Backend
Onboarding guiado para novos restaurantes
Frontend
Exportação de relatórios em CSV
Backend