Dashboard Operacional — Live Status do ClickUp¶
Dashboard read-only que mostra o estado em tempo real das 22 listas do ClickUp que receberam o fluxo de revisão padronizado. Identifica gargalos (revisão parada, cliente lento, tasks órfãs).
Sem cache. Cada request faz snapshot ao vivo na API do ClickUp.
URLs¶
| Endpoint | Tipo | Uso |
|---|---|---|
/operacional/dashboard?token=… |
HTML (tema escuro) | Abrir no browser pra visualizar |
/operacional/status?token=… |
JSON cru | Scripts, análise externa, alertas |
Token: DASHBOARD_TOKEN (mesmo do /dashboard financeiro e /grupos-clientes/health).
O que mostra¶
Cabeçalho¶
- Horário do snapshot (BRT)
- Total de tasks ativas (não-closed) somando todas as 22 listas
- Distribuição por área: Criação · Tráfego · Backoffice · Sucesso do Cliente
3 painéis de gargalos (no topo, prioridade visual)¶
| Painel | Critério | Ação esperada |
|---|---|---|
| 🟠 Revisão interna parada | task em status em revisão interna há > STALE_REVISION_DAYS dias (default: 2d) |
Revisor designado precisa agir ou destravar |
| 🔵 Cliente não responde | task em status em aprovação cliente há > STALE_APPROVAL_DAYS dias (default: 3d) |
Tati / account faz follow-up no grupo |
| ⚠️ Em revisão interna sem Revisor designado | task com status em revisão interna E custom field Revisor Interno vazio |
Atribuir alguém antes de seguir |
Cada painel mostra até 15 tasks com link direto pra task no ClickUp, ordenadas das mais antigas pras mais novas.
Grade de cards (1 por lista)¶
Para cada uma das 22 listas:
- Nome da lista (link clicável pra ClickUp)
- Total de tasks ativas
- Distribuição de tasks por status (barras horizontais coloridas)
- Badge amarelo N sem Revisor se houver tasks em revisão sem revisor designado
Listas monitoradas¶
Hardcoded em LISTS em server/automations/operacional-status.js.
| Área | Listas (6 + 11 + 5 = 22) |
|---|---|
| Criação | Design · Vídeo · Copy · Planejamento e Estratégia |
| Tráfego | Gestão de Campanhas · Relatórios Tráfego |
| Backoffice | RH / Vagas · Gestão Contratual · R [Financeiro] · Contas a Receber · Contas a Pagar · R [Administrativo] · Time GITA · Onboarding · Cultura e Rituais · Recrutamento e Seleção · R [Direção] |
| Sucesso do Cliente | Gestão de Clientes · NPS · Entrada do novo cliente · R [Pós Venda] · Relatórios de Entregas |
Não monitora ainda: Publicação, R [Criação], R [Tráfego e Infra], R [Web], Produção de Páginas, listas de Lançamentos, R [Jurídico] (sem permissão), R [Tecnologia e IA], R [Tech GITA], Sistemas em Desenvolvimento, Manutenção e Suporte, Agentes Claude Code, Automações Internas, Stack e Infraestrutura, listas do folder Lançamento LS, listas do folder Estruturação Inicial - Cliente.
Como ajustar¶
Mudar thresholds de gargalos¶
Editar constantes no topo de operacional-status.js:
const STALE_REVISION_DAYS = 2 // tasks em "em revisão interna" há mais de X dias
const STALE_APPROVAL_DAYS = 3 // tasks em "em aprovação cliente" há mais de X dias
Adicionar/remover lista do monitoramento¶
Editar array LISTS no mesmo arquivo:
const LISTS = [
{ id: '<list_id>', name: '<nome>', area: '<Criação|Tráfego|Backoffice|Sucesso>', color: '<hex>' },
// ...
]
Cores das áreas (em areaColor()):
- Criação: #e9c162 (amarelo)
- Tráfego: #3e63dd (azul)
- Backoffice: #6647f0 (roxo)
- Sucesso: #30a46c (verde)
Mudar lógica de agrupamento de status¶
A função statusGroup(statusName) classifica nomes de status em buckets normalizados:
- revisao_interna — para tasks aguardando revisão humana
- aprovacao_cliente — para tasks aguardando cliente responder
- alteracao — em alteração & ajuste (loop)
- aprovado — concluído / aprovado / finalizada / deu certo
- publicado — publicado / agendado
- producao — em produção / em andamento / fazendo / em gravação / em edição
- aguardando — fallback (não classificado)
Se uma lista usa nomenclatura diferente que não bate com nenhum padrão (ex: "Em aguardo"), basta adicionar a regra correspondente em statusGroup().
Mudar cores das barras de status¶
Função statusColor(statusName) mapeia substrings de status pra cores. Adicione regras conforme novos statuses aparecerem nas listas.
Como funciona internamente¶
Pipeline de cada request¶
GET /operacional/dashboard ou /status
↓
buildSnapshot()
↓
para cada uma das 22 listas (sequencial):
fetchListTasks(listId) → GET /api/v2/list/{id}/task
↓ resposta tem array de tasks com:
- status.status (nome do status)
- date_updated (timestamp ms)
- custom_fields (array — busca "Revisor Interno")
- url (link pra task)
↓ para cada task:
statusGroup(status) → bucket
daysAgo(date_updated) → idade do status atual
if revisao_interna & idade > 2 → adiciona em gargalos.revisao_parada
if aprovacao_cliente & idade > 3 → adiciona em gargalos.cliente_lento
if revisao_interna & sem revisor → adiciona em gargalos.orfas_sem_revisor
↓
ordena gargalos por idade decrescente
↓
retorna JSON (status) ou renderHtml(snapshot) (dashboard)
Por que sequencial e não paralelo¶
22 listas × ~5ms cada = ~110ms — performance OK. Paralelizar daria <50ms mas pode hitar rate limit do ClickUp (100 req/min em token pessoal). Se virar gargalo no futuro: usar Promise.all com semáforo de 5.
Sem cache¶
Cada request faz 22 chamadas ao ClickUp. Se virar lento (>3s), opções: 1. Cache de 60-120s in-memory (suficiente pra dashboard) 2. Pré-calcular via cron a cada N min e servir do Supabase
Env vars necessárias¶
Já configuradas no Easypanel apiclickup (não precisa adicionar nada novo):
| Var | Função |
|---|---|
CLICKUP_TOKEN |
Token de acesso ClickUp REST API (Personal Token) |
DASHBOARD_TOKEN |
Auth do dashboard (query string ?token=…) |
Limitações conhecidas¶
- Não rastreia tasks fechadas (
include_closed=falsena query) — só ativas. Tasks "Aprovado" / "Publicado" geralmente são closed e somem do dashboard. Pode ser intencional (foco em fluxo ativo) ou ajustar conforme necessidade. date_updatedreflete a última modificação da task, não a mudança de status específica — tasks com edições recentes podem aparecer "fresh" mesmo estando no mesmo status há dias. Pra precisão, ClickUp tem endpoint/task/{id}/historymas é 1 request a mais por task (não escala).- Custom field
Revisor Internolê só primeira pessoa do array (single_user: truena config do field). - Listas com 0 tasks aparecem como cards com "(sem tasks ativas)" — bom pra ver cobertura, mas polui visual. Pode ser ocultado por flag se virar problema.
Próximas evoluções possíveis¶
- Alertas Slack/WhatsApp quando gargalo crescer (cron 8h-20h)
- Histórico — salvar snapshot diário em Supabase pra ver tendência
- Filtros na UI — por área, por cliente (custom field Empresa), por revisor
- Drill-down por lista — clicar numa lista abre detalhe com lista de tasks
- Métricas por cliente — tempo médio de revisão interna por cliente
- Indicador de saúde do cliente — clientes com tasks em aprovação >5d podem indicar problema de relacionamento
Arquivos no código¶
server/automations/operacional-status.js— único arquivo, ~340 linhas (lógica + HTML inline)- Registrado em
server/automations/index.jsna funçãoregisterAutomations()
Ver também¶
- POP — Fluxo de Revisão Padronizado — origem do fluxo monitorado
- POP — Relatório Mensal de Cliente — outro endpoint que usa ClickUp + Uazapi
- Pré-Auditoria Automática — automação ClickUp adjacente (Gemini)