Mensagens do Otto passam por uma fila de jobs antes de chegarem ao cliente. Conhecer os status ajuda a diagnosticar atrasos e entender o estado real do envio.
A fila por trás do Otto
Toda mensagem segue o caminho:
1. Otto cria job (gatilho ou agendamento)
2. Job entra na fila BullMQ
3. Worker processa: monta mensagem, valida sandbox, envia
4. Provider (WhatsApp Cloud, Evolution, SES) recebe
5. Mensagem chega ao cliente (ou falha)
6. Status atualiza no painel
Cada etapa tem status visível em Otto > Mensagens.
Status possíveis
| Status | Estágio | Significado |
|---|---|---|
queued | 1 | Job criado, aguardando worker |
delayed | 1 | Job adiado (fora da janela ou retry) |
sending | 2 | Worker pegou e está enviando |
sent | 3 | Provider confirmou envio |
delivered | 4 | Provider confirmou entrega ao cliente |
read | 5 | Cliente leu (WhatsApp/Email com tracking) |
failed | — | Falhou após retries |
bounce | — | Email bounced (hard ou soft) |
complaint | — | Cliente marcou como spam |
cancelled | — | Cancelado antes do envio |
sandbox | — | Bloqueado por sandbox, registrado |
Filtragem na lista
Em Otto > Mensagens, filtros disponíveis:
- Por canal (WhatsApp, email)
- Por status
- Por data
- Por automação ou campanha
- Por cliente (busca)
Útil para investigar volume específico.
O que cada status indica
queued por mais de 5 minutos
- Workers podem estar saturados (campanha grande)
- Verifique se há outras campanhas concorrentes
- Aguarde 10 minutos
delayed
- Janela fechada (fora do horário permitido)
- Espera retry de tentativa anterior
- Vai sair quando a janela abrir
sending por mais de 2 minutos
- Provider lento ou com falha temporária
- Worker pode estar em retry
sent mas nunca delivered
- Cliente não está com WhatsApp ativo (offline há dias)
- Email bounced sem sinal (rare)
- Cliente bloqueou
failed
Causa específica fica em detalhes do envio:
- Token de plataforma expirado
- Cota de email esgotada
- Telefone inválido
- Email inválido
- Provider retornou erro 5xx
Detalhes em Otto: retry e reprocessar lote.
Fila por prioridade (BullMQ)
Internamente, Otto usa filas separadas por urgência:
| Fila | Prioridade | Exemplo |
|---|---|---|
critical | Máxima | Carrinho abandonado, pós-venda |
messaging | Alta | WhatsApp e email regulares |
ai | Média | Geração de conteúdo |
batch | Baixa | Métricas, relatórios |
Crítico passa na frente. Newsletter grande pode ficar minutos atrás de pós-venda transacional — por design.
Rate limits
Otto respeita rate limits dos providers:
- WhatsApp Cloud (Meta): variável por nível de qualidade da loja
- Evolution API (WhatsApp não-oficial): 1 envio a cada 60s globalmente para o número Memo, mais relaxado para Otto
- SES (email): depende da quota da conta AWS
Quando rate limit ativa, mensagens ficam queued mais tempo. Não há ação do lojista — espere.
Tentativas (retries)
Falhas transitórias entram em retry automático. Detalhes em Otto: retry e reenvio.
Histórico longo
Mensagens ficam visíveis em Otto > Mensagens:
- 90 dias detalhado
- Após 90 dias, agregado em métricas (não acessível individualmente)
Para auditoria de mensagem antiga, abra ticket informando data e cliente.
Velocidade típica
Em condições normais (sem rate limit, sem fila grande):
| Etapa | Tempo |
|---|---|
| Job → worker pega | <1s |
| Worker monta mensagem | 1-5s |
| Provider envia (WhatsApp) | 1-3s |
| Provider entrega (WhatsApp) | 1-30s (depende do cliente) |
| Provider envia (email SES) | 1-2s |
| Provider entrega (email caixa cliente) | 30s-5min |
Total: usuário recebe em segundos a minutos depois do trigger.
Atrasos esperados
Algumas situações geram atraso intencional:
- Quiet hours: mensagem agendada para noite vira manhã seguinte
- Janela fechada: mensagem fora de janela é adiada
- 24h do WhatsApp expirou: mensagem livre vira template (ou bloqueia)
- Sequência ordenada: cart-recovery 1 espera 30min antes de cart-recovery 2
Onde ver gráficos de fila
Painel > Saúde > Filas mostra gráficos em tempo real:
- Tamanho da fila por tipo
- Throughput (jobs/min)
- Latência média
Útil para entender saúde geral. Se algo está fora do padrão, alerta apareceria no sininho automaticamente.
Sandbox e fila
Com Sandbox Otto ativo:
- Jobs entram normalmente
- Worker processa mas não chama provider
- Status final fica
sandbox - Conteúdo da mensagem fica preservado para auditoria
Útil para volume de teste sem disparar.