Pular para o conteúdo principal

Tags e Organização de Workflows

As tags e organização de workflows permitem estruturar, categorizar e encontrar suas automações de forma eficiente. Esta seção aborda como usar tags, criar hierarquias e manter seus workflows organizados.

Visão Geral

A organização de workflows com tags oferece múltiplos benefícios:

  • Categorização automática de workflows por função
  • Busca rápida e filtros inteligentes
  • Hierarquia organizacional por departamentos
  • Controle de acesso baseado em tags
  • Relatórios estruturados por categoria

Sistema de Tags

Estrutura de Tags

O n8n suporta uma estrutura hierárquica de tags:

javascript\n// Estrutura de tags organizacional\nconst estruturaTags = {\n  // Tags principais (departamentos)\n  departamentos: [\n    'vendas',\n    'marketing', \n    'financeiro',\n    'rh',\n    'suporte',\n    'ti',\n    'operacoes'\n  ],\n  \n  // Tags secundárias (funcionalidades)\n  funcionalidades: [\n    'automacao',\n    'integracao',\n    'notificacao',\n    'relatorio',\n    'backup',\n    'monitoramento'\n  ],\n  \n  // Tags de status\n  status: [\n    'ativo',\n    'inativo',\n    'desenvolvimento',\n    'homologacao',\n    'producao',\n    'depreciado'\n  ],\n  \n  // Tags de prioridade\n  prioridade: [\n    'critica',\n    'alta',\n    'media',\n    'baixa'\n  ],\n  \n  // Tags específicas do Brasil\n  brasil: [\n    'nfe',\n    'pix',\n    'lgpd',\n    'serasa',\n    'receita',\n    'correios'\n  ]\n};\n
\n\n### Convenções de Nomenclatura\n\n
javascript\n// Convenções para tags\nconst convencoesTags = {\n  // Formato: departamento-funcionalidade-status\n  formato: 'vendas-automacao-producao',\n  \n  // Separadores\n  separadores: {\n    principal: '-',    // vendas-automacao\n    secundario: ':',   // vendas:leads\n    hierarquico: '/'   // vendas/automacao/leads\n  },\n  \n  // Prefixos especiais\n  prefixos: {\n    ambiente: 'env:',      // env:producao\n    versao: 'v:',          // v:1.0.0\n    projeto: 'proj:',      // proj:crm-integration\n    cliente: 'cliente:',   // cliente:empresa-abc\n    urgente: 'urgente:'    // urgente:crash-fix\n  },\n  \n  // Exemplos práticos\n  exemplos: [\n    'vendas-automacao-producao',\n    'financeiro-conciliacao-ativo',\n    'rh-onboarding-desenvolvimento',\n    'env:producao',\n    'v:2.1.0',\n    'proj:crm-integration',\n    'cliente:empresa-abc',\n    'urgente:crash-fix'\n  ]\n};\n
\n\n## Criação e Gerenciamento de Tags\n\n### Criar Tags via Interface\n\nPara criar tags via interface:\n\n1. Vá para a página de workflows\n2. Clique em "Tags" no menu lateral\n3. Clique em "Add Tag" para criar nova tag\n4. Digite o nome da tag\n5. Escolha a cor para identificação visual\n6. Clique em "Save" para salvar\n\n### Criar Tags via API\n\n
javascript\n// Criar tag via API\nconst criarTag = async (tagData) => {\n  const response = await fetch('/api/v1/tags', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'Authorization': 'Bearer YOUR_API_KEY'\n    },\n    body: JSON.stringify({\n      name: tagData.nome,\n      color: tagData.cor,\n      description: tagData.descricao,\n      parent: tagData.pai || null,\n      metadata: tagData.metadados || {}\n    })\n  });\n  \n  return response.json();\n};\n\n// Exemplo: Criar tag de vendas\nconst tagVendas = {\n  nome: 'vendas-automacao',\n  cor: '#ff6b6b',\n  descricao: 'Automações relacionadas ao processo de vendas',\n  metadados: {\n    departamento: 'vendas',\n    responsavel: 'joao@empresa.com',\n    sla: '4h'\n  }\n};\n\nconst tag = await criarTag(tagVendas);\n
\n\n### Gerenciar Tags Existentes\n\n
javascript\n// Listar todas as tags\nconst listarTags = async () => {\n  const response = await fetch('/api/v1/tags', {\n    method: 'GET',\n    headers: {\n      'Authorization': 'Bearer YOUR_API_KEY'\n    }\n  });\n  \n  return response.json();\n};\n\n// Atualizar tag\nconst atualizarTag = async (tagId, dados) => {\n  const response = await fetch(`/api/v1/tags/${tagId}`, {\n    method: 'PUT',\n    headers: {\n      'Content-Type': 'application/json',\n      'Authorization': 'Bearer YOUR_API_KEY'\n    },\n    body: JSON.stringify(dados)\n  });\n  \n  return response.json();\n};\n\n// Excluir tag\nconst excluirTag = async (tagId) => {\n  const response = await fetch(`/api/v1/tags/${tagId}`, {\n    method: 'DELETE',\n    headers: {\n      'Authorization': 'Bearer YOUR_API_KEY'\n    }\n  });\n  \n  return response.json();\n};\n
\n\n## Aplicação de Tags em Workflows\n\n### Aplicar Tags via Interface\n\nPara aplicar tags a um workflow:\n\n1. Abra o workflow no editor\n2. Clique no campo "Tags" na barra superior\n3. Digite ou selecione as tags desejadas\n4. Pressione Enter para adicionar\n5. Clique em "Save" para salvar\n\n### Aplicar Tags via API\n\n
javascript\n// Aplicar tags a um workflow\nconst aplicarTags = async (workflowId, tags) => {\n  const response = await fetch(`/api/v1/workflows/${workflowId}/tags`, {\n    method: 'PUT',\n    headers: {\n      'Content-Type': 'application/json',\n      'Authorization': 'Bearer YOUR_API_KEY'\n    },\n    body: JSON.stringify({\n      tags: tags\n    })\n  });\n  \n  return response.json();\n};\n\n// Exemplo: Aplicar múltiplas tags\nconst tags = [\n  'vendas-automacao',\n  'crm-integration',\n  'env:producao',\n  'v:1.2.0',\n  'prioridade:alta'\n];\n\nawait aplicarTags('workflow-123', tags);\n
\n\n### Aplicação Automática de Tags\n\n
javascript\n// Aplicar tags automaticamente baseado no conteúdo\nconst aplicarTagsAutomaticas = async (workflowId) => {\n  const workflow = await buscarWorkflow(workflowId);\n  const tagsAutomaticas = [];\n  \n  // Analisar nodes para determinar tags\n  workflow.nodes.forEach(node => {\n    // Tags baseadas no tipo de node\n    if (node.type.includes('crm')) {\n      tagsAutomaticas.push('crm-integration');\n    }\n    \n    if (node.type.includes('email')) {\n      tagsAutomaticas.push('notificacao');\n    }\n    \n    if (node.type.includes('http')) {\n      tagsAutomaticas.push('api-integration');\n    }\n    \n    // Tags baseadas em parâmetros\n    if (node.parameters && node.parameters.url) {\n      if (node.parameters.url.includes('vendas')) {\n        tagsAutomaticas.push('vendas');\n      }\n      \n      if (node.parameters.url.includes('financeiro')) {\n        tagsAutomaticas.push('financeiro');\n      }\n    }\n  });\n  \n  // Aplicar tags únicas\n  const tagsUnicas = [...new Set(tagsAutomaticas)];\n  await aplicarTags(workflowId, tagsUnicas);\n  \n  return tagsUnicas;\n};\n
\n\n## Busca e Filtros\n\n### Busca por Tags\n\n
javascript\n// Buscar workflows por tags\nconst buscarPorTags = async (tags, operador = 'AND') => {\n  const response = await fetch('/api/v1/workflows/search', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'Authorization': 'Bearer YOUR_API_KEY'\n    },\n    body: JSON.stringify({\n      tags: tags,\n      operator: operador, // AND, OR\n      includeInactive: false,\n      limit: 100\n    })\n  });\n  \n  return response.json();\n};\n\n// Exemplo: Buscar workflows de vendas em produção\nconst workflowsVendas = await buscarPorTags([\n  'vendas',\n  'env:producao'\n], 'AND');\n\n// Exemplo: Buscar workflows críticos ou urgentes\nconst workflowsCriticos = await buscarPorTags([\n  'prioridade:critica',\n  'urgente:'\n], 'OR');\n
\n\n### Filtros Avançados\n\n
javascript\n// Filtros avançados por tags\nconst filtrosAvancados = {\n  // Filtro por departamento\n  porDepartamento: async (departamento) => {\n    return await buscarPorTags([departamento]);\n  },\n  \n  // Filtro por ambiente\n  porAmbiente: async (ambiente) => {\n    return await buscarPorTags([`env:${ambiente}`]);\n  },\n  \n  // Filtro por prioridade\n  porPrioridade: async (prioridade) => {\n    return await buscarPorTags([`prioridade:${prioridade}`]);\n  },\n  \n  // Filtro por status\n  porStatus: async (status) => {\n    return await buscarPorTags([status]);\n  },\n  \n  // Filtro combinado\n  combinado: async (filtros) => {\n    const tags = [];\n    \n    if (filtros.departamento) {\n      tags.push(filtros.departamento);\n    }\n    \n    if (filtros.ambiente) {\n      tags.push(`env:${filtros.ambiente}`);\n    }\n    \n    if (filtros.prioridade) {\n      tags.push(`prioridade:${filtros.prioridade}`);\n    }\n    \n    if (filtros.status) {\n      tags.push(filtros.status);\n    }\n    \n    return await buscarPorTags(tags, 'AND');\n  }\n};\n\n// Exemplo de uso\nconst workflowsFiltrados = await filtrosAvancados.combinado({\n  departamento: 'vendas',\n  ambiente: 'producao',\n  prioridade: 'alta',\n  status: 'ativo'\n});\n
\n\n## Organização Hierárquica\n\n### Estrutura de Pastas com Tags\n\n
javascript\n// Organizar workflows em estrutura hierárquica\nconst estruturaHierarquica = {\n  // Estrutura principal\n  organizacao: {\n    vendas: {\n      automacao: {\n        leads: ['vendas-automacao-leads', 'vendas-lead-scoring'],\n        followup: ['vendas-followup-automatico', 'vendas-email-sequence'],\n        crm: ['vendas-crm-sync', 'vendas-crm-backup']\n      },\n      relatorios: {\n        diarios: ['vendas-relatorio-diario', 'vendas-metricas'],\n        semanais: ['vendas-relatorio-semanal', 'vendas-performance'],\n        mensais: ['vendas-relatorio-mensal', 'vendas-forecast']\n      }\n    },\n    \n    financeiro: {\n      conciliacao: ['financeiro-conciliacao-bancaria', 'financeiro-conciliacao-cartao'],\n      nfe: ['financeiro-nfe-emissao', 'financeiro-nfe-envio'],\n      pix: ['financeiro-pix-processamento', 'financeiro-pix-notificacao']\n    },\n    \n    rh: {\n      onboarding: ['rh-onboarding-automatico', 'rh-documentos'],\n      offboarding: ['rh-offboarding-processo', 'rh-acesso-revogacao'],\n      beneficios: ['rh-beneficios-calculo', 'rh-beneficios-notificacao']\n    }\n  }\n};\n\n// Criar tags hierárquicas\nconst criarTagsHierarquicas = async () => {\n  const tags = [];\n  \n  // Tags de primeiro nível (departamentos)\n  tags.push(await criarTag({\n    nome: 'vendas',\n    cor: '#ff6b6b',\n    descricao: 'Departamento de Vendas'\n  }));\n  \n  // Tags de segundo nível (funcionalidades)\n  tags.push(await criarTag({\n    nome: 'vendas-automacao',\n    cor: '#ff8e8e',\n    descricao: 'Automações de Vendas',\n    pai: 'vendas'\n  }));\n  \n  // Tags de terceiro nível (específicas)\n  tags.push(await criarTag({\n    nome: 'vendas-automacao-leads',\n    cor: '#ffb3b3',\n    descricao: 'Automação de Leads',\n    pai: 'vendas-automacao'\n  }));\n  \n  return tags;\n};\n
\n\n### Navegação por Tags\n\n
javascript\n// Navegar pela hierarquia de tags\nconst navegacaoTags = {\n  // Obter tags filhas\n  obterFilhas: async (tagPai) => {\n    const response = await fetch(`/api/v1/tags/${tagPai}/children`, {\n      method: 'GET',\n      headers: {\n        'Authorization': 'Bearer YOUR_API_KEY'\n      }\n    });\n    \n    return response.json();\n  },\n  \n  // Obter tags pai\n  obterPai: async (tagFilha) => {\n    const response = await fetch(`/api/v1/tags/${tagFilha}/parent`, {\n      method: 'GET',\n      headers: {\n        'Authorization': 'Bearer YOUR_API_KEY'\n      }\n    });\n    \n    return response.json();\n  },\n  \n  // Obter árvore completa\n  obterArvore: async (tagRaiz) => {\n    const response = await fetch(`/api/v1/tags/${tagRaiz}/tree`, {\n      method: 'GET',\n      headers: {\n        'Authorization': 'Bearer YOUR_API_KEY'\n      }\n    });\n    \n    return response.json();\n  }\n};\n
\n\n## Relatórios e Analytics\n\n### Relatórios por Tags\n\n
javascript\n// Gerar relatórios baseados em tags\nconst relatoriosPorTags = {\n  // Relatório de workflows por departamento\n  porDepartamento: async () => {\n    const departamentos = ['vendas', 'marketing', 'financeiro', 'rh', 'ti'];\n    const relatorio = {};\n    \n    for (const dept of departamentos) {\n      const workflows = await buscarPorTags([dept]);\n      relatorio[dept] = {\n        total: workflows.length,\n        ativos: workflows.filter(w => w.active).length,\n        inativos: workflows.filter(w => !w.active).length,\n        ultimaExecucao: workflows.map(w => w.updatedAt).sort().pop()\n      };\n    }\n    \n    return relatorio;\n  },\n  \n  // Relatório de workflows por ambiente\n  porAmbiente: async () => {\n    const ambientes = ['desenvolvimento', 'homologacao', 'producao'];\n    const relatorio = {};\n    \n    for (const env of ambientes) {\n      const workflows = await buscarPorTags([`env:${env}`]);\n      relatorio[env] = {\n        total: workflows.length,\n        criticos: workflows.filter(w => w.tags.includes('prioridade:critica')).length,\n        alta: workflows.filter(w => w.tags.includes('prioridade:alta')).length,\n        media: workflows.filter(w => w.tags.includes('prioridade:media')).length,\n        baixa: workflows.filter(w => w.tags.includes('prioridade:baixa')).length\n      };\n    }\n    \n    return relatorio;\n  },\n  \n  // Relatório de performance por tags\n  performancePorTags: async (periodo = '30d') => {\n    const response = await fetch(`/api/v1/analytics/tags/performance`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Authorization': 'Bearer YOUR_API_KEY'\n      },\n      body: JSON.stringify({\n        period: periodo,\n        groupBy: 'tags'\n      })\n    });\n    \n    return response.json();\n  }\n};\n
\n\n### Dashboard de Tags\n\n
javascript\n// Criar dashboard de tags\nconst dashboardTags = {\n  // Métricas principais\n  metricas: async () => {\n    const tags = await listarTags();\n    const workflows = await listarWorkflows();\n    \n    return {\n      totalTags: tags.length,\n      totalWorkflows: workflows.length,\n      workflowsComTags: workflows.filter(w => w.tags && w.tags.length > 0).length,\n      tagsMaisUsadas: await obterTagsMaisUsadas(),\n      tagsRecentes: await obterTagsRecentes()\n    };\n  },\n  \n  // Tags mais usadas\n  obterTagsMaisUsadas: async () => {\n    const workflows = await listarWorkflows();\n    const contagemTags = {};\n    \n    workflows.forEach(workflow => {\n      if (workflow.tags) {\n        workflow.tags.forEach(tag => {\n          contagemTags[tag] = (contagemTags[tag] || 0) + 1;\n        });\n      }\n    });\n    \n    return Object.entries(contagemTags)\n      .sort(([,a], [,b]) => b - a)\n      .slice(0, 10)\n      .map(([tag, count]) => ({ tag, count }));\n  },\n  \n  // Tags recentes\n  obterTagsRecentes: async () => {\n    const response = await fetch('/api/v1/tags/recent', {\n      method: 'GET',\n      headers: {\n        'Authorization': 'Bearer YOUR_API_KEY'\n      }\n    });\n    \n    return response.json();\n  }\n};\n
\n\n## Automação de Tags\n\n### Workflow: Aplicação Automática de Tags\n\n
mermaid\ngraph TD\n    A[Webhook: Novo Workflow Criado] --> B[Code: Analisar Conteúdo]\n    B --> C[Code: Determinar Tags]\n    C --> D[Code: Aplicar Tags]\n    D --> E[Code: Notificar Responsável]\n    E --> F[Send Email: Tags Aplicadas]\n
\n\n### Workflow: Limpeza de Tags\n\n
mermaid\ngraph TD\n    A[Schedule: Diário às 6h] --> B[Code: Listar Tags]\n    B --> C[Code: Identificar Tags Órfãs]\n    C --> D[Decision: Tags Órfãs?]\n    D -->|Sim| E[Code: Notificar Administrador]\n    D -->|Não| F[Code: Finalizar]\n    E --> G[Send Email: Tags para Revisão]\n
\n\n## Tags Específicas para Brasil\n\n### Tags de Compliance\n\n
javascript\n// Tags específicas para compliance brasileiro\nconst tagsCompliance = {\n  lgpd: {\n    nome: 'lgpd-compliant',\n    descricao: 'Workflow em conformidade com LGPD',\n    cor: '#4CAF50'\n  },\n  \n  nfe: {\n    nome: 'nfe-integration',\n    descricao: 'Integração com sistema NFe',\n    cor: '#2196F3'\n  },\n  \n  pix: {\n    nome: 'pix-processing',\n    descricao: 'Processamento de pagamentos PIX',\n    cor: '#FF9800'\n  },\n  \n  serasa: {\n    nome: 'serasa-consult',\n    descricao: 'Consulta de dados no Serasa',\n    cor: '#9C27B0'\n  }\n};\n
\n\n### Tags de Integrações Brasileiras\n\n
javascript\n// Tags para integrações específicas do Brasil\nconst tagsIntegracoesBR = {\n  receita: 'receita-federal',\n  viacep: 'viacep-integration',\n  correios: 'correios-tracking',\n  bancoCentral: 'banco-central-pix',\n  sefaz: 'sefaz-nfe',\n  serasa: 'serasa-credit',\n  spc: 'spc-consult',\n  caged: 'caged-integration'\n};\n\n// Aplicar tags de integração automaticamente\nconst aplicarTagsIntegracaoBR = async (workflowId) => {\n  const workflow = await buscarWorkflow(workflowId);\n  const tagsIntegracao = [];\n  \n  workflow.nodes.forEach(node => {\n    if (node.parameters && node.parameters.url) {\n      const url = node.parameters.url.toLowerCase();\n      \n      if (url.includes('receitaws.com.br')) {\n        tagsIntegracao.push('receita-federal');\n      }\n      \n      if (url.includes('viacep.com.br')) {\n        tagsIntegracao.push('viacep-integration');\n      }\n      \n      if (url.includes('correios.com.br')) {\n        tagsIntegracao.push('correios-tracking');\n      }\n      \n      if (url.includes('bcb.gov.br')) {\n        tagsIntegracao.push('banco-central-pix');\n      }\n    }\n  });\n  \n  if (tagsIntegracao.length > 0) {\n    await aplicarTags(workflowId, tagsIntegracao);\n  }\n  \n  return tagsIntegracao;\n};\n

