30 sugestões otimizadas · Roadmap de implementação
As 30 sugestões de melhoria (10 UI/UX + 10 segurança + 10 marketing) foram analisadas, priorizadas por impacto e agrupadas em 4 fases. Cada fase é executável de forma independente e gera valor de negócio mensurável.
Detalhamento técnico acionável para o time de desenvolvimento. Cada item abaixo requer backend e/ou infraestrutura.
Endpoint: GET /api/cnpj/:cnpj
Fluxo: Frontend → POST /api/cnpj → check Redis → fetch receitaws.com.br → store Redis TTL 24h → return dados → fill form
Cache: Redis hash: cnpj:{cnpj} com TTL 24h. Fallback: cache em memória (Map) se Redis offline.
Tratamento de erro: Se API externa retornar erro (429/503), retorna 503 com flag fallback: true — frontend libera preenchimento manual.
Rate limit: 3 req/min por IP (a API pública da Receita limita agressivamente). Cache é essencial.
Provider: Resend.com + Trigger.dev para automação — mais barato que HubSpot no volume inicial (< 10k/mês).
Gatilho 1 — Calculou sem cadastrar: Após 4h sem criar conta, enviar: "Sua economia de R$ XX ainda está disponível" + link direto para /cadastro com dados pré-preenchidos (localStorage).
Gatilho 2 — Cadastrou sem completar onboarding: Após 24h, enviar: "Seu diagnóstico está pela metade — continuar de onde parou" + link mágico (token no email).
Gatilho 3 — Diagnóstico concluído: Imediato: relatório em PDF anexado + "Próximo passo: agendar call com especialista".
Template: React Email + Tailwind. Envio via Resend API. Rascunhos dos templates em packages/emails/.
Estratégia: SSG (getStaticPaths + getStaticProps) gerando páginas para cada combinação CNAE×UF na build. Deploy Vercel.
Slug pattern: /beneficios/{setor}/{uf}/{slug} — ex: /beneficios/industria/sp/credito-presumido-icms
Meta tags dinâmicas: Título, description, h1, e conteúdo gerados por template a partir dos dados da engine de regras.
Volume inicial: ~40 páginas (5 setores × 8 UFs). Escalável para 200+ conforme adicionar regras.
Internal linking: Cada página linka para /voltaimposto/ com CTA e parâmetros UTM preenchidos.
Plugin: @fastify/rate-limit com store Redis (ioredis).
Regras: POST /auth/login → 5 req/min por IP (bloqueio 15min após exceder). GET /api/* → 100 req/min por IP. Rotas autenticadas → 1000 req/min por token. Calculadora frontend → sem limite (client-side).
Resposta: HTTP 429 com header Retry-After e body JSON: { error: "Muitas tentativas. Tente novamente em X minutos." }
Plugin: @fastify/helmet
Config: CSP: default-src 'self', script-src 'self' 'unsafe-inline' (Next.js inline), style-src 'self' 'unsafe-inline', img-src 'self' data: blob:, connect-src 'self' https://receitaws.com.br. HSTS max-age 31536000 includeSubDomains. X-Frame-Options DENY. X-Content-Type-Options nosniff. Referrer-Policy strict-origin-when-cross-origin. Permissions-Policy: geolocation=(), microphone=(), camera=().
Estratégia: Access token: 15 min. Refresh token: 7 dias com rotation (cada uso gera novo par, anterior invalidado).
Chave: RSA-256 (par público/privado). Privada no env var, pública em /api/.well-known/jwks.json.
Blacklist: Redis set token_blacklist:{jti} com TTL = exp do token.
Refresh storage: Redis hash refresh:{user_id} com token hash + device fingerprint + data de criação.
Schema pattern: Zod schemas em packages/shared/src/schemas/ reutilizados entre frontend e backend. z.string().trim().max(255) para todos os campos string.
Sanitização: sanitize-html (ou DOMPurify server-side) em qualquer conteúdo rich text. Stripping de tags HTML em campos comuns.
Tamanho: Rejeitar payloads acima de 1MB no Fastify (bodyLimit).
CSRF: @fastify/csrf-protection com token de sessão.
Política: ALTER TABLE beneficios ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation ON beneficios USING (empresa_id = current_setting('app.current_empresa_id')::uuid);
Middleware Fastify: Hook preHandler que executa SET app.current_empresa_id = $1 a partir do token JWT.
Verificação extra: Em queries críticas (criação requerimento, dados fiscais), dupla verificação: RLS + cláusula WHERE empresa_id explícita.
Tabela: audit_log — id UUID, empresa_id UUID, usuario_id UUID, acao VARCHAR(50), detalhes JSONB, ip INET, user_agent TEXT, created_at TIMESTAMPTZ DEFAULT NOW().
Trigger: CREATE OR REPLACE FUNCTION audit_trigger() RETURNS TRIGGER AS $$ BEGIN INSERT INTO audit_log ...; RETURN NEW; END; $$ LANGUAGE plpgsql; disparado em INSERT/UPDATE/DELETE em tabelas sensíveis (beneficios, requerimentos, usuarios).
Segurança: Tabela com REVOKE UPDATE, DELETE ON audit_log FROM PUBLIC;. Apenas SELECT permitido por admins e período de retenção de 5 anos (CloudWatch Archive).
RDS: Automated backups habilitados com retention de 30 dias. WAL archiving para S3 (bucket separado com versioning).
Snapshot diário: Lambda programada (CloudWatch Events 03:00 UTC) → snapshot RDS → copia para região secundária (us-east-2 para DR).
Teste de restore: GitHub Action mensal: restaura snapshot em instância temporária → executa health checks → destroi instância. Notifica em caso de falha.
RPO/RTO: RPO 1 hora (WAL contínuo). RTO 4 horas (restore de snapshot + WAL replay).
Componentes: BarChart (economia por benefício), PieChart (distribuição por tipo), AreaChart (evolução mensal), Gauge (percentual do potencial total).
API: GET /api/dashboard/summary — agregações por empresa. Cache Redis 5min para dados não-críticos.
Revalidação: SWR no frontend com refresh a cada 30s. Indicador visual "última atualização: X segundos atrás".
Fluxo: /onboarding → Step 1: CNPJ + dados cadastrais → Step 2: Perfil fiscal (CNAE, regime, faturamento) → Step 3: Localização e UF de atuação → Step 4: Contador atual (nome, email, CRC) ou "Não tenho contador".
Auto-save: Cada step salva rascunho no Redis (TTL 7 dias) via POST /api/onboarding/draft. Permite retomar exatamente de onde parou.
Barra de progresso: 4 etapas visuais com step atual destacado. Indicador de tempo restante ("Cerca de 2 min").
Abandono: Se usuário não completa em 30min, trigger de email nurture (Kit #9, Gatilho 2).
Regra: Se economia total < R$ 50k/ano → fluxo self-serve: cadastro → matching automático → relatório → protocolo guiado. Se > R$ 50k/ano → + botão "Falar com especialista" que abre calendário de agendamento (Calendly ou similar).
Trigger: Verificado no momento do resultado da calculadora. Armazenado como preferência no perfil do usuário.
Provider: Tidio (mais em conta para PME brasileira) ou Intercom. Widget aparece no canto inferior direito após 30s de navegação ou no resultado da calculadora.
Horário: Humano das 9h às 18h. Chatbot com FAQ fora do horário (base: as 5 perguntas do FAQ + respostas).
Eventos: Disparar mensagem proativa após calcular: "Posso ajudar com os benefícios encontrados para sua empresa?"
Envelope encryption: DEK (Data Encryption Key) por cliente → criptografado com KEK (Key Encryption Key) mestra no AWS KMS. DEK decriptado apenas em memória, nunca persistido.
Campos criptografados: Certificado digital A1 (PKCS#12), senha do certificado, dados bancários para restituição.
2FA: Obrigatório para contadores parceiros. TOTP (biblioteca speakeasy). Recovery codes únicos (criptografados no perfil). Opcional para empresas.
Runtime isolado: Operações com certificado digital executam em container separado (Lambda isolado) para evitar vazamento de memória.