01

⚡ 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 receita
📋

Sem 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 operacional
🔁

Processo 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 operacional
📊

Zero 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 crescer
🎯

O 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.

02

🎯 Visão do Produto

O que é o Smart Booking e como funciona


3
Frentes integradas
4
Sprints planejadas
100%
Reservas automatizadas
Restaurantes
🖥

Painel Admin

Área restrita para gerenciar perfil, mesas, reservas e relatórios.

admin
🌐

Página Pública

Vitrine com fotos, calendário e formulário de reserva. Sem login.

público
🤖

Agente IA (n8n)

Atendimento no WhatsApp com consulta e notificações automáticas.

automação

Fluxo — Reserva pela Página Pública

1

Cliente acessa a página pública do restaurante

URL: smartbooking.app/r/nome-do-restaurante

2

Seleciona data disponível no calendário

Apenas dias com vagas são clicáveis

3

Preenche nome, WhatsApp, horário e nº de pessoas

Sem necessidade de criar conta

4

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

5

Admin notificado via painel — ícone de sino 🔔 exibe badge com reservas pendentes

Notificação in-app; admin visualiza e age direto pelo painel

6

Admin aprova ou rejeita pelo painel

7

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

pending confirmed rejected cancelled completed
03

🏗 Arquitetura Técnica

Stack, repositórios e comunicação entre camadas


CamadaTecnologiaJustificativa
FrontendReact + Preline UIInterface responsiva, componentes prontos, duas áreas no mesmo repo
BackendNode.js + ExpressAPI REST leve e de fácil manutenção
Banco de DadosSupabase (PostgreSQL)Gerenciado, autenticação nativa, Storage para fotos, SDK JS
Automação / IAn8n + Agente IAOrquestra fluxos de WhatsApp e webhooks
FotosSupabase StorageUpload 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.

04

🗄 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

ColunaTipoDescrição
restaurant_idUUID FKReferência ao restaurante
approval_modeENUM
automanualrules
approval_rulesJSONB nullableRegras quando mode = rules · Ex: {"same_day":"manual","advance_hours":24,"advance_mode":"auto"}

Tabela: reservations

ColunaTipoDescrição
guest_nameVARCHAR(150)Nome do cliente
guest_whatsappVARCHAR(30)WhatsApp para notificações e busca de status
occasionVARCHAR(30) nullable
aniversarioreuniaoromanticooutro
observationsTEXT nullableObservações livres do cliente — alergias, preferências, pedidos especiais
sourceVARCHAR(20)public · agent · manual
statusVARCHAR(20)
pendingconfirmedrejected
approved_byUUID FK nullableAdmin que aprovou/rejeitou
notification_sentBOOLEANSe a notificação in-app ao admin foi gerada
05

🔌 Endpoints da API

Todas as rotas agrupadas por domínio


Autenticação

MétodoRotaDescriçãoAuth
POST/api/auth/registerCadastro de novo adminpública
POST/api/auth/loginLogin e retorno do JWTpública
GET/api/auth/meDados do usuário logadoJWT

Reservas — Admin

MétodoRotaDescriçãoAuth
GET/api/reservationsLista com filtrosJWT
POST/api/reservationsCria reserva manualJWT
PATCH/api/reservations/:id/approveAprova + dispara webhook n8nJWT
PATCH/api/reservations/:id/rejectRejeita + dispara webhook n8nJWT

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étodoRotaDescriçãoAuth
GET/api/availabilityDisponibilidade por data, hora e capacidadeX-API-Token
POST/api/reservationsRegistra reserva (respeita approval_mode do restaurante)X-API-Token

Pública (sem autenticação)

MétodoRotaDescriçãoAuth
GET/api/public/reservations?whatsapp={phone}Todas as reservas do número, ordenadas por data DESCpública

Configurações — Admin

MétodoRotaDescriçãoAuth
PUT/api/admin/restaurants/:id/settingsAtualiza modo de aprovação e regras do restauranteJWT
06

📁 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
07

🌐 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.

08

💬 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.

09

📊 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 linha
🥧

Reservas por Status

Distribuição entre todos os status possíveis.

Gráfico de pizza
🪑

Taxa de Ocupação

% de ocupação de cada mesa no período.

Tabela + barra de progresso
🕐

Horários de Pico

Concentração de reservas confirmadas por hora.

Gráfico de barras
🔀

Origem das Reservas

% por origem: página pública, agente IA ou manual.

Gráfico de pizza
🖥

Dashboard — Cards do dia

Reservas pendentes · Confirmadas para hoje · Concluídas no mês · Taxa de ocupação atual

10

🚀 Sprints

Desenvolvimento incremental com entregas testáveis


SPRINT 1 MVP Core — Painel Admin + Reservas + Notificações 🎯 MVP

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

SPRINT 2 Página Pública + Agente IA no WhatsApp 🌐 público

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

SPRINT 3 Relatórios + Refinamentos de UX 📊 dados

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

SPRINT 4 Escalabilidade SaaS + Modelo de Assinatura 💰 SaaS

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