Boas Práticas

Nomenclatura

  • Use nomes descritivos para tags
  • Mantenha consistência na nomenclatura
  • Evite tags muito específicas que não serão reutilizadas
  • Use hierarquia para organizar tags relacionadas

Organização

  • Limite o número de tags por workflow (máximo 5-7)
  • Use cores diferentes para categorias distintas
  • Revise tags regularmente para manter organização
  • Documente convenções de tags da equipe

Manutenção

  • Remova tags não utilizadas periodicamente
  • Consolide tags similares para evitar duplicação
  • Atualize tags quando workflows mudam
  • Treine a equipe nas convenções de tags

Troubleshooting

Problemas Comuns

Tags não aparecem:

  • Verificar permissões de usuário
  • Verificar se tags foram salvas corretamente
  • Verificar cache do navegador
  • Verificar configurações de exibição

Busca não funciona:

  • Verificar ortografia das tags
  • Verificar operador de busca (AND/OR)
  • Verificar se tags existem
  • Verificar permissões de acesso

Tags duplicadas:

  • Verificar convenções de nomenclatura
  • Consolidar tags similares
  • Implementar validação automática
  • Treinar equipe nas convenções

Recursos Adicionais

Documentação Oficial

Ferramentas Relacionadas

  • n8n CLI: Gerenciamento de tags via linha de comando
  • n8n API: Automação de tags programática
  • n8n Templates: Templates com tags pré-definidas

Próximo: IDs de Workflow - Entenda os identificadores únicos