Skip to main content

Segurança

API Keys

Use variáveis de ambiente

Nunca hardcode keys no código

Rotacione periodicamente

Troque keys a cada 90 dias

Separe ambientes

Keys diferentes para dev/prod

Limite scopes

Use apenas permissões necessárias
// ✅ Correto
const client = new EnviaAI({
  apiKey: process.env.ENVIAAI_API_KEY
});

// ❌ Errado - nunca faça isso!
const client = new EnviaAI({
  apiKey: 'sk_live_abc123...'
});

Webhooks

  • Sempre verifique a assinatura
  • Use HTTPS obrigatoriamente
  • Mantenha o secret seguro
  • Valide payload antes de processar
// ✅ Verificar assinatura
if (!verifySignature(req.body, req.headers['x-enviaai-signature'])) {
  return res.status(401).send('Invalid');
}

Performance

Processamento Assíncrono

Responda webhooks rapidamente e processe em background:
// ✅ Correto - responde rápido
app.post('/webhook', (req, res) => {
  res.status(200).send('OK');
  queue.add(req.body); // Processa depois
});

// ❌ Errado - processa antes de responder
app.post('/webhook', async (req, res) => {
  await heavyProcessing(req.body); // Pode causar timeout
  res.status(200).send('OK');
});

Connection Pooling

Reutilize instâncias do cliente:
// ✅ Correto - singleton
const client = new EnviaAI({ apiKey: process.env.API_KEY });
export { client };

// ❌ Errado - cria nova instância a cada uso
function sendMessage() {
  const client = new EnviaAI({ apiKey: process.env.API_KEY });
  // ...
}

Rate Limiting

Controle a taxa de envio:
// ✅ Com rate limiting
const limiter = new Bottleneck({
  reservoir: 100,
  reservoirRefreshAmount: 100,
  reservoirRefreshInterval: 60 * 1000
});

await limiter.schedule(() => client.messages.send(request));

Confiabilidade

Idempotência

Use IDs únicos para evitar duplicatas:
// ✅ Com deduplicação
const processedIds = new Set();

async function handleWebhook(data) {
  if (processedIds.has(data.messageId)) {
    return; // Já processado
  }
  processedIds.add(data.messageId);
  // Processar...
}

Retry Inteligente

Não faça retry para erros de validação:
// ✅ Correto
if (error.code === 'invalid_phone_number') {
  throw error; // Não adianta tentar de novo
}

if (error.code === 'rate_limit_exceeded') {
  await sleep(error.retryAfter * 1000);
  return retry(); // Faz sentido tentar novamente
}

Monitoramento

Acompanhe métricas importantes:
  • Taxa de erro
  • Latência de envio
  • Status de conexão das instâncias
  • Webhooks falhando

Mensagens

Formatação

// ✅ Mensagem clara e formatada
const message = `
*Pedido Confirmado!* ✅

Olá ${nome}, seu pedido foi confirmado.

📦 *Pedido:* #${pedido}
💰 *Total:* R$ ${total}
📅 *Previsão:* ${data}

Dúvidas? Responda esta mensagem.
`.trim();

// ❌ Mensagem confusa
const message = `pedido ${pedido} confirmado total ${total} entrega ${data}`;

Horários

// ✅ Verificar horário comercial
function isBusinessHours() {
  const now = new Date();
  const hour = now.getHours();
  const day = now.getDay();

  // Segunda a Sexta, 8h às 20h
  return day >= 1 && day <= 5 && hour >= 8 && hour < 20;
}

if (!isBusinessHours()) {
  // Agendar para próximo horário comercial
  await queue.add(message, { delay: getNextBusinessHour() });
}

Personalização

// ✅ Mensagem personalizada
const message = `
Olá ${cliente.nome}! 👋

Vimos que você se interessou por ${produto.nome}.
Que tal ${desconto}% de desconto exclusivo?
`.trim();

// ❌ Mensagem genérica
const message = 'Olá! Temos uma oferta para você.';

Instâncias

Monitorar Conexão

// Webhook para desconexão
async function onInstanceDisconnected(data) {
  // Alertar equipe
  await slack.send(`⚠️ Instância ${data.instanceId} desconectou`);

  // Tentar reconectar
  await client.instances.connect(data.instanceId, { method: 'qrcode' });
}

Separar por Caso de Uso

InstânciaUso
inst_vendasProspecção e vendas
inst_suporteAtendimento ao cliente
inst_marketingCampanhas e promoções

Webhooks

Logging Completo

app.post('/webhook', (req, res) => {
  const { event, data, timestamp } = req.body;

  // Log estruturado
  logger.info({
    type: 'webhook_received',
    event,
    messageId: data.messageId,
    timestamp,
    receivedAt: new Date().toISOString()
  });

  res.status(200).send('OK');
  process(req.body);
});

Alertas de Falha

Configure alertas quando webhooks falham repetidamente:
// Monitorar taxa de sucesso
if (failureRate > 0.1) { // 10% de falha
  alert.send('Webhook failure rate high');
}

Checklist de Produção

Antes do Deploy

  • API Keys em variáveis de ambiente
  • Webhook signatures verificadas
  • Retry com exponential backoff
  • Rate limiting implementado
  • Logging estruturado
  • Monitoramento configurado

Pós-Deploy

  • Alertas configurados
  • Dashboards criados
  • Runbook de incidentes
  • Backup de configurações
  • Plano de rollback

Recursos Úteis