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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\njavascript\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\nmermaid\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\nmermaid\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\njavascript\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\njavascript\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