自动化从ClickUp和GoHighLevel生成每日结束报告到Slack、Email和Google云端硬盘
高级
这是一个自动化工作流,包含 29 个节点。主要使用 If, Code, Merge, Slack, ClickUp 等节点。 从ClickUp和GoHighLevel生成AI驱动的每日结束报告到多渠道
前置要求
- •Slack Bot Token 或 Webhook URL
- •Google Drive API 凭证
- •OpenAI API Key
使用的节点 (29)
分类
-
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "qxecimVbLMgxfjK3",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "自动化从 ClickUp 和 GoHighLevel 生成每日结束报告到 Slack、Email 和 Google Drive",
"tags": [],
"nodes": [
{
"id": "bd6d56ca-edb5-44a2-a281-0dccc2103891",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4512,
-496
],
"parameters": {
"color": 6,
"width": 389,
"height": 753,
"content": "## 📊 自动化从 ClickUp 和 GoHighLevel 生成每日结束报告到 Slack、Email 和 Google Drive"
},
"typeVersion": 1
},
{
"id": "379fe532-1b85-4c6d-ae9b-47a925359848",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3920,
-464
],
"parameters": {
"width": 318,
"height": 358,
"content": "## ⏰ 步骤 1:计划触发器"
},
"typeVersion": 1
},
{
"id": "ea406065-c358-4fcf-a38a-604312920c35",
"name": "便签 2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3536,
-720
],
"parameters": {
"width": 343,
"height": 497,
"content": "## 📋 步骤 2:获取 ClickUp 任务"
},
"typeVersion": 1
},
{
"id": "972b5e17-42e1-49b5-9aac-a4d01ada89d4",
"name": "便签 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3472,
160
],
"parameters": {
"width": 343.2558139534883,
"height": 339.5348837209302,
"content": "## 💼 步骤 3:获取 GHL 商机"
},
"typeVersion": 1
},
{
"id": "1646ef95-15d9-422d-9419-d84a5a9603f1",
"name": "便签 4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3168,
-528
],
"parameters": {
"width": 303,
"height": 374,
"content": "## 🔀 步骤 4:合并数据源"
},
"typeVersion": 1
},
{
"id": "37efa8ec-2c49-4dd7-a2bb-11adf09b5ded",
"name": "便签 5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3040,
96
],
"parameters": {
"width": 343.2558139534883,
"height": 400,
"content": "## 🔄 步骤 5:转换和构建数据"
},
"typeVersion": 1
},
{
"id": "2fb72697-f98e-484c-8d9f-fac71da8c90e",
"name": "便签6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2784,
-640
],
"parameters": {
"width": 343,
"height": 501,
"content": "## 🤖 步骤 6:AI 报告生成"
},
"typeVersion": 1
},
{
"id": "a7000d6c-e0ee-40c6-968e-f233b120e33e",
"name": "便签7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2320,
48
],
"parameters": {
"width": 343,
"height": 492,
"content": "## 📤 步骤 7:格式化以进行分发"
},
"typeVersion": 1
},
{
"id": "8d3b5528-a03f-4298-a336-d1cb84324f1e",
"name": "便签8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2144,
-736
],
"parameters": {
"width": 343,
"height": 413,
"content": "## 🔀 步骤 8:路由到渠道"
},
"typeVersion": 1
},
{
"id": "ae1581a1-f411-4a51-a557-875e97535b8c",
"name": "### 替换 Airtable 连接",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1632,
-768
],
"parameters": {
"width": 343,
"height": 432,
"content": "## 💬 步骤 9A:发送到 Slack"
},
"typeVersion": 1
},
{
"id": "4614de3e-b2e4-4954-9567-32f5345a7305",
"name": "便签10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1424,
-288
],
"parameters": {
"width": 343.2558139534883,
"height": 400,
"content": "## 📧 步骤 9B:发送邮件"
},
"typeVersion": 1
},
{
"id": "c8166ad6-7729-40c4-a1ac-cc5b8e7d76a9",
"name": "便签11",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1584,
272
],
"parameters": {
"width": 343,
"height": 448,
"content": "## 📁 步骤 9C:上传到 Google Drive"
},
"typeVersion": 1
},
{
"id": "8d5f5a2a-c6a7-455c-a570-c4266e64179b",
"name": "计划 EOD 报告触发器",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-3568,
-112
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 18 * * 1-5"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "745ec334-f971-4a2f-9433-bcd0ae03942a",
"name": "合并所有数据源",
"type": "n8n-nodes-base.merge",
"position": [
-3120,
-112
],
"parameters": {},
"typeVersion": 2.1
},
{
"id": "219dad0b-4101-4203-875f-cfbb3124d9b5",
"name": "转换和构建数据",
"type": "n8n-nodes-base.code",
"position": [
-2896,
-112
],
"parameters": {
"jsCode": "// n8n Code Node - Transform Merged ClickUp + GHL Data & Aggregate\n\nconst transformedItems = [];\n\n// Process each item from the merged input\nfor (const item of $input.all()) {\n const data = item.json;\n \n // Check if this is a ClickUp task (has custom_id, creator, project fields)\n // or a GHL opportunity (has pipelineId, monetaryValue, contactId)\n const isClickUpTask = data.hasOwnProperty('custom_id') && \n data.hasOwnProperty('creator') && \n data.hasOwnProperty('project');\n \n if (isClickUpTask) {\n // Transform ClickUp task to GHL opportunity format\n const transformedItem = {\n // Use ClickUp task ID as the opportunity ID\n id: data.id,\n \n // Use task name as opportunity name\n name: data.name,\n \n // Set default monetary value (you can extract from custom fields if available)\n monetaryValue: extractMonetaryValue(data.custom_fields),\n \n // Map ClickUp project to pipeline ID\n pipelineId: data.project?.id || \"YOUR_PIPELINE_ID\",\n \n // Map ClickUp status to pipeline stage\n pipelineStageId: data.status?.id || null,\n pipelineStageUId: data.status?.id || null,\n \n // Map first assignee ID\n assignedTo: data.assignees?.[0]?.id?.toString() || null,\n \n // Map ClickUp status type to GHL status\n status: mapClickUpStatusToGHL(data.status?.type),\n \n // Source information\n source: \"ClickUp\",\n \n // Timestamps - convert from milliseconds to ISO string\n lastStatusChangeAt: data.date_updated ? new Date(parseInt(data.date_updated)).toISOString() : null,\n lastStageChangeAt: data.date_updated ? new Date(parseInt(data.date_updated)).toISOString() : null,\n createdAt: data.date_created ? new Date(parseInt(data.date_created)).toISOString() : null,\n updatedAt: data.date_updated ? new Date(parseInt(data.date_updated)).toISOString() : null,\n \n // Index version\n indexVersion: 1,\n \n // Use first assignee as contact ID\n contactId: data.assignees?.[0]?.id?.toString() || null,\n \n // Location from team ID\n locationId: data.team_id || \"YOUR_LOCATION_ID\",\n \n // Custom fields\n customFields: data.custom_fields || [],\n \n // Lost reason\n lostReasonId: null,\n \n // Followers from watchers\n followers: data.watchers?.map(w => w.id.toString()) || [],\n \n // Relations - create from assignees\n relations: data.assignees?.map((assignee, index) => ({\n associationId: \"OPPORTUNITIES_CONTACTS_ASSOCIATION\",\n relationId: data.id,\n primary: index === 0,\n objectKey: \"contact\",\n recordId: assignee.id.toString(),\n fullName: assignee.username,\n contactName: assignee.username,\n companyName: data.project?.name || null,\n email: assignee.email,\n phone: null,\n tags: data.tags?.map(t => t.name) || [],\n attributed: null\n })) || [],\n \n // Primary contact from first assignee\n contact: data.assignees?.[0] ? {\n id: data.assignees[0].id.toString(),\n name: data.assignees[0].username,\n companyName: data.project?.name || null,\n email: data.assignees[0].email,\n phone: null,\n tags: data.tags?.map(t => t.name) || [],\n score: []\n } : null,\n \n // Sort fields\n sort: [\n parseInt(data.date_created),\n data.assignees?.[0]?.id?.toString() || \"\"\n ],\n \n // Attributions\n attributions: [{\n utmSessionSource: \"ClickUp\",\n isFirst: true,\n medium: \"integration\"\n }]\n };\n \n transformedItems.push(transformedItem);\n \n } else {\n // This is already a GHL opportunity - pass it through as-is\n transformedItems.push(data);\n }\n}\n\n// Helper function to map ClickUp status types to GHL status\nfunction mapClickUpStatusToGHL(statusType) {\n if (!statusType) return 'open';\n \n const statusMap = {\n 'closed': 'won',\n 'complete': 'won',\n 'done': 'won',\n 'open': 'open',\n 'in progress': 'open',\n 'to do': 'open',\n 'cancelled': 'abandoned',\n 'blocked': 'abandoned',\n 'lost': 'lost'\n };\n \n return statusMap[statusType.toLowerCase()] || 'open';\n}\n\n// Helper function to extract monetary value from custom fields\nfunction extractMonetaryValue(customFields) {\n if (!customFields || customFields.length === 0) return 0;\n \n // Look for common field names that might contain monetary value\n const moneyField = customFields.find(f => \n f.name && (\n f.name.toLowerCase().includes('value') ||\n f.name.toLowerCase().includes('amount') ||\n f.name.toLowerCase().includes('price') ||\n f.name.toLowerCase().includes('deal')\n )\n );\n \n return moneyField?.value || 0;\n}\n\n// AGGREGATION: Combine all transformed items into a single output\n// This ensures the AI Agent receives ONE item with all data\nconst aggregatedOutput = {\n totalItems: transformedItems.length,\n timestamp: new Date().toISOString(),\n opportunities: transformedItems,\n summary: {\n totalOpportunities: transformedItems.length,\n byStatus: {},\n totalMonetaryValue: 0,\n bySource: {}\n }\n};\n\n// Calculate summary statistics\ntransformedItems.forEach(item => {\n // Count by status\n aggregatedOutput.summary.byStatus[item.status] = \n (aggregatedOutput.summary.byStatus[item.status] || 0) + 1;\n \n // Sum monetary values\n aggregatedOutput.summary.totalMonetaryValue += item.monetaryValue || 0;\n \n // Count by source\n const source = item.source || 'GHL';\n aggregatedOutput.summary.bySource[source] = \n (aggregatedOutput.summary.bySource[source] || 0) + 1;\n});\n\n// Return single aggregated item for AI Agent\nreturn [{ json: aggregatedOutput }];"
},
"typeVersion": 2
},
{
"id": "1d93fe28-b9f0-4ff1-a169-542dae1f1783",
"name": "格式化报告以进行分发",
"type": "n8n-nodes-base.code",
"position": [
-2208,
-112
],
"parameters": {
"jsCode": "// Extract the output data from your input format\nconst inputData = $input.first().json;\nconst output = inputData.output;\n\n// Create routing objects based on your end-of-day report structure\nconst slackReport = {\n type: 'slack',\n title: output.title,\n summary: output.briefSummary,\n wins: output.wins,\n keyMetrics: output.keyMetrics,\n blockers: output.blockers,\n actionItems: output.actionItems,\n timestamp: new Date().toISOString(),\n icon: '📊'\n};\n\nconst emailReport = {\n type: 'email',\n subject: output.title,\n body: {\n title: output.title,\n briefSummary: output.briefSummary,\n wins: output.wins,\n keyMetrics: output.keyMetrics,\n blockers: output.blockers,\n actionItems: output.actionItems\n },\n timestamp: new Date().toISOString()\n};\n\nconst googleDriveReport = {\n type: 'google_drive',\n filename: `EOD_Report_${new Date().toISOString().split('T')[0]}.txt`,\n content: `\n═══════════════════════════════════════════════════════════════════\n${output.title}\n═══════════════════════════════════════════════════════════════════\n\n📋 BRIEF SUMMARY\n─────────────────────────────────────────────────────────────────\n${output.briefSummary}\n\n✅ WINS\n─────────────────────────────────────────────────────────────────\n${output.wins}\n\n📊 KEY METRICS\n─────────────────────────────────────────────────────────────────\n${output.keyMetrics}\n\n⚠️ BLOCKERS\n─────────────────────────────────────────────────────────────────\n${output.blockers}\n\n🎯 ACTION ITEMS\n─────────────────────────────────────────────────────────────────\n${output.actionItems}\n\nGenerated: ${new Date().toISOString()}\n═══════════════════════════════════════════════════════════════════\n `,\n timestamp: new Date().toISOString(),\n mimeType: 'text/plain'\n};\n\n// Return all three routing objects\nreturn [\n { json: slackReport },\n { json: emailReport },\n { json: googleDriveReport }\n];"
},
"typeVersion": 2
},
{
"id": "77d78b5e-49f6-4779-8828-344332a262ee",
"name": "路由到 Slack",
"type": "n8n-nodes-base.if",
"position": [
-1984,
-304
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "334e8803-cf37-4a69-9a74-dc77d4541f8c",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.type }}",
"rightValue": "slack"
}
]
}
},
"typeVersion": 2
},
{
"id": "7ad743bb-a433-429c-a894-3dfef643ce2d",
"name": "路由到 Email",
"type": "n8n-nodes-base.if",
"position": [
-1984,
-112
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8b96c805-abe1-4588-a043-53c4ffeee9f3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.type }}",
"rightValue": "email"
}
]
}
},
"typeVersion": 2
},
{
"id": "736cd539-135a-40e9-92a3-f2cc1d17e7e8",
"name": "路由到 Google Drive",
"type": "n8n-nodes-base.if",
"position": [
-1984,
96
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a78ce4a7-5624-4f2b-9606-3eb64119a671",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.type }}",
"rightValue": "google_drive"
}
]
}
},
"typeVersion": 2
},
{
"id": "9275db81-48b1-493b-8bf9-e581e814a33f",
"name": "发送 Slack 消息",
"type": "n8n-nodes-base.slack",
"position": [
-1760,
-320
],
"webhookId": "8be74d53-9687-40f1-a84b-09a85a145aac",
"parameters": {
"text": "=*Title:*\n{{ $json.title }} \n\n*Summary:*\n{{ $json.summary }} \n\n*Wins:*\n{{ $json.wins }} \n\n*Key Metrics:*\n{{ $json.keyMetrics }} \n\n*Blockers:*\n{{ $json.blockers }} \n\n*ActionItems:*\n{{ $json.actionItems }}\n\n",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_CHANNEL_ID",
"cachedResultName": "Select your channel"
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"id": "rNqvWj9TfChPVRYY",
"name": "Slack account vivek"
}
},
"typeVersion": 2.1
},
{
"id": "447a40d6-4f69-4b6c-a239-62c595941a56",
"name": "发送邮件报告",
"type": "n8n-nodes-base.emailSend",
"position": [
-1760,
-128
],
"webhookId": "8f1199fc-1c63-4d9f-b5af-c632cf55e1e0",
"parameters": {
"html": "=<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n body {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n line-height: 1.6;\n color: #333;\n background-color: #f4f4f4;\n margin: 0;\n padding: 0;\n }\n .container {\n max-width: 700px;\n margin: 0 auto;\n background-color: #ffffff;\n padding: 0;\n }\n .header {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n padding: 30px;\n text-align: center;\n }\n .header h1 {\n margin: 0;\n font-size: 28px;\n font-weight: 600;\n }\n .header p {\n margin: 8px 0 0 0;\n font-size: 14px;\n opacity: 0.9;\n }\n .content {\n padding: 30px;\n }\n .section {\n margin-bottom: 25px;\n }\n .section-title {\n font-size: 16px;\n font-weight: 700;\n color: #667eea;\n margin: 0 0 15px 0;\n padding-bottom: 10px;\n border-bottom: 2px solid #f0f0f0;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .icon {\n font-size: 18px;\n }\n .summary-text {\n background-color: #f9f9f9;\n padding: 15px;\n border-left: 4px solid #667eea;\n border-radius: 4px;\n font-size: 14px;\n line-height: 1.7;\n }\n .wins-box {\n background-color: #f0fdf4;\n padding: 15px;\n border-left: 4px solid #10b981;\n border-radius: 4px;\n font-size: 14px;\n line-height: 1.7;\n }\n .blockers-box {\n background-color: #fef3c7;\n padding: 15px;\n border-left: 4px solid #f59e0b;\n border-radius: 4px;\n font-size: 14px;\n line-height: 1.7;\n }\n .metrics-text {\n background-color: #f9f9f9;\n padding: 15px;\n border-left: 4px solid #667eea;\n border-radius: 4px;\n font-size: 14px;\n line-height: 1.7;\n }\n .action-items {\n background-color: #f9f9f9;\n padding: 15px;\n border-left: 4px solid #667eea;\n border-radius: 4px;\n font-size: 14px;\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n .footer {\n background-color: #f9f9f9;\n padding: 20px;\n text-align: center;\n font-size: 12px;\n color: #999;\n border-top: 1px solid #e0e0e0;\n }\n .footer p {\n margin: 5px 0;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>📊 {{ $json.body.title }}</h1>\n <p>Generated on {{ $json.timestamp }}</p>\n </div>\n <div class=\"content\">\n <div class=\"section\">\n <div class=\"section-title\">\n <span class=\"icon\">📋</span>\n Brief Summary\n </div>\n <div class=\"summary-text\">\n {{ $json.body.briefSummary }}\n </div>\n </div>\n <div class=\"section\">\n <div class=\"section-title\">\n <span class=\"icon\">✅</span>\n Wins\n </div>\n <div class=\"wins-box\">\n {{ $json.body.wins }}\n </div>\n </div>\n <div class=\"section\">\n <div class=\"section-title\">\n <span class=\"icon\">📊</span>\n Key Metrics\n </div>\n <div class=\"metrics-text\">\n {{ $json.body.keyMetrics }}\n </div>\n </div>\n <div class=\"section\">\n <div class=\"section-title\">\n <span class=\"icon\">⚠️</span>\n Blockers\n </div>\n <div class=\"blockers-box\">\n {{ $json.body.blockers }}\n </div>\n </div>\n <div class=\"section\">\n <div class=\"section-title\">\n <span class=\"icon\">🎯</span>\n Action Items\n </div>\n <div class=\"action-items\">\n {{ $json.body.actionItems }}\n </div>\n </div>\n </div>\n <div class=\"footer\">\n <p><strong>End-of-Day Summary Report</strong></p>\n <p>This is an automated report generated by N8N Workflow</p>\n <p>Do not reply to this email</p>\n </div>\n </div>\n</body>\n</html>",
"options": {},
"subject": "={{ $json.subject }}",
"toEmail": "team@yourcompany.com",
"fromEmail": "noreply@yourcompany.com"
},
"credentials": {
"smtp": {
"id": "gJdU446NGTfpXScn",
"name": "SMTP account 2"
}
},
"typeVersion": 2.1
},
{
"id": "a2dcf9df-2d0c-4aa3-ab95-315b3ba5a617",
"name": "上传报告到 Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-1536,
80
],
"parameters": {
"name": "={{ $('Route to Google Drive').item.json.filename }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
}
},
"typeVersion": 3
},
{
"id": "53b786aa-1dfb-428c-b4d7-902c4d65b82b",
"name": "获取 GHL 已赢得商机",
"type": "n8n-nodes-base.highLevel",
"position": [
-3344,
-16
],
"parameters": {
"limit": 100,
"filters": {
"status": "won"
},
"resource": "opportunity",
"operation": "getAll",
"requestOptions": {}
},
"typeVersion": 2
},
{
"id": "37bf0171-f463-42bf-a7bf-3664fef59f3f",
"name": "结构化输出解析器",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-2416,
128
],
"parameters": {
"jsonSchemaExample": "{\n \"title\": \"\",\n \"briefSummary\": \"\",\n \"wins\": \"\",\n \"keyMetrics\": \"\",\n \"blockers\": \"\",\n \"actionItems\":\"\"\n}\n"
},
"typeVersion": 1.3
},
{
"id": "0471b16d-770a-479e-90a6-44931fa8a62d",
"name": "Azure OpenAI 聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
-2672,
128
],
"parameters": {
"model": "gpt-4o",
"options": {}
},
"typeVersion": 1
},
{
"id": "63437c56-ea42-4b38-a6f9-9fb1d37e1027",
"name": "简单记忆",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-2544,
128
],
"parameters": {
"sessionKey": "\"eod_report_generator\"",
"sessionIdType": "customKey",
"contextWindowLength": 7
},
"typeVersion": 1.3
},
{
"id": "65dba1ea-9525-48b3-ba77-47eef856b341",
"name": "AI Agent:生成 EOD 报告",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-2624,
-112
],
"parameters": {
"text": "=You are given the following aggregated End-of-Day data from ClickUp (task management) and GHL (sales pipeline):\n\n{{ JSON.stringify($json.opportunities || $json, null, 2) }}\n\nPlease analyze this data and generate a structured End-of-Day (EOD) summary report.\n\n**Analysis Guidelines:**\n\n**For ClickUp Tasks:**\n- Count tasks by status (complete, in progress, blocked, etc.)\n- Calculate total time spent across all tasks\n- Identify completed tasks as wins\n- Flag blocked or delayed tasks as blockers\n- Note team members with completed work\n\n**For GHL Opportunities:**\n- Count opportunities by status (won, open, lost, abandoned)\n- Sum total monetary value of won deals\n- Identify new opportunities created today\n- Note high-value deals in progress\n- Track conversion rates if applicable\n",
"options": {
"systemMessage": "=You are an expert executive assistant AI specialized in creating comprehensive End-of-Day (EOD) summary reports.\n\nYour task is to analyze aggregated data from two systems:\n1. **ClickUp Tasks**: Project management tasks with status, assignees, time tracking, and completion details\n2. **GHL Opportunities**: Sales pipeline data with deals, monetary values, stages, and contact information\n\n**Your responsibilities:**\n- Analyze the combined data from both systems\n- Extract key metrics, wins, blockers, and action items\n- Identify patterns and trends across tasks and opportunities\n- Highlight team member contributions and achievements\n- Flag any issues or blockers that need attention\n- Provide actionable next steps\n\n**Output Requirements:**\n- Structure your response as valid JSON matching the provided schema\n- Be concise, professional, and actionable\n- Use specific numbers and metrics from the data\n- Focus on insights, not just data repetition\n- Ensure all arrays contain strings, not objects\n- Keep each item brief (1-2 sentences maximum)\n\n**Data Structure:**\n- ClickUp tasks will have fields like: id, name, status, assignees, time_spent, date_created, date_updated, project\n- GHL opportunities will have fields like: id, name, monetaryValue, status, pipelineStageId, contact, source\n\nGenerate a comprehensive but concise EOD report based on this combined dataset."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.1
},
{
"id": "46add9d4-fd38-4d52-aeac-22b47796b6d2",
"name": "获取今天的 ClickUp 任务",
"type": "n8n-nodes-base.clickUp",
"position": [
-3344,
-208
],
"parameters": {
"list": "YOUR_LIST_ID",
"team": "YOUR_TEAM_ID",
"space": "YOUR_SPACE_ID",
"folder": "YOUR_FOLDER_ID",
"filters": {
"subtasks": true,
"dueDateGt": "={{ $today.minus({ days: 1 }).toFormat('yyyy-MM-dd') }}",
"dueDateLt": "={{ $today.toFormat('yyyy-MM-dd') }}"
},
"operation": "getAll",
"authentication": "oAuth2"
},
"typeVersion": 1
},
{
"id": "4d12ff96-2f31-4984-8762-8b54519843ac",
"name": "转换为文件",
"type": "n8n-nodes-base.convertToFile",
"position": [
-1760,
80
],
"parameters": {
"options": {},
"operation": "toJson"
},
"typeVersion": 1.1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "2635cb23-0e0e-4ee1-885e-5ff809150414",
"connections": {
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent: Generate EOD Report",
"type": "ai_memory",
"index": 0
}
]
]
},
"Route to Email": {
"main": [
[
{
"node": "Send Email Report",
"type": "main",
"index": 0
}
]
]
},
"Route to Slack": {
"main": [
[
{
"node": "Send Slack Message",
"type": "main",
"index": 0
}
]
]
},
"Convert to File": {
"main": [
[
{
"node": "Upload Report to Google Drive",
"type": "main",
"index": 0
}
]
]
},
"Route to Google Drive": {
"main": [
[
{
"node": "Convert to File",
"type": "main",
"index": 0
}
]
]
},
"Merge All Data Sources": {
"main": [
[
{
"node": "Transform and Structure Data",
"type": "main",
"index": 0
}
]
]
},
"Azure OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent: Generate EOD Report",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent: Generate EOD Report",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Fetch GHL Won Opportunities": {
"main": [
[
{
"node": "Merge All Data Sources",
"type": "main",
"index": 1
}
]
]
},
"Schedule EOD Report Trigger": {
"main": [
[
{
"node": "Fetch GHL Won Opportunities",
"type": "main",
"index": 0
},
{
"node": "Fetch ClickUp Tasks for Today",
"type": "main",
"index": 0
}
]
]
},
"Transform and Structure Data": {
"main": [
[
{
"node": "AI Agent: Generate EOD Report",
"type": "main",
"index": 0
}
]
]
},
"AI Agent: Generate EOD Report": {
"main": [
[
{
"node": "Format Reports for Distribution",
"type": "main",
"index": 0
}
]
]
},
"Fetch ClickUp Tasks for Today": {
"main": [
[
{
"node": "Merge All Data Sources",
"type": "main",
"index": 0
}
]
]
},
"Format Reports for Distribution": {
"main": [
[
{
"node": "Route to Slack",
"type": "main",
"index": 0
},
{
"node": "Route to Email",
"type": "main",
"index": 0
},
{
"node": "Route to Google Drive",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
使用GPT-4自动化从ClickUp到Slack和Gmail的每日晨报生成
使用GPT-4o从ClickUp生成AI驱动的晨报并发送至Slack和Gmail
If
Code
Gmail
+9
27 节点Rahul Joshi
客户入职帮助请求(Typeform 到 Gmail 和 Sheets)
客户入职帮助请求(Typeform 到 Gmail 和 Sheets)
If
Code
Gmail
+10
28 节点Rahul Joshi
内容创作
从Monday.com和Jira到Outlook的AI驱动反馈分类与报告
使用Azure GPT-4、Jira任务和Outlook报告分析来自Monday.com的客户反馈
Set
Code
Jira
+12
27 节点Rahul Joshi
从 Stripe 支付自动交付模板给客户
使用Stripe、GPT-4o和Gmail的自动化模板交付系统
If
Code
Gmail
+12
44 节点Rahul Joshi
客户关系管理
基于AI的邮件分诊:从Gmail到Slack和Sheets
集成Gmail、GPT-4、Slack和Google Sheets的智能邮件分诊
If
Code
Slack
+7
34 节点Rahul Joshi
智能线索标记与路由
基于HighLevel和Azure GPT-4o-mini的AI驱动线索分类与路由
If
Code
Email Send
+5
17 节点Rahul Joshi
潜在客户开发
工作流信息
难度等级
高级
节点数量29
分类-
节点类型15
作者
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
外部链接
在 n8n.io 查看 →
分享此工作流