- TypeScript 53.9%
- Python 36.8%
- CSS 8.3%
- Dockerfile 0.8%
- JavaScript 0.2%
| Nome de arquivo | Última mensagem de commit | Última data de commit |
|---|---|---|
Substitui o README anterior por documentacao real e verificada do codigo: stack com versoes, arquitetura, funcionalidades, como rodar e variaveis de ambiente (apenas nomes). Preparatorio para migracao do repositorio do GitLab (evolx.mkt) para a organizacao BLITZAP no OmniGit. |
||
| .claude | ||
| public | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| CLAUDE.md | ||
| Dockerfile | ||
| next-env.d.ts | ||
| next.config.mjs | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
Blitzap Quiz — Diagnóstico de Risco de Bloqueio no WhatsApp
Quiz interativo de diagnóstico que avalia o risco de uma operação de disparo em massa ser bloqueada pelo WhatsApp. Funciona como gerador de leads para o funil de vendas do Blitzap: o responde as 7 perguntas, informa um contato (telefone ou e-mail) no gate de captura e recebe um resultado personalizado por faixa de risco, com CTAs para a landing page e para o WhatsApp comercial.
Sobre
- Quiz de 7 perguntas sobre infraestrutura de disparo: tipo de conexão, volume mensal, controle de velocidade, redundância de rota, monitoramento em tempo real, histórico de bloqueio e validação de números.
- Score máximo de 130 pontos; quanto maior a pontuação, maior o risco.
- Resultado em 4 faixas (bands) com leitura personalizada e bloco de contexto sobre as diretrizes da Meta.
- Todo lead fica salvo em banco PostgreSQL e pode ser acompanhado no painel admin integrado.
- Não há integração direta com a API do aplicativo principal do Blitzap — a ponte com outros sistemas é feita via webhook assinado (ver Integrações).
Stack
| Camada | Tecnologia |
|---|---|
| Framework | Next.js 14.2.29 (App Router, output: 'standalone') |
| UI | React 18.3.1, TypeScript, Tailwind CSS 3 + CSS Modules |
| Banco | PostgreSQL via pg 8.13 (pool singleton) |
| Auth admin | jsonwebtoken (JWT de 24h em cookie auth_token HttpOnly) + bcryptjs (hash cost 12) |
nodemailer (SMTP configurável pelo admin) |
|
| Build/infra | Docker multi-stage node:18-alpine, tsx para scripts |
Base de código enxuta: 30 arquivos TS/TSX (~2,2 mil linhas) em src/ e scripts/.
Identidade visual: dark mode exclusivo, azul #2563EB + verde #06D6A0, fontes Syne (títulos) e DM Sans (texto).
Fluxo do quiz
-
Intro — apresentação do diagnóstico e início.
-
7 perguntas (
src/lib/quiz-data.ts), cada opção com pontuação:# Pergunta (id) Pontos máx. 1 Tipo de conexão ( connection)30 2 Volume mensal de disparos ( volume)15 3 Controle de velocidade ( speed)20 4 Redundância de rota ( redundancy)15 5 Monitoramento em tempo real ( monitoring)15 6 Histórico de bloqueio ( history)20 7 Validação de números ( validation)15 Total 130 -
Gate de captura — o resultado só é liberado após informar telefone (com máscara, mín. 10 dígitos) ou e-mail validado.
-
Resultado — score e faixa de risco:
Faixa Score Rótulo low≤ 25 Risco Baixo moderate≤ 55 Risco Moderado high≤ 90 Risco Alto critical> 90 Risco Crítico -
CTAs do resultado: landing page
lp.blitzap.com.br/?ref=quize WhatsAppwa.me/5534999999999(com mensagem pré-preenchida).
Rotas
Públicas
| Rota | Descrição |
|---|---|
/ |
Quiz completo (intro → perguntas → gate → resultado) |
API — quiz
| Método | Rota | Descrição |
|---|---|---|
POST |
/api/quiz/submit |
Registra o lead na tabela leads, recalcula score/band no servidor e dispara webhook + e-mails em background (não bloqueia a resposta) |
API — admin (protegidas por JWT via cookie auth_token)
| Método | Rota | Descrição |
|---|---|---|
POST |
/api/admin/auth/login |
Autentica e emite o JWT (24h) |
POST |
/api/admin/auth/logout |
Limpa o cookie de sessão |
GET |
/api/admin/leads |
Lista leads (com filtros do dashboard) |
GET |
/api/admin/leads/[id] |
Detalhe de um lead |
GET / PUT |
/api/admin/settings |
Lê/salva configurações de webhook e SMTP |
POST |
/api/webhooks/test |
Dispara um lead de teste para validar o webhook configurado |
Painel admin
| Rota | Descrição |
|---|---|
/admin/login |
Login (usuário/senha, JWT em cookie HttpOnly SameSite=Lax) |
/admin |
Dashboard de leads capturados |
/admin/settings |
Configuração de webhook (URL + secret) e SMTP |
Integrações
Webhook genérico (evento lead.created)
POSTJSON para a URL configurada em /admin/settings (armazenada na tabelasettings).- Payload:
{ event, timestamp, data: { id, contact, contact_type, score, risk_band, answers, created_at } }. - Assinatura HMAC-SHA256 do corpo no header
X-Blitzap-Signature(sha256=<hex>), usando o secret configurado no admin — permite ao receptor validar a autenticidade. - Timeout de 8s; falhas de entrega não afetam o fluxo do quiz (apenas log).
- Testável em
/admin/settingsviaPOST /api/webhooks/test(lead fictício).
E-mails SMTP (nodemailer)
- Notificação do admin (
admin_emailconfigurado): resumo do lead com score, faixa e tabela de respostas. - E-mail para o lead (somente quando o contato é e-mail e
notify_userestá ativo): diagnóstico com a leitura da faixa e CTA paralp.blitzap.com.br/?ref=quiz-email. - Credenciais e remetente SMTP são configurados em /admin/settings (tabela
settings), não por variáveis de ambiente.
CTAs / funil
- Resultado do quiz: LP
https://lp.blitzap.com.br/?ref=quize WhatsApphttps://wa.me/5534999999999. - E-mail do lead: LP
https://lp.blitzap.com.br/?ref=quiz-email.
Como rodar
Desenvolvimento (porta 3008)
npm install
# 1. Banco: criar tabelas (users, leads, settings) + índices
npm run migrate
# 2. Criar/atualizar o usuário admin
npm run seed # executa scripts/seed-admin.ts
# 3. Subir em http://localhost:3008
npm run dev
Configure as variáveis de ambiente em .env.local (ver seção abaixo) antes de rodar migrate/seed — os scripts leem esse arquivo.
Docker
docker build -t blitzap-quiz --build-arg NEXT_PUBLIC_APP_URL=<url-publica> .
docker run -p 3000:3000 --env-file .env.local blitzap-quiz
- Imagem multi-stage (
node:18-alpine) com outputstandalonedo Next.js; usuário não-root. - O container expõe a porta 3000 (em ambientes locais do time costuma ser mapeada para 3003 — o mapeamento é definido por quem sobe o container).
NEXT_PUBLIC_APP_URLé um build arg público; segredos entram em runtime via env.
Variáveis de ambiente
Apenas os nomes — valores ficam em
.env.local(fora do controle de versão). Nunca commite segredos.
| Variável | Uso |
|---|---|
DATABASE_URL |
String de conexão PostgreSQL (app e scripts migrate/seed) |
JWT_SECRET |
Segredo de assinatura dos JWTs do admin |
ADMIN_USERNAME |
Usuário admin criado pelo seed (opcional — tem padrão) |
ADMIN_PASSWORD |
Senha admin criada pelo seed (defina a sua) |
NEXT_PUBLIC_APP_URL |
URL pública da aplicação (build arg no Docker) |
Observação: webhook e SMTP não são configurados por variáveis de ambiente — URL, secret do webhook e credenciais SMTP ficam na tabela settings (linha única id = 1) e são gerenciados pela UI em /admin/settings.
Observações
- Sem integração direta com a API do aplicativo principal do Blitzap. A ponte com outros sistemas (CRM, automações, o app principal) é o webhook
lead.createdassinado com HMAC — qualquer consumidor pode validar o headerX-Blitzap-Signature. - O score e a faixa são recalculados no servidor no submit (
computeScore), nunca confiam no que o cliente envia. - Copy das perguntas, faixas e blocos de contexto fica centralizada em
src/lib/quiz-data.ts. - Scripts de banco:
scripts/migrate.ts(DDL idempotente:CREATE TABLE IF NOT EXISTSparausers,leads,settings+ índices e linha singleton de settings) escripts/seed-admin.ts(upsert do admin com bcrypt). CLAUDE.mdno raiz descreve a versão anterior deste projeto (páginas HTML estáticas) e está desatualizado em relação à implementação atual em Next.js.
Origem do repositório
Este repositório foi migrado do GitLab para o OmniGit em 2026-10-22:
- Origem:
gitlab.com/evolx.mkt/blitzap-quiz - Destino: https://omnigit.dev/BLITZAP/blitzap-quiz
O histórico completo de commits foi preservado na migração.
© EVOLX / Blitzap. Todos os direitos reservados.