{ "name": "📈 Relatório Diário | Métricas & KPIs", "nodes": [ { "parameters": { "rule": { "interval": [ { "field": "cronExpression", "expression": "0 8 * * *" } ] } }, "id": "cron-daily-report", "name": "Trigger Diário (8h)", "type": "n8n-nodes-base.cron", "typeVersion": 1, "position": [240, 300] }, { "parameters": { "jsCode": "// Configurar período do relatório (últimas 24h)\nconst now = new Date();\nconst yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n\n// Formatações de data\nconst reportConfig = {\n report_date: now.toLocaleDateString('pt-BR'),\n report_time: now.toLocaleTimeString('pt-BR'),\n period_start: yesterday.toISOString(),\n period_end: now.toISOString(),\n period_start_br: yesterday.toLocaleDateString('pt-BR'),\n period_end_br: now.toLocaleDateString('pt-BR'),\n report_id: `daily_report_${now.getFullYear()}${(now.getMonth()+1).toString().padStart(2,'0')}${now.getDate().toString().padStart(2,'0')}`,\n \n // Configurações de APIs\n apis: {\n krayin_base_url: 'https://crm.memudecore.com.br/api',\n n8n_base_url: 'http://n8n.memudecore.com.br/api/v1',\n evolution_base_url: 'https://evolution.memudecore.com.br/api'\n },\n \n // Métricas a coletar\n metrics_to_collect: [\n 'crm_leads_created',\n 'crm_deals_won',\n 'crm_revenue',\n 'whatsapp_messages',\n 'n8n_executions',\n 'system_uptime',\n 'backup_status'\n ]\n};\n\nreturn reportConfig;" }, "id": "prepare-report-config", "name": "Configurar Relatório", "type": "n8n-nodes-base.code", "typeVersion": 1, "position": [460, 300] }, { "parameters": { "method": "GET", "url": "={{$node[\"Configurar Relatório\"].json[\"apis\"][\"krayin_base_url\"]}}/leads", "authentication": "predefinedCredentialType", "nodeCredentialType": "krayin-api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "created_after", "value": "={{$node[\"Configurar Relatório\"].json[\"period_start\"]}}" }, { "name": "limit", "value": "1000" } ] }, "options": {} }, "id": "get-crm-leads", "name": "Buscar Leads CRM", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4, "position": [680, 200], "credentials": { "krayin-api": { "id": "krayin-crm-api", "name": "Krayin CRM API" } }, "continueOnFail": true }, { "parameters": { "method": "GET", "url": "={{$node[\"Configurar Relatório\"].json[\"apis\"][\"krayin_base_url\"]}}/deals", "authentication": "predefinedCredentialType", "nodeCredentialType": "krayin-api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "status", "value": "won" }, { "name": "closed_after", "value": "={{$node[\"Configurar Relatório\"].json[\"period_start\"]}}" } ] }, "options": {} }, "id": "get-crm-deals", "name": "Buscar Vendas CRM", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4, "position": [680, 300], "credentials": { "krayin-api": { "id": "krayin-crm-api", "name": "Krayin CRM API" } }, "continueOnFail": true }, { "parameters": { "command": "docker service ls --format \"table {{.Name}}\\t{{.Replicas}}\\t{{.Image}}\" | grep -E '(bookstack|krayin|n8n|evolution)'" }, "id": "get-system-status", "name": "Status dos Serviços", "type": "n8n-nodes-base.executeCommand", "typeVersion": 1, "position": [680, 400], "continueOnFail": true }, { "parameters": { "command": "find /backup -name \"*$(date -d yesterday +'%Y-%m-%d')*\" -type f | wc -l" }, "id": "check-backup-status", "name": "Verificar Backups", "type": "n8n-nodes-base.executeCommand", "typeVersion": 1, "position": [680, 500], "continueOnFail": true }, { "parameters": { "jsCode": "// Processar dados coletados de todas as fontes\nconst config = $node[\"Configurar Relatório\"].json;\n\n// Processar leads do CRM\nconst crmLeadsData = $node[\"Buscar Leads CRM\"].json || {};\nconst crmLeads = crmLeadsData.data || [];\nconst newLeadsCount = Array.isArray(crmLeads) ? crmLeads.length : 0;\n\n// Processar vendas do CRM \nconst crmDealsData = $node[\"Buscar Vendas CRM\"].json || {};\nconst crmDeals = crmDealsData.data || [];\nconst newDealsCount = Array.isArray(crmDeals) ? crmDeals.length : 0;\n\n// Calcular receita total\nconst totalRevenue = Array.isArray(crmDeals) ? \n crmDeals.reduce((sum, deal) => sum + (parseFloat(deal.amount) || 0), 0) : 0;\n\n// Processar status dos serviços\nconst systemStatus = $node[\"Status dos Serviços\"].json?.stdout || '';\nconst servicesUp = (systemStatus.match(/1\\/1/g) || []).length;\nconst totalServices = (systemStatus.split('\\n').filter(line => line.trim() !== '').length) - 1; // Remove header\n\n// Verificar backups\nconst backupCheck = $node[\"Verificar Backups\"].json?.stdout || '0';\nconst backupsCreated = parseInt(backupCheck.trim()) || 0;\n\n// Análise de leads\nconst leadsAnalysis = {\n sources: {},\n stages: {},\n high_value_count: 0\n};\n\nif (Array.isArray(crmLeads)) {\n crmLeads.forEach(lead => {\n // Contar por fonte\n const source = lead.source?.name || 'Não identificado';\n leadsAnalysis.sources[source] = (leadsAnalysis.sources[source] || 0) + 1;\n \n // Contar por estágio\n const stage = lead.stage?.name || 'Inicial';\n leadsAnalysis.stages[stage] = (leadsAnalysis.stages[stage] || 0) + 1;\n \n // Leads de alto valor (>= 5000)\n if (parseFloat(lead.lead_value || 0) >= 5000) {\n leadsAnalysis.high_value_count++;\n }\n });\n}\n\n// Formatação monetária\nconst formatCurrency = (value) => {\n return new Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(value);\n};\n\n// Determinar performance do dia\nconst getPerformanceStatus = () => {\n if (newLeadsCount >= 10 && newDealsCount >= 2) return { emoji: '🚀', text: 'EXCELENTE' };\n if (newLeadsCount >= 5 && newDealsCount >= 1) return { emoji: '✅', text: 'BOM' };\n if (newLeadsCount >= 2) return { emoji: '📊', text: 'REGULAR' };\n return { emoji: '⚠️', text: 'BAIXA' };\n};\n\nconst performance = getPerformanceStatus();\n\n// Montar relatório completo\nconst report = {\n // Informações gerais\n date: config.report_date,\n time: config.report_time,\n period: `${config.period_start_br} - ${config.period_end_br}`,\n report_id: config.report_id,\n \n // Métricas principais\n metrics: {\n new_leads: newLeadsCount,\n new_deals: newDealsCount,\n total_revenue: totalRevenue,\n formatted_revenue: formatCurrency(totalRevenue),\n services_up: servicesUp,\n total_services: totalServices,\n backups_created: backupsCreated,\n system_uptime_percent: totalServices > 0 ? Math.round((servicesUp / totalServices) * 100) : 0\n },\n \n // Análises\n analysis: {\n leads_sources: leadsAnalysis.sources,\n leads_stages: leadsAnalysis.stages,\n high_value_leads: leadsAnalysis.high_value_count,\n avg_deal_value: newDealsCount > 0 ? formatCurrency(totalRevenue / newDealsCount) : formatCurrency(0)\n },\n \n // Performance\n performance: performance,\n \n // Status de saúde do sistema\n system_health: {\n status: servicesUp === totalServices ? 'SAUDÁVEL' : 'ATENÇÃO',\n emoji: servicesUp === totalServices ? '💚' : '⚠️',\n color: servicesUp === totalServices ? '#28a745' : '#ffc107'\n },\n \n // Backup status\n backup_status: {\n status: backupsCreated > 0 ? 'OK' : 'FALHA',\n emoji: backupsCreated > 0 ? '✅' : '❌',\n count: backupsCreated\n }\n};\n\nreturn report;" }, "id": "process-report-data", "name": "Processar Dados Relatório", "type": "n8n-nodes-base.code", "typeVersion": 1, "position": [900, 300] }, { "parameters": { "channel": "#daily-reports", "text": "{{$node[\"Processar Dados Relatório\"].json[\"performance\"][\"emoji\"]}} **RELATÓRIO DIÁRIO** - {{$node[\"Processar Dados Relatório\"].json[\"date\"]}}", "attachments": [ { "color": "{{$node[\"Processar Dados Relatório\"].json[\"system_health\"][\"color\"]}}", "title": "📊 Resumo Executivo - MeMude Core", "fields": [ { "title": "🎯 Novos Leads", "value": "{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"new_leads\"]}}", "short": true }, { "title": "💰 Vendas Fechadas", "value": "{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"new_deals\"]}}", "short": true }, { "title": "💵 Receita Total", "value": "{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"formatted_revenue\"]}}", "short": true }, { "title": "💸 Ticket Médio", "value": "{{$node[\"Processar Dados Relatório\"].json[\"analysis\"][\"avg_deal_value\"]}}", "short": true }, { "title": "🚀 Leads Alto Valor", "value": "{{$node[\"Processar Dados Relatório\"].json[\"analysis\"][\"high_value_leads\"]}}", "short": true }, { "title": "📈 Performance", "value": "{{$node[\"Processar Dados Relatório\"].json[\"performance\"][\"text\"]}}", "short": true }, { "title": "{{$node[\"Processar Dados Relatório\"].json[\"system_health\"][\"emoji\"]}} Sistema", "value": "{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"services_up\"]}}/{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"total_services\"]}} serviços ({{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"system_uptime_percent\"]}}%)", "short": true }, { "title": "{{$node[\"Processar Dados Relatório\"].json[\"backup_status\"][\"emoji\"]}} Backups", "value": "{{$node[\"Processar Dados Relatório\"].json[\"backup_status\"][\"count\"]}} arquivos criados", "short": true } ], "actions": [ { "type": "button", "text": "📊 Ver CRM", "url": "https://crm.memudecore.com.br/admin/dashboard" }, { "type": "button", "text": "📋 Ver Docs", "url": "https://docs.memudecore.com.br" } ], "footer": "Relatório Automático MeMude Core", "ts": "{{Math.floor(Date.now() / 1000)}}" } ], "otherOptions": { "username": "Daily Report Bot", "icon_emoji": ":chart_with_upwards_trend:" } }, "id": "send-daily-report", "name": "Enviar Relatório Slack", "type": "n8n-nodes-base.slack", "typeVersion": 1, "position": [1120, 300], "credentials": { "slackApi": { "id": "slack-memude-workspace", "name": "Slack MeMude Workspace" } } }, { "parameters": { "conditions": { "number": [ { "value1": "={{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"new_leads\"]}}", "operation": "larger", "value2": 15 } ] } }, "id": "check-high-performance", "name": "Performance Alta?", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [1120, 500] }, { "parameters": { "channel": "#vendas", "text": "🎉 **DIA EXCEPCIONAL!** 🚀", "attachments": [ { "color": "#28a745", "title": "🏆 PERFORMANCE EXTRAORDINÁRIA DETECTADA", "text": "Parabéns à equipe! Tivemos um dia fantástico com **{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"new_leads\"]}} novos leads** e **{{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"formatted_revenue\"]}}** em receita!", "fields": [ { "title": "🎯 Meta Superada", "value": "Leads: {{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"new_leads\"]}} (Meta: 10)\\nReceita: {{$node[\"Processar Dados Relatório\"].json[\"metrics\"][\"formatted_revenue\"]}}", "short": false } ], "footer": "Continue o excelente trabalho! 💪", "ts": "{{Math.floor(Date.now() / 1000)}}" } ], "otherOptions": { "username": "🏆 Success Bot", "icon_emoji": ":trophy:" } }, "id": "send-celebration", "name": "Enviar Parabéns", "type": "n8n-nodes-base.slack", "typeVersion": 1, "position": [1340, 400], "credentials": { "slackApi": { "id": "slack-memude-workspace", "name": "Slack MeMude Workspace" } } }, { "parameters": { "jsCode": "// Gerar relatório detalhado para arquivo\nconst reportData = $node[\"Processar Dados Relatório\"].json;\n\n// Criar conteúdo markdown do relatório\nconst markdownReport = `# 📊 Relatório Diário MeMude Core\n\n**Data:** ${reportData.date} \n**Período:** ${reportData.period} \n**ID:** ${reportData.report_id}\n\n## 🎯 Métricas Principais\n\n| Métrica | Valor | Status |\n|---------|--------|--------|\n| 📈 Novos Leads | ${reportData.metrics.new_leads} | ${reportData.performance.emoji} ${reportData.performance.text} |\n| 💰 Vendas Fechadas | ${reportData.metrics.new_deals} | ${reportData.metrics.new_deals >= 1 ? '✅' : '⚠️'} |\n| 💵 Receita Total | ${reportData.metrics.formatted_revenue} | ${reportData.metrics.total_revenue > 0 ? '✅' : '⚠️'} |\n| 🎯 Leads Alto Valor | ${reportData.analysis.high_value_leads} | ${reportData.analysis.high_value_leads > 0 ? '🔥' : '📊'} |\n| 💸 Ticket Médio | ${reportData.analysis.avg_deal_value} | 📊 |\n\n## 🏗️ Status do Sistema\n\n| Componente | Status | Detalhes |\n|------------|--------|----------|\n| 🖥️ Serviços | ${reportData.system_health.emoji} ${reportData.system_health.status} | ${reportData.metrics.services_up}/${reportData.metrics.total_services} online (${reportData.metrics.system_uptime_percent}%) |\n| 💾 Backups | ${reportData.backup_status.emoji} ${reportData.backup_status.status} | ${reportData.backup_status.count} arquivos criados |\n\n## 📊 Análise de Leads\n\n### Por Fonte\n${Object.entries(reportData.analysis.leads_sources || {}).map(([source, count]) => `- **${source}:** ${count}`).join('\\n') || '- Nenhum lead registrado'}\n\n### Por Estágio\n${Object.entries(reportData.analysis.leads_stages || {}).map(([stage, count]) => `- **${stage}:** ${count}`).join('\\n') || '- Nenhum estágio registrado'}\n\n---\n\n*Relatório gerado automaticamente em ${reportData.date} às ${reportData.time}*\n*Sistema: N8N Automation Platform | MeMude Core*`;\n\nreturn {\n markdown_content: markdownReport,\n filename: `relatorio-diario-${reportData.report_id}.md`,\n summary: {\n leads: reportData.metrics.new_leads,\n revenue: reportData.metrics.total_revenue,\n performance: reportData.performance.text,\n system_health: reportData.system_health.status\n }\n};" }, "id": "generate-file-report", "name": "Gerar Arquivo Relatório", "type": "n8n-nodes-base.code", "typeVersion": 1, "position": [1340, 600] }, { "parameters": { "command": "mkdir -p /reports/daily && echo '{{$node[\"Gerar Arquivo Relatório\"].json[\"markdown_content\"]}}' > '/reports/daily/{{$node[\"Gerar Arquivo Relatório\"].json[\"filename\"]}}'" }, "id": "save-report-file", "name": "Salvar Relatório", "type": "n8n-nodes-base.executeCommand", "typeVersion": 1, "position": [1560, 600] } ], "connections": { "Trigger Diário (8h)": { "main": [ [ { "node": "Configurar Relatório", "type": "main", "index": 0 } ] ] }, "Configurar Relatório": { "main": [ [ { "node": "Buscar Leads CRM", "type": "main", "index": 0 }, { "node": "Buscar Vendas CRM", "type": "main", "index": 0 }, { "node": "Status dos Serviços", "type": "main", "index": 0 }, { "node": "Verificar Backups", "type": "main", "index": 0 } ] ] }, "Buscar Leads CRM": { "main": [ [ { "node": "Processar Dados Relatório", "type": "main", "index": 0 } ] ] }, "Buscar Vendas CRM": { "main": [ [ { "node": "Processar Dados Relatório", "type": "main", "index": 0 } ] ] }, "Status dos Serviços": { "main": [ [ { "node": "Processar Dados Relatório", "type": "main", "index": 0 } ] ] }, "Verificar Backups": { "main": [ [ { "node": "Processar Dados Relatório", "type": "main", "index": 0 } ] ] }, "Processar Dados Relatório": { "main": [ [ { "node": "Enviar Relatório Slack", "type": "main", "index": 0 }, { "node": "Performance Alta?", "type": "main", "index": 0 }, { "node": "Gerar Arquivo Relatório", "type": "main", "index": 0 } ] ] }, "Performance Alta?": { "main": [ [ { "node": "Enviar Parabéns", "type": "main", "index": 0 } ] ] }, "Gerar Arquivo Relatório": { "main": [ [ { "node": "Salvar Relatório", "type": "main", "index": 0 } ] ] } }, "active": true, "settings": { "timezone": "America/Sao_Paulo", "saveManualExecutions": true }, "createdAt": "2026-01-21T20:00:00.000Z", "updatedAt": "2026-01-21T20:00:00.000Z", "id": "relatorio-diario-completo", "tags": [ { "id": "reports", "name": "Relatórios" }, { "id": "analytics", "name": "Analytics" }, { "id": "daily", "name": "Diário" } ] }