CodeWolf ERP — Guia Completo
Sistema ERP modular e WhatsApp-first para micro e pequenas empresas. Gerencie agendamentos, clientes, financeiro e integrações de forma simples e conversacional.
Visão Geral
O CodeWolf ERP é uma plataforma multi-tenant onde cada empresa (tenant) possui seu próprio ambiente isolado de dados. O sistema é construído com foco em WhatsApp-first — os clientes interagem via WhatsApp e os gestores usam o painel web para configurações avançadas.
Stack Tecnológica
Framework full-stack com Server Components e Server Actions
Banco relacional com ORM typesafe e migrations
Autenticação moderna com sessões, roles e multi-tenant
Integração WhatsApp via Baileys — envio, recebimento e automações
Design system consistente com componentes acessíveis
Type safety end-to-end com validação de schemas em runtime
Manipulação de datas (ptBR) e notificações toast
Estrutura do Projeto
src/
├── app/
│ ├── (auth)/ # Grupo de rotas públicas
│ │ ├── login/
│ │ └── register/
│ ├── (dashboard)/ # Grupo de rotas protegidas
│ │ ├── dashboard/ # Overview + estatísticas
│ │ ├── clientes/ # CRM de clientes
│ │ ├── agenda/ # Agendamentos
│ │ ├── profissionais/ # Gestão de equipe
│ │ ├── servicos/ # Catálogo de serviços
│ │ ├── financeiro/ # Transações e fluxo de caixa
│ │ ├── whatsapp/ # Integração WhatsApp
│ │ └── configuracoes/ # Configurações da empresa
│ ├── api/
│ │ ├── webhook/evolution/ # Webhook da Evolution API
│ │ └── cron/
│ │ ├── reminders/ # Lembretes de agendamento
│ │ └── payment-reminders/ # Lembretes de pagamento
│ └── docs/ # Esta documentação
├── components/
│ ├── ui/ # Shadcn UI components
│ └── layout/ # Header, Sidebar
└── lib/
├── prisma.ts # Prisma client singleton
├── auth.ts # Better-Auth config
├── evolution-api.ts # Evolution API client
├── session.ts # Utilitários de sessão
└── utils.ts # Helpers gerais
prisma/
├── schema.prisma # Schema do banco de dados
└── seed.ts # Dados iniciaisConvenção por módulo
Cada página do dashboard segue a mesma estrutura modular:
(dashboard)/[modulo]/
├── page.tsx # Server Component — busca dados e passa para o Client
├── _data-access/
│ └── get-[modulo].ts # Funções de leitura do banco (server-only)
├── _actions/
│ └── [modulo]-actions.ts # Server Actions — mutações com Zod + revalidatePath
└── _components/
└── content.tsx # Client Component — UI interativaInstalação
Clone o repositório e instale as dependências
# Clone
git clone https://github.com/seu-usuario/codewolf-erp.git
cd codewolf-erp
# Instale as dependências
npm installConfigure as variáveis de ambiente
Copie o arquivo de exemplo e preencha com seus dados:
cp env.example .env.env contém credenciais sensíveis. Nunca o comite no Git. Ele já está no .gitignore.Configure o banco de dados PostgreSQL
Certifique-se de ter PostgreSQL rodando e defina a DATABASE_URL no .env:
DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/codewolf_erp?schema=public"Gere as tabelas e rode o seed inicial:
# Gera as tabelas no banco
npm run db:push
# Popula com dados iniciais (tenant demo + admin)
npm run db:seedInicie o servidor de desenvolvimento
npm run devAcesse http://localhost:3000 — será redirecionado para o login.
admin@demo.com e senha admin123. Troque imediatamente em produção!Banco de Dados
O schema foi desenhado com arquitetura multi-tenant via coluna — todos os modelos possuem tenantId como chave de isolamento.
Principais modelos
TenantEmpresa/negócio — raiz da hierarquia multi-tenantUserUsuários com roles: ADMIN, MANAGER, EMPLOYEE, VIEWERClientCRM de clientes com fidelidade, tags e históricoProfessionalProfissionais com agenda, comissão e serviços vinculadosServiceCatálogo de serviços com preço e duraçãoAppointmentAgendamentos com status, pagamento e notificaçõesTransactionFinanceiro: receitas, despesas, recorrênciasWhatsappInstanceInstância Evolution API por tenantWhatsappMessageHistórico de mensagens enviadas/recebidasNotificationLogLog de todas as notificações disparadasWorkingHoursHorários de funcionamento por dia da semanaComandos Prisma
# Gerar tabelas (desenvolvimento — sem migration files)
npm run db:push
# Criar migration (produção)
npm run db:migrate
# Regenerar Prisma Client após mudança no schema
npm run db:generate
# Abrir Prisma Studio (GUI visual)
npm run db:studio
# Popular banco com dados iniciais
npm run db:seedVariáveis de Ambiente
# ---- Banco de Dados (PostgreSQL) -------------------------
DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/codewolf_erp?schema=public"
# ---- Better-Auth ----------------------------------------
BETTER_AUTH_SECRET="string-aleatoria-minimo-32-caracteres"
BETTER_AUTH_URL="https://seu-dominio.com"
# ---- Next.js --------------------------------------------
NEXT_PUBLIC_APP_URL="https://seu-dominio.com"
NEXT_PUBLIC_APP_NAME="Nome do seu Sistema"
# ---- Evolution API (WhatsApp) ---------------------------
EVOLUTION_API_URL="https://sua-evolution-api.com"
EVOLUTION_API_KEY="sua-api-key-global"
EVOLUTION_WEBHOOK_SECRET="token-para-validar-webhook" # Opcional
# ---- Cron Jobs ------------------------------------------
CRON_SECRET="token-para-autenticar-crons"
# ---- E-mail (Opcional) ----------------------------------
SMTP_HOST="smtp.seu-provedor.com"
SMTP_PORT="587"
SMTP_USER="email@empresa.com"
SMTP_PASS="sua-senha"
SMTP_FROM="noreply@empresa.com"BETTER_AUTH_SECRETObrigatórioGere com: openssl rand -base64 32
CRON_SECRETObrigatórioQualquer string segura para autenticar as rotas /api/cron/*
EVOLUTION_API_KEYObrigatórioEncontrada nas configurações da sua instância Evolution API
EVOLUTION_WEBHOOK_SECRETOpcionalOpcional — adiciona camada de segurança no webhook
Evolution API (WhatsApp)
A Evolution API é uma API open-source baseada no Baileys que permite integração completa com o WhatsApp Web. Cada tenant cria sua própria instância e conecta via QR Code.
Fluxo de Conexão
Tenant acessa Painel → WhatsApp
Clica em 'Conectar WhatsApp'
Sistema chama POST /instance/create na Evolution API
Evolution retorna QR Code (base64)
Usuário escaneia com celular
Evolution dispara webhook CONNECTION_UPDATE (state: open)
Sistema salva status CONNECTED + número do celular
Notificações automáticas passam a funcionar
Mensagens automáticas disponíveis
sendAppointmentConfirmation()Enviada ao criar agendamentosendAppointmentReminder24h()Lembrete 24h antes — disparado pelo cronsendAppointmentReminder1h()Lembrete 1h antes — disparado pelo cronsendPaymentReminder()Cobrança de pagamentos pendentessendWelcomeMessage()Boas-vindas ao cadastrar novo clientesrc/lib/evolution-api.ts. Os números são normalizados automaticamente para o formato internacional: 5511999999999.Webhook WhatsApp
Endpoint que recebe eventos em tempo real da Evolution API:
POST https://seu-dominio.com/api/webhook/evolutionEventos tratados
QRCODE_UPDATEDSalva novo QR Code no banco para exibição em tempo realCONNECTION_UPDATEAtualiza status (CONNECTED, DISCONNECTED, CONNECTING)MESSAGES_UPSERTProcessa mensagens recebidas e aciona o botMESSAGES_UPDATEAtualiza status de entrega (DELIVERED, READ)Comandos do Bot WhatsApp-First
Quando um cliente manda mensagem, o bot responde automaticamente:
Cliente: "oi" → Bot exibe menu principal
Cliente: "1" → Lista de serviços disponíveis
Cliente: "2" → Próximos agendamentos do cliente
Cliente: "3" → Instruções para cancelar
Cliente: "0" → Transfere para atendente humanoConfigurar Webhook na Evolution API
# Via API (após criar a instância)
curl -X POST https://sua-evo.api.com/webhook/set/NOME_INSTANCIA \
-H "apikey: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://seu-dominio.com/api/webhook/evolution",
"enabled": true,
"events": ["MESSAGES_UPSERT", "CONNECTION_UPDATE", "QRCODE_UPDATED"]
}'Cron Jobs
Dois endpoints de cron que rodam automaticamente via vercel.json ou serviço externo (EasyCron, Render, etc):
GET /api/cron/remindersA cada horaEnvia lembretes de agendamento via WhatsApp para clientes dos tenants ativos.
- Lembretes 24h antes (janela de ±1h)
- Lembretes 1h antes (janela de ±5min)
- Marcação de enviado para evitar duplicatas
- Log salvo em NotificationLog
GET /api/cron/payment-remindersDiário 09hNotifica clientes sobre pagamentos pendentes e marca vencidos como OVERDUE.
- Pagamentos vencendo hoje → lembrete WhatsApp
- Pagamentos em atraso → atualiza status para OVERDUE
Segurança dos Crons
Todos os endpoints verificam o header Authorization: Bearer CRON_SECRET:
# Testar manualmente
curl -H "Authorization: Bearer SEU_CRON_SECRET" \
https://seu-dominio.com/api/cron/remindersvercel.json
{
"crons": [
{
"path": "/api/cron/reminders",
"schedule": "0 * * * *"
},
{
"path": "/api/cron/payment-reminders",
"schedule": "0 9 * * *"
}
]
}Módulos do Sistema
/dashboardOverview com KPIs: agendamentos do dia, receita, clientes ativos, taxa de ocupação
/clientesCadastro completo, tags, histórico de visitas, pontos de fidelidade, origem
/agendaCalendário de agendamentos, criação, edição, status e integração com WhatsApp
/profissionaisEquipe com comissão, cor no calendário, serviços vinculados e horários
/servicosCatálogo com preço, duração, categoria e ativação por serviço
/financeiroReceitas, despesas, status (pendente/pago/vencido), recorrências, relatórios
/whatsappConexão via QR Code, histórico de mensagens, configuração de notificações automáticas
/configuracoesDados da empresa, horários de funcionamento, equipe (usuários), senha e planos
Arquitetura Multi-tenant
O sistema usa multi-tenancy via coluna (Row-Level) — todos os dados compartilham o mesmo banco mas são isolados por tenantId.
Isolamento de dados
Cada query no servidor sempre filtra por tenantId — nenhum dado de uma empresa vaza para outra
Módulos plugáveis
Cada tenant pode ter moduleServices e moduleSales habilitados independentemente
Instância WhatsApp própria
Cada empresa tem sua própria instância na Evolution API, isolando completamente as comunicações
Planos e limites
O campo plan no Tenant controla acesso às funcionalidades premium (FREE, CORE, SERVICES, HYBRID, ENTERPRISE)
// src/app/(dashboard)/clientes/_data-access/get-clients.ts
export async function getClients() {
const tenantId = await getTenantId(); // ← pega da sessão autenticada
return prisma.client.findMany({
where: {
tenantId, // ← isolamento garantido
active: true,
},
orderBy: { name: "asc" },
});
}Deploy na Vercel
Crie um projeto na Vercel
Conecte o repositório GitHub na Vercel e ela detectará automaticamente o Next.js.
Configure as variáveis de ambiente
Em Settings → Environment Variables, adicione todas as variáveis do .env.
BETTER_AUTH_URL e NEXT_PUBLIC_APP_URL com o domínio de produção (ex: https://erp.suaempresa.com.br).Configure o banco de dados em produção
Use um PostgreSQL gerenciado (Neon, Supabase, Railway, ou seu próprio servidor):
# Execute as migrations no banco de produção
DATABASE_URL="postgresql://..." npx prisma migrate deploy
# Rode o seed (apenas na primeira vez)
DATABASE_URL="postgresql://..." npx tsx prisma/seed.tsConfigure o webhook da Evolution API
Após o deploy, configure a URL do webhook na Evolution API:
https://seu-dominio.vercel.app/api/webhook/evolutionCrons automáticos via vercel.json
O arquivo vercel.json já está configurado com os cron schedules. Eles serão ativados automaticamente no deploy.
CodeWolf ERP
MVP v0.1.0 — Modular • Multi-tenant • WhatsApp-First