8
n8n 中文网amn8n.com

自动化从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

分类

-
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 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)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量29
分类-
节点类型15
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Rahul Joshi

Rahul Joshi

@rahul08

Rahul 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 查看

分享此工作流