{
  "workflow": {
    "id": 9146,
    "name": "AI-powered meeting minutes with GPT-4, task assignment & multichannel distribution",
    "views": 219,
    "recentViews": 0,
    "totalViews": 219,
    "createdAt": "2025-10-01T08:41:34.163Z",
    "description": "# Meeting Minutes & Action Item Tracker\n\nFully automated meeting documentation workflow that uses AI to transform raw transcripts into professional PDFs and actionable tasks.\n\n## Features\n\n- AI-powered summary generation (GPT-4)\n- Automatic action item extraction with assignees, deadlines, and priorities\n- Professional PDF generation with custom styling\n- Multi-channel distribution (Email, Slack, Google Drive)\n- Task creation in Google Tasks\n- Personalized notifications to each assignee\n- Deadline tracking and urgency detection\n\n## Setup Instructions\n\n## REQUIRED CREDENTIALS:\n1. **OpenAI API** - Get from ```https://platform.openai.com```\n2. **Gmail OAuth2** - Connect your Google account\n3. **Google Drive OAuth2** - Same Google account\n4. **Google Tasks OAuth2** - Same Google account\n5. **Slack OAuth2** - Connect your workspace\n6. **htmlcsstopdf API** - Get from ```https://www.htmlcsspdf.com```\n\n## CONFIGURATION STEPS:\n\n1. **WEBHOOK**: Note your webhook URL after activation\n\n2. **EMAIL NODES**:\n   - **\"Email All Participants\"**: Uses participants array from input\n   - **\"Send Individual Task Emails\"**: Change @yourcompany.com to your domain\n\n3. **GOOGLE DRIVE**:\n   - Select folder where PDFs should be stored\n   - Recommended: Create **\"Meeting Minutes\"** folder\n\n4. **SLACK**:\n   - Select channel for team notifications\n   - Recommended: Create **#meeting-notes** channel\n\n5. **GOOGLE TASKS**:\n   - Select task list where tasks should be created\n   - Default list works fine\n\n## TESTING:\n1. Use the webhook URL with sample meeting data\n2. Check execution log for any errors\n3. Verify PDF in Google Drive\n4. Check emails were sent\n5. Confirm tasks created in Google Tasks\n\n\n## Example Input Format\n\n\n**POST** : ```https://your-n8n-instance.com/webhook/meeting-minutes```\n\n**Headers**:\n- Content-Type: application/json\n\n- Body:\n```\n{\n  \"title\": \"Weekly Team Standup\",\n  \"date\": \"2025-09-29\",\n  \"participants\": [\n    \"john@company.com\",\n    \"sarah@company.com\",\n    \"joe@company.com\"\n  ],\n  \"duration\": \"30 minutes\",\n  \"transcript\": \"John started the meeting by discussing the progress on the API development. Sarah mentioned that she's working on the dashboard and needs to prepare mockups by Thursday. The team agreed that Sarah will review the API documentation before the client demo on Friday. Akshita confirmed she finished the database schema redesign and needs to schedule a meeting with DevOps team by next Monday to discuss production deployment.\"\n}\n```\nThis will generate:\n- Professional PDF with summary and action items\n- Emails to all participants\n- Individual task emails to John, Sarah, and Joe\n- Tasks in Google Tasks\n- Slack notification\n\n## Output\n\nAfter execution, you'll get:\n1. **Professional PDF** stored in **Google Drive**\n2. Email sent to all participants with meeting overview\n3. Individual emails to **each assignee** with their tasks\n4. **Slack notification** with **summary and download link**\n5. Tasks created in **Google Tasks** with deadlines\n\n## CUSTOMIZATION:\n- Modify PDF styling in **\"Generate PDF Document\"** node\n- Adjust **email templates** in **Gmail** nodes\n- Change **AI prompts in OpenAI nodes** for different output\n- Modify priority/deadline logic in **\"Parse and Enrich Data\"**\n\n## Troubleshooting\n\n**Workflow stops at validation:**\n- Ensure **transcript has &gt;50 words**\n- Check that **webhook payload** is correctly **formatted**\n\n**No PDF generated:**\n- Verify **htmlcsstopdf API** credentials\n- Check **API** usage limits\n\n**Tasks not created:**\n- Verify deadline format is **YYYY-MM-DD**\n- Check **Google Tasks API** connection\n\n**Emails not sending:**\n- Confirm **Gmail OAuth2** is connected\n- Check that email addresses are **valid**\n\n## Support\n\nFor issues or questions, visit the n8n community forum.\n\n## License\n\nMIT License - Feel free to modify and share!",
    "workflow": {
      "id": "MU89lcZkW3CjD9nU",
      "meta": {
        "templateCredsSetupCompleted": true
      },
      "name": "Meeting Minutes & Action Item Tracker",
      "tags": [],
      "nodes": [
        {
          "id": "022280e9-fc0f-4148-827f-14143ba4c11a",
          "name": "Receive Meeting Data",
          "type": "n8n-nodes-base.webhook",
          "position": [
            -160,
            0
          ],
          "webhookId": "9e0d22e1-8b66-4438-a6b5-4748a168cc11",
          "parameters": {
            "path": "meeting-minutes",
            "options": {},
            "httpMethod": "POST",
            "responseMode": "lastNode"
          },
          "typeVersion": 2.1
        },
        {
          "id": "81191e4b-f548-46b1-b8ca-8560653a33ab",
          "name": "Extract Meeting Metadata",
          "type": "n8n-nodes-base.set",
          "position": [
            112,
            0
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "1ccc5df3-8c52-4ac8-a4b9-19e037022817",
                  "name": "meetingTitle",
                  "type": "string",
                  "value": "={{ $json.body.title|| \"Untitled Meeting\" }}"
                },
                {
                  "id": "ca5a8fed-69dc-4c24-85d5-d6860f192b05",
                  "name": "meetingDate",
                  "type": "string",
                  "value": "={{ $json.body.date  || $now.format('yyyy-MM-dd') }}"
                },
                {
                  "id": "f44440f2-80ab-4f1e-a79d-8d4d5b347703",
                  "name": "participants",
                  "type": "array",
                  "value": "={{$json.body.participants || [] }}"
                },
                {
                  "id": "46dff8c2-8c56-4d9c-9508-b9a280fca602",
                  "name": "duration",
                  "type": "string",
                  "value": "={{ $json.duration || \"Not specified\" }}"
                },
                {
                  "id": "87b3fa3a-a5fd-4cf9-8436-7a5a0870a15a",
                  "name": "rawTranscript",
                  "type": "string",
                  "value": "={{ $json.transcript || $json.body.transcript || \"\" }}"
                }
              ]
            }
          },
          "typeVersion": 3.4
        },
        {
          "id": "1d1d508e-f9b2-4175-83fc-3ab883990d8b",
          "name": "Clean Transcript",
          "type": "n8n-nodes-base.code",
          "position": [
            416,
            0
          ],
          "parameters": {
            "jsCode": "// Get the input data\nconst items = $input.all();\n\n// Process each item\nconst processedItems = items.map(item => {\n  const data = item.json;\n  \n  // Clean the transcript\n  let cleanedTranscript = data.rawTranscript || '';\n  \n  // Remove multiple spaces\n  cleanedTranscript = cleanedTranscript.replace(/\\s+/g, ' ');\n  \n  // Remove common timestamp patterns (e.g., [00:01:23] or (00:01:23))\n  cleanedTranscript = cleanedTranscript.replace(/[\\[\\(]\\d{2}:\\d{2}:\\d{2}[\\]\\)]/g, '');\n  \n  // Remove speaker labels if formatted as \"Speaker 1:\", \"Speaker 2:\", etc.\n  cleanedTranscript = cleanedTranscript.replace(/Speaker \\d+:/g, '');\n  \n  // Trim whitespace\n  cleanedTranscript = cleanedTranscript.trim();\n  \n  // Count words for context\n  const wordCount = cleanedTranscript.split(/\\s+/).length;\n  \n  // Estimate reading time (average 200 words per minute)\n  const estimatedMinutes = Math.ceil(wordCount / 200);\n  \n  return {\n    json: {\n      ...data,\n      cleanedTranscript: cleanedTranscript,\n      transcriptWordCount: wordCount,\n      estimatedReadingTime: `${estimatedMinutes} minutes`,\n      processingTimestamp: new Date().toISOString()\n    }\n  };\n});\n\nreturn processedItems;"
          },
          "typeVersion": 2
        },
        {
          "id": "2f05b28e-8aab-4f5f-b6ec-a61e96ec12de",
          "name": "Validate Transcript Length",
          "type": "n8n-nodes-base.if",
          "position": [
            720,
            0
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 2,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "296bb329-fa1e-4660-9976-5462a0f3ae21",
                  "operator": {
                    "type": "string",
                    "operation": "notEmpty",
                    "singleValue": true
                  },
                  "leftValue": "={{ $json.cleanedTranscript }}",
                  "rightValue": ""
                },
                {
                  "id": "c754bcd2-dd4e-4c2b-b3ae-a024c71bf6de",
                  "operator": {
                    "type": "number",
                    "operation": "gt"
                  },
                  "leftValue": "={{ $json.transcriptWordCount }}",
                  "rightValue": 50
                }
              ]
            }
          },
          "typeVersion": 2.2
        },
        {
          "id": "8ce8541c-951c-4c43-9471-3c55f8fe0be1",
          "name": "Generate Meeting Summary",
          "type": "@n8n/n8n-nodes-langchain.openAi",
          "position": [
            960,
            -128
          ],
          "parameters": {
            "modelId": {
              "__rl": true,
              "mode": "list",
              "value": "gpt-4",
              "cachedResultName": "GPT-4"
            },
            "options": {
              "topP": 1,
              "maxTokens": 1000,
              "temperature": 0.3,
              "presence_penalty": 0,
              "frequency_penalty": 0
            },
            "messages": {
              "values": [
                {
                  "role": "system",
                  "content": "=You are an expert executive assistant specializing in creating professional meeting summaries. \n\nYour summaries should:\n1. Be concise but comprehensive (200-300 words)\n2. Highlight key discussion points in order of importance\n3. Note important decisions made during the meeting\n4. Capture the overall meeting context and objectives\n5. Use clear, professional business language\n6. Organize information logically with smooth flow\n\nFormat your summary in 3-4 clear paragraphs, NOT bullet points. Write in third person (e.g., \"The team discussed...\" not \"We discussed...\")."
                },
                {
                  "content": "=Create a professional meeting summary for the following:\n\nMeeting Title: {{ $json.meetingTitle }}\nDate: {{ $json.meetingDate }}\nDuration: {{ $json.duration }}\nParticipants: {{ $json.participants.join(', ') }}\n\nTranscript:\n{{ $json.cleanedTranscript }}\n\nGenerate a comprehensive summary that captures the essence of this meeting."
                }
              ]
            }
          },
          "credentials": {
            "openAiApi": {
              "id": "credential-id",
              "name": "openAiApi Credential"
            }
          },
          "typeVersion": 1.8
        },
        {
          "id": "89d1da2f-2eb8-4c87-b10d-74cccf6c0c2e",
          "name": "Extract Action Items",
          "type": "@n8n/n8n-nodes-langchain.openAi",
          "position": [
            960,
            128
          ],
          "parameters": {
            "modelId": {
              "__rl": true,
              "mode": "list",
              "value": "gpt-4",
              "cachedResultName": "GPT-4"
            },
            "options": {
              "maxTokens": 1500,
              "temperature": 0.2
            },
            "messages": {
              "values": [
                {
                  "content": "=Extract all action items from this meeting transcript:\n\nMeeting Title: {{ $json.meetingTitle }}\nMeeting Date: {{ $json.meetingDate }}\n\nTranscript:\n{{ $json.cleanedTranscript }}\n\nReturn ONLY the JSON object with the action_items array. Do not include any other text, markdown formatting, or code blocks."
                },
                {
                  "role": "system",
                  "content": "=You are an expert at extracting action items from meeting transcripts. \n\nFor each action item, identify:\n1. **task**: Clear, actionable description of what needs to be done\n2. **assignee**: Person responsible (use their exact name from transcript)\n3. **deadline**: Due date if mentioned (format: YYYY-MM-DD), or null if not specified\n4. **priority**: Either 'urgent', 'high', 'normal', or 'low' based on context\n5. **context**: Brief note about why this task matters (1 sentence)\n\nRules:\n- Only extract clear, actionable tasks (not discussion points or general notes)\n- If no assignee is mentioned, set to \"Unassigned\"\n- Detect urgency from keywords: \"ASAP\", \"urgent\", \"immediately\", \"critical\", \"by end of day\"\n- If deadline isn't specific, infer from context clues (e.g., \"next week\" = meeting date + 7 days)\n- If someone says \"I'll do X\", that person is the assignee for X\n\nReturn ONLY a valid JSON object (no markdown, no code blocks) in this exact format:\n{\n  \"action_items\": [\n    {\n      \"task\": \"string\",\n      \"assignee\": \"string\",\n      \"deadline\": \"YYYY-MM-DD or null\",\n      \"priority\": \"urgent|high|normal|low\",\n      \"context\": \"string\"\n    }\n  ]\n}"
                }
              ]
            }
          },
          "credentials": {
            "openAiApi": {
              "id": "credential-id",
              "name": "openAiApi Credential"
            }
          },
          "typeVersion": 1.8
        },
        {
          "id": "d5564407-0f3b-4128-aa3a-3db3f6b271a5",
          "name": "Combine AI Responses",
          "type": "n8n-nodes-base.merge",
          "position": [
            1360,
            0
          ],
          "parameters": {},
          "typeVersion": 3.2
        },
        {
          "id": "9a4f0d20-75e6-4c83-8cf0-4d374485bc03",
          "name": "Parse and Enrich Data",
          "type": "n8n-nodes-base.code",
          "position": [
            1632,
            0
          ],
          "parameters": {
            "jsCode": "// Get ALL items from Merge (Append gives us an array of items)\nconst items = $input.all();\n\nconsole.log('=== STARTING PARSE ===');\nconsole.log('Total items:', items.length);\n\n// Get metadata from earlier nodes\nlet codeData = {};\ntry {\n  codeData = $('Clean Transcript').first().json;\n  console.log('✓ Got metadata from Code node');\n} catch (error) {\n  console.log('✗ Could not access Code node:', error.message);\n}\n\n// Initialize with metadata\nlet meetingData = {\n  meetingTitle: codeData.meetingTitle || 'Untitled Meeting',\n  meetingDate: codeData.meetingDate || new Date().toISOString().split('T')[0],\n  participants: codeData.participants || [],\n  duration: codeData.duration || 'Not specified',\n  rawTranscript: codeData.rawTranscript || '',\n  cleanedTranscript: codeData.cleanedTranscript || '',\n  transcriptWordCount: codeData.transcriptWordCount || 0,\n  estimatedReadingTime: codeData.estimatedReadingTime || 'Unknown',\n  processingTimestamp: codeData.processingTimestamp || new Date().toISOString(),\n  summary: '',\n  actionItems: []\n};\n\nconsole.log('\\n=== PROCESSING', items.length, 'OPENAI RESPONSES ===');\n\n// Process each item from Merge\nitems.forEach((item, index) => {\n  console.log(`\\nItem ${index}:`);\n  \n  const data = item.json;\n  \n  // OpenAI node returns: { message: { role, content } }\n  if (data.message && data.message.content) {\n    const content = data.message.content;\n    console.log('  Content length:', content.length);\n    console.log('  Preview:', content.substring(0, 80));\n    \n    // Check if action items JSON\n    if (content.includes('\"action_items\"')) {\n      console.log('  → ACTION ITEMS');\n      try {\n        const parsed = JSON.parse(content);\n        meetingData.actionItems = parsed.action_items || [];\n        console.log('  ✓ Parsed:', meetingData.actionItems.length, 'items');\n      } catch (error) {\n        console.error('  ✗ Parse error:', error.message);\n      }\n    } else {\n      console.log('  → SUMMARY');\n      meetingData.summary = content.trim();\n      console.log('  ✓ Length:', meetingData.summary.length);\n    }\n  }\n});\n\nconsole.log('\\n=== RESULTS ===');\nconsole.log('Summary:', meetingData.summary ? `${meetingData.summary.length} chars` : 'EMPTY');\nconsole.log('Action Items:', meetingData.actionItems.length);\n\n// Enrich action items\nmeetingData.actionItems = meetingData.actionItems.map((item, index) => {\n  let formattedDeadline = 'TBD';\n  let daysUntil = null;\n  let deadlineStatus = 'no-deadline';\n  \n  if (item.deadline && item.deadline !== 'null' && item.deadline !== null) {\n    try {\n      const deadlineDate = new Date(item.deadline);\n      if (!isNaN(deadlineDate.getTime())) {\n        formattedDeadline = deadlineDate.toISOString().split('T')[0];\n        const today = new Date();\n        today.setHours(0, 0, 0, 0);\n        deadlineDate.setHours(0, 0, 0, 0);\n        daysUntil = Math.ceil((deadlineDate - today) / (1000 * 60 * 60 * 24));\n        \n        if (daysUntil < 0) deadlineStatus = 'overdue';\n        else if (daysUntil === 0) deadlineStatus = 'today';\n        else if (daysUntil <= 3) deadlineStatus = 'urgent';\n        else if (daysUntil <= 7) deadlineStatus = 'upcoming';\n        else deadlineStatus = 'future';\n      }\n    } catch (e) {}\n  }\n  \n  return {\n    id: `AI-${Date.now()}-${index}`,\n    number: index + 1,\n    task: item.task || 'No task description',\n    assignee: item.assignee || 'Unassigned',\n    deadline: formattedDeadline,\n    deadlineOriginal: item.deadline,\n    daysUntilDeadline: daysUntil,\n    deadlineStatus: deadlineStatus,\n    priority: (item.priority || 'normal').toLowerCase(),\n    context: item.context || '',\n    status: 'pending',\n    createdAt: new Date().toISOString(),\n    meetingReference: meetingData.meetingTitle,\n    meetingDate: meetingData.meetingDate\n  };\n});\n\n// Sort\nconst priorityOrder = { urgent: 0, high: 1, normal: 2, low: 3 };\nconst statusOrder = { overdue: 0, today: 1, urgent: 2, upcoming: 3, future: 4, 'no-deadline': 5 };\n\nmeetingData.actionItems.sort((a, b) => {\n  const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n  if (priorityDiff !== 0) return priorityDiff;\n  const statusDiff = statusOrder[a.deadlineStatus] - statusOrder[b.deadlineStatus];\n  if (statusDiff !== 0) return statusDiff;\n  if (a.deadline === 'TBD' && b.deadline !== 'TBD') return 1;\n  if (a.deadline !== 'TBD' && b.deadline === 'TBD') return -1;\n  if (a.deadline !== 'TBD' && b.deadline !== 'TBD') {\n    return new Date(a.deadline) - new Date(b.deadline);\n  }\n  return 0;\n});\n\nmeetingData.actionItems = meetingData.actionItems.map((item, index) => ({\n  ...item,\n  number: index + 1\n}));\n\n// Generate metadata\nconst urgentCount = meetingData.actionItems.filter(i => i.priority === 'urgent').length;\nconst highCount = meetingData.actionItems.filter(i => i.priority === 'high').length;\nconst normalCount = meetingData.actionItems.filter(i => i.priority === 'normal').length;\nconst lowCount = meetingData.actionItems.filter(i => i.priority === 'low').length;\nconst assigneeBreakdown = meetingData.actionItems.reduce((acc, item) => {\n  acc[item.assignee] = (acc[item.assignee] || 0) + 1;\n  return acc;\n}, {});\nconst overdueCount = meetingData.actionItems.filter(i => i.deadlineStatus === 'overdue').length;\nconst todayCount = meetingData.actionItems.filter(i => i.deadlineStatus === 'today').length;\nconst urgentDeadlineCount = meetingData.actionItems.filter(i => i.deadlineStatus === 'urgent').length;\nconst upcomingCount = meetingData.actionItems.filter(i => i.deadlineStatus === 'upcoming').length;\n\nmeetingData.summaryMetadata = {\n  generatedAt: new Date().toISOString(),\n  actionItemCount: meetingData.actionItems.length,\n  participantCount: meetingData.participants.length,\n  hasUrgentItems: urgentCount > 0,\n  hasHighPriorityItems: highCount > 0,\n  hasUnassignedItems: meetingData.actionItems.some(i => i.assignee === 'Unassigned'),\n  hasOverdueItems: overdueCount > 0,\n  hasTodayItems: todayCount > 0,\n  priorityBreakdown: { urgent: urgentCount, high: highCount, normal: normalCount, low: lowCount },\n  assigneeBreakdown: assigneeBreakdown,\n  itemsWithDeadlines: meetingData.actionItems.filter(i => i.deadline !== 'TBD').length,\n  itemsWithoutDeadlines: meetingData.actionItems.filter(i => i.deadline === 'TBD').length,\n  deadlineStatus: {\n    overdue: overdueCount,\n    today: todayCount,\n    urgent: urgentDeadlineCount,\n    upcoming: upcomingCount,\n    future: meetingData.actionItems.filter(i => i.deadlineStatus === 'future').length,\n    noDeadline: meetingData.actionItems.filter(i => i.deadlineStatus === 'no-deadline').length\n  },\n  upcomingDeadlines: upcomingCount + urgentDeadlineCount + todayCount,\n  overdueItems: overdueCount\n};\n\nconsole.log('\\n=== COMPLETE ===');\nconsole.log('Meeting:', meetingData.meetingTitle);\nconsole.log('Summary:', meetingData.summary.length, 'chars');\nconsole.log('Action Items:', meetingData.actionItems.length);\n\nreturn [{ json: meetingData }];"
          },
          "typeVersion": 2
        },
        {
          "id": "fc46776e-2b89-4a64-9145-7755101a5138",
          "name": "Generate PDF Document",
          "type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
          "position": [
            2000,
            -144
          ],
          "parameters": {
            "css_content": "=* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; line-height: 1.6; color: #1f2937; background: #ffffff; } .container { max-width: 900px; margin: 0 auto; padding: 60px 40px; } .header { border-bottom: 4px solid #3b82f6; padding-bottom: 30px; margin-bottom: 40px; background: linear-gradient(135deg, #3b82f6 0%, #1e40af 100%); padding: 40px; border-radius: 12px 12px 0 0; color: white; margin: -60px -40px 40px -40px; } .header h1 { font-size: 32px; font-weight: 700; margin-bottom: 12px; color: white; } .header .subtitle { font-size: 16px; opacity: 0.95; font-weight: 400; } .meta-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-top: 30px; padding: 25px; background: rgba(255, 255, 255, 0.1); border-radius: 8px; } .meta-item { display: flex; flex-direction: column; } .meta-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; opacity: 0.8; margin-bottom: 6px; font-weight: 600; } .meta-value { font-size: 15px; font-weight: 500; } .section { margin: 50px 0; } .section-header { display: flex; align-items: center; margin-bottom: 20px; padding-bottom: 12px; border-bottom: 2px solid #e5e7eb; } .section-header h2 { font-size: 24px; color: #1e40af; font-weight: 700; margin: 0; } .section-header .icon { font-size: 28px; margin-right: 12px; } .summary-box { background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); padding: 30px; border-radius: 10px; line-height: 1.8; font-size: 15px; color: #1f2937; border-left: 5px solid #3b82f6; box-shadow: 0 2px 8px rgba(59, 130, 246, 0.1); } .participants-box { background: #f9fafb; padding: 20px; border-radius: 8px; margin-bottom: 30px; } .participants-label { font-weight: 600; color: #374151; margin-bottom: 12px; font-size: 14px; text-transform: uppercase; letter-spacing: 0.5px; } .participant-tag { background: #f3f4f6; padding: 6px 12px; border-radius: 6px; font-size: 13px; color: #374151; margin-right: 8px; display: inline-block; margin-bottom: 6px; } table { width: 100%; border-collapse: collapse; background: white; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); border-radius: 8px; overflow: hidden; } thead { background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); color: white; } th { padding: 18px 12px; text-align: left; font-weight: 600; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px; } tbody tr { border-bottom: 1px solid #e5e7eb; } tbody tr:hover { background: #f9fafb; } td { padding: 16px 12px; } .task-YOUR_OPENAI_KEY_HERE { font-weight: 500; color: #1f2937; margin-bottom: 4px; } .task-YOUR_OPENAI_KEY_HERE { font-size: 13px; color: #6b7280; font-style: italic; } .assignee-badge { background: #eff6ff; color: #1e40af; padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 500; display: inline-block; } .priority-urgent { background: #ef4444; color: white; padding: 4px 10px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; } .priority-high { background: #f97316; color: white; padding: 4px 10px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; } .priority-normal { background: #3b82f6; color: white; padding: 4px 10px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; } .priority-low { background: #6b7280; color: white; padding: 4px 10px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; } .deadline-overdue { color: #dc2626; font-weight: 600; } .deadline-today { color: #ea580c; font-weight: 600; } .deadline-urgent { color: #f59e0b; font-weight: 600; } .deadline-upcoming { color: #3b82f6; } .deadline-future { color: #6b7280; } .urgent-banner { background: #fef2f2; border-left: 4px solid #ef4444; padding: 16px 20px; border-radius: 6px; margin-bottom: 20px; display: flex; align-items: center; } .urgent-banner-icon { font-size: 24px; margin-right: 12px; } .urgent-banner-text { color: #991b1b; font-weight: 600; font-size: 14px; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px; margin-top: 30px; } .stat-card { background: white; padding: 24px; border-radius: 10px; border: 2px solid #e5e7eb; text-align: center; } .stat-number { font-size: 36px; font-weight: 700; color: #3b82f6; margin-bottom: 8px; } .stat-label { font-size: 13px; color: #6b7280; text-transform: uppercase; letter-spacing: 0.5px; font-weight: 600; } .footer { margin-top: 60px; padding-top: 30px; border-top: 2px solid #e5e7eb; text-align: center; color: #6b7280; font-size: 13px; }",
            "html_content": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>{{ $json.meetingTitle }} - Meeting Minutes</title>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>📋 {{ $json.meetingTitle }}</h1>\n      <div class=\"subtitle\">Official Meeting Minutes & Action Items</div>\n      <div class=\"meta-grid\">\n        <div class=\"meta-item\">\n          <div class=\"meta-label\">📅 Date</div>\n          <div class=\"meta-value\">{{ $json.meetingDate }}</div>\n        </div>\n        <div class=\"meta-item\">\n          <div class=\"meta-label\">⏱️ Duration</div>\n          <div class=\"meta-value\">{{ $json.duration }}</div>\n        </div>\n        <div class=\"meta-item\">\n          <div class=\"meta-label\">👥 Attendees</div>\n          <div class=\"meta-value\">{{ $json.participants.length }} participants</div>\n        </div>\n        <div class=\"meta-item\">\n          <div class=\"meta-label\">📊 Action Items</div>\n          <div class=\"meta-value\">{{ $json.actionItems.length }} tasks</div>\n        </div>\n      </div>\n    </div>\n\n    {{ $json.summaryMetadata.hasOverdueItems || $json.summaryMetadata.hasTodayItems ? '<div class=\"urgent-banner\"><div class=\"urgent-banner-icon\">⚠️</div><div class=\"urgent-banner-text\">This meeting contains urgent action items requiring immediate attention!</div></div>' : '' }}\n\n    <div class=\"participants-box\">\n      <div class=\"participants-label\">Meeting Participants</div>\n      {{ $json.participants.map(p => `<span class=\"participant-tag\">${p}</span>`).join('') }}\n    </div>\n\n    <div class=\"section\">\n      <div class=\"section-header\">\n        <span class=\"icon\">📝</span>\n        <h2>Meeting Summary</h2>\n      </div>\n      <div class=\"summary-box\">{{ $json.summary }}</div>\n    </div>\n\n    <div class=\"section\">\n      <div class=\"section-header\">\n        <span class=\"icon\">✅</span>\n        <h2>Action Items</h2>\n      </div>\n      <table>\n        <thead>\n          <tr>\n            <th style=\"width:60px;text-align:center;\">#</th>\n            <th>Task</th>\n            <th style=\"width:180px;\">Assignee</th>\n            <th style=\"width:120px;text-align:center;\">Deadline</th>\n            <th style=\"width:120px;text-align:center;\">Priority</th>\n          </tr>\n        </thead>\n        <tbody>\n          {{ $json.actionItems.map(item => `\n            <tr>\n              <td style=\"text-align:center;font-weight:600;color:#3b82f6;\">#${item.number}</td>\n              <td>\n                <div class=\"task-YOUR_OPENAI_KEY_HERE\">${item.task}</div>\n                ${item.context ? `<div class=\"task-YOUR_OPENAI_KEY_HERE\">${item.context}</div>` : ''}\n              </td>\n              <td><span class=\"assignee-badge\">${item.assignee}</span></td>\n              <td style=\"text-align:center;\">\n                <span class=\"deadline-${item.deadlineStatus}\">\n                  ${item.deadlineStatus === 'overdue' ? '⚠️ OVERDUE' : \n                    item.deadlineStatus === 'today' ? '📅 TODAY' :\n                    item.deadlineStatus === 'urgent' ? `⏰ ${item.daysUntilDeadline} days` :\n                    item.daysUntilDeadline ? `${item.daysUntilDeadline} days` : 'TBD'}\n                </span>\n              </td>\n              <td style=\"text-align:center;\">\n                <span class=\"priority-${item.priority}\">\n                  ${item.priority === 'urgent' ? '🔥 URGENT' :\n                    item.priority === 'high' ? '⚡ HIGH' :\n                    item.priority === 'normal' ? '📋 NORMAL' : 'LOW'}\n                </span>\n              </td>\n            </tr>\n          `).join('') }}\n        </tbody>\n      </table>\n    </div>\n\n    <div class=\"section\">\n      <div class=\"section-header\">\n        <span class=\"icon\">📊</span>\n        <h2>Summary Statistics</h2>\n      </div>\n      <div class=\"stats-grid\">\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">{{ $json.summaryMetadata.actionItemCount }}</div>\n          <div class=\"stat-label\">Total Tasks</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">{{ $json.summaryMetadata.priorityBreakdown.high }}</div>\n          <div class=\"stat-label\">High Priority</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">{{ $json.summaryMetadata.upcomingDeadlines }}</div>\n          <div class=\"stat-label\">Due This Week</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">{{ $json.transcriptWordCount }}</div>\n          <div class=\"stat-label\">Transcript Words</div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"footer\">\n      <div style=\"font-size:20px;margin-bottom:12px;\">📋</div>\n      Generated automatically on {{ new Date().toLocaleString() }}<br>\n      Meeting Minutes Tracker · Powered by AI\n    </div>\n  </div>\n</body>\n</html>",
            "response_format_html": "base64"
          },
          "credentials": {
            "htmlcsstopdfApi": {
              "id": "credential-id",
              "name": "htmlcsstopdfApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "dd362d07-117f-4069-9028-761e4105bf57",
          "name": "Email All Participants",
          "type": "n8n-nodes-base.gmail",
          "position": [
            2336,
            -144
          ],
          "webhookId": "e607a916-4f74-406a-9cc8-892c0b6b7568",
          "parameters": {
            "sendTo": "={{ $('Parse and Enrich Data').item.json.participants.join(',') }}",
            "message": "=<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; color: #1f2937;\">\n  <div style=\"background: linear-gradient(135deg, #3b82f6 0%, #1e40af 100%); padding: 30px; border-radius: 8px 8px 0 0; color: white;\">\n    <h2 style=\"margin: 0; font-size: 24px;\">📋 {{ $('Parse and Enrich Data').item.json.meetingTitle }} </h2>\n    <p style=\"margin: 10px 0 0 0; opacity: 0.9;\">Meeting Minutes & Action Items</p>\n  </div>\n  \n  <div style=\"background: #ffffff; padding: 30px; border: 1px solid #e5e7eb; border-top: none;\">\n    <p style=\"margin-top: 0;\">Hi team,</p>\n    \n    <p>The minutes from our meeting held on <strong>{{ $('Parse and Enrich Data').item.json.meetingDate }}</strong> are now available.</p>\n    \n    <div style=\"text-align: center; margin: 30px 0;\">\n      <a href=\"{{ $json.pdf_url }}\" style=\"display: inline-block; background: #3b82f6; color: white; padding: 14px 32px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px;\">\n        📥 Download Meeting Minutes PDF\n      </a>\n    </div>\n    \n    <div style=\"background: #f9fafb; border-left: 4px solid #3b82f6; padding: 20px; margin: 30px 0; border-radius: 4px;\">\n      <h3 style=\"color: #1e40af; margin-top: 0; font-size: 18px;\">Action Items Summary</h3>\n      <ul style=\"line-height: 2; margin: 15px 0; padding-left: 20px;\">\n        {{ $('Parse and Enrich Data').item.json.actionItems.map(item => `\n          <li style=\"margin-bottom: 10px;\">\n            <strong>${item.task}</strong><br>\n            <span style=\"color: #6b7280; font-size: 14px;\">\n              Assigned to: ${item.assignee} | \n              Due: ${item.deadline} | \n              Priority: <span style=\"color: ${item.priority === 'high' || item.priority === 'urgent' ? '#ef4444' : '#3b82f6'};\">${item.priority.toUpperCase()}</span>\n            </span>\n          </li>\n        `).join('') }}\n      </ul>\n    </div>\n    \n    <div style=\"background: #eff6ff; padding: 15px; border-radius: 6px; margin: 20px 0;\">\n      <p style=\"margin: 0; font-size: 14px; color: #1e40af;\">\n        <strong>📊 Meeting Stats:</strong> \n        {{ $('Parse and Enrich Data').item.json.actionItems.length }} action items | \n        {{ $('Parse and Enrich Data').item.json.summaryMetadata.priorityBreakdown.high}} high priority | \n        {{$('Parse and Enrich Data').item.json.participants.length }} participants\n      </p>\n    </div>\n    \n    <p style=\"margin-top: 30px;\">The complete meeting minutes with full context and details are available in the PDF.</p>\n    \n    <p>Please review your assigned action items and reach out if you have any questions.</p>\n    \n    <p style=\"margin-bottom: 0;\">Best regards,<br><strong>Meeting Minutes Tracker</strong></p>\n  </div>\n  \n  <div style=\"background: #f9fafb; padding: 20px; border: 1px solid #e5e7eb; border-top: none; border-radius: 0 0 8px 8px; text-align: center;\">\n    <p style=\"margin: 0; color: #6b7280; font-size: 13px;\">\n      Generated automatically on {{ $now.format('MMMM d, yyyy [at] h:mm a') }}<br>\n      Powered by AI\n    </p>\n  </div>\n</div>",
            "options": {},
            "subject": "=📋 Meeting Minutes - {{ $('Parse and Enrich Data').item.json.meetingTitle }} ({{ $('Parse and Enrich Data').item.json.meetingDate }})"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "fd293c09-5c23-49eb-9766-c95ee3eb88df",
          "name": "Download PDF from URL",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            2352,
            144
          ],
          "parameters": {
            "url": "={{ $json.pdf_url }}",
            "options": {
              "response": {
                "response": {
                  "responseFormat": "file"
                }
              }
            }
          },
          "typeVersion": 4.2
        },
        {
          "id": "64259b9e-7983-4239-aae2-07542f928e6a",
          "name": "Save PDF to Drive",
          "type": "n8n-nodes-base.googleDrive",
          "position": [
            2640,
            144
          ],
          "parameters": {
            "name": "=Meeting_Minutes_{{ $('Parse and Enrich Data').item.json.meetingTitle.replace(/ /g, '_') }}_{{ $('Parse and Enrich Data').item.json.meetingDate }}.pdf",
            "driveId": {
              "__rl": true,
              "mode": "list",
              "value": "My Drive"
            },
            "options": {},
            "folderId": {
              "__rl": true,
              "mode": "list",
              "value": "1bYMdPQZm3Z4ChhZ6UjLMJb5BJKFOhp8R",
              "cachedResultUrl": "https://drive.google.com/drive/folders/1bYMdPQZm3Z4ChhZ6UjLMJb5BJKFOhp8R",
              "cachedResultName": "Minutes of Meeting"
            },
            "inputDataFieldName": "=data"
          },
          "credentials": {
            "googleDriveOAuth2Api": {
              "id": "credential-id",
              "name": "googleDriveOAuth2Api Credential"
            }
          },
          "typeVersion": 3
        },
        {
          "id": "994f49a2-c94d-4982-b827-a9be5c56b5a1",
          "name": "Add PDF Download Link",
          "type": "n8n-nodes-base.set",
          "position": [
            2912,
            144
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "9c0c1e1f-c4e4-4db6-add0-e97e768ec0d9",
                  "name": "pdfUrl",
                  "type": "string",
                  "value": "={{ $json.webViewLink }}"
                },
                {
                  "id": "6efe7494-9032-4a94-a3f8-c35d5f80865b",
                  "name": "pdfFileName",
                  "type": "string",
                  "value": "={{ $json.name }}"
                }
              ]
            }
          },
          "typeVersion": 3.4
        },
        {
          "id": "49568bb8-c40b-4229-873d-d3bb2695b95b",
          "name": "Notify Slack Channel",
          "type": "n8n-nodes-base.slack",
          "position": [
            3280,
            -64
          ],
          "webhookId": "1dcd2233-c899-440c-ab08-1c6fb69f484b",
          "parameters": {
            "text": "=:clipboard: *New Meeting Minutes Available*\n\n*Meeting:* {{ $('Parse and Enrich Data').item.json.meetingTitle }}\n*Date:* {{ $('Parse and Enrich Data').item.json.meetingDate }}\n*Participants:* {{ $('Parse and Enrich Data').item.json.participants .length }} attendees\n\n*Action Items Summary:*\n{{ $('Parse and Enrich Data').item.json.actionItems.map((item, i) => `${i + 1}. ${item.task} - ${item.assignee} (${item.deadline}) [${item.priority.toUpperCase()}]`).join('\\n') }}\n\n:link: *Download PDF:* {{ $json.pdfUrl }}",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C09GHQ8CL82",
              "cachedResultName": "leads"
            },
            "otherOptions": {
              "includeLinkToWorkflow": true
            },
            "authentication": "oAuth2"
          },
          "credentials": {
            "slackOAuth2Api": {
              "id": "credential-id",
              "name": "slackOAuth2Api Credential"
            }
          },
          "typeVersion": 2.3
        },
        {
          "id": "76e76682-b710-4239-910f-9d464e04479b",
          "name": "Group Tasks by Assignee",
          "type": "n8n-nodes-base.code",
          "position": [
            3264,
            304
          ],
          "parameters": {
            "jsCode": "const parseData = $('Parse and Enrich Data').first().json;\nconst actionItems = parseData.actionItems || [];\nconst pdfUrl = $json.pdfUrl || $json.webViewLink || '';\n\nif (actionItems.length === 0) {\n  return [];\n}\n\n// Group tasks by assignee\nconst grouped = {};\nactionItems.forEach(item => {\n  if (!grouped[item.assignee]) {\n    grouped[item.assignee] = [];\n  }\n  grouped[item.assignee].push(item);\n});\n\n// Return one item per assignee\nreturn Object.keys(grouped).map(assignee => ({\n  json: {\n    assignee: assignee,\n    tasks: grouped[assignee],\n    taskCount: grouped[assignee].length,\n    meetingTitle: parseData.meetingTitle,\n    meetingDate: parseData.meetingDate,\n    pdfUrl: pdfUrl\n  }\n}));"
          },
          "typeVersion": 2
        },
        {
          "id": "b4a682ee-58a8-4bf4-a915-a4ac51d0f8dc",
          "name": "Send Individual Task Emails",
          "type": "n8n-nodes-base.gmail",
          "position": [
            3632,
            304
          ],
          "webhookId": "229e1653-aac1-4a82-b2f8-a95d9536ea85",
          "parameters": {
            "sendTo": "={{ $json.assignee }}@yourcompany.com",
            "message": "=<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;\">\n  <div style=\"background: linear-gradient(135deg, #3b82f6 0%, #1e40af 100%); padding: 30px; border-radius: 8px 8px 0 0; color: white;\">\n    <h2 style=\"margin: 0; font-size: 24px;\">📋 {{ $json.meetingTitle }}</h2>\n    <p style=\"margin: 10px 0 0 0; opacity: 0.9;\">Action Items Assigned to You</p>\n  </div>\n  \n  <div style=\"background: white; padding: 30px; border: 1px solid #e5e7eb; border-top: none;\">\n    <p style=\"margin-top: 0;\">Hi <strong>{{ $json.assignee }}</strong>,</p>\n    \n    <p>You have <strong>{{ $json.taskCount }}</strong> action {{ $json.taskCount === 1 ? 'item' : 'items' }} from the meeting held on <strong>{{ $json.meetingDate }}</strong>:</p>\n    \n    {{ $json.tasks.map((task, i) => `\n      <div style=\"background: ${task.priority === 'high' || task.priority === 'urgent' ? '#fef2f2' : '#f0f9ff'}; border-left: 4px solid ${task.priority === 'high' || task.priority === 'urgent' ? '#ef4444' : '#3b82f6'}; padding: 20px; margin: 20px 0; border-radius: 4px;\">\n        <div style=\"display: flex; justify-content: space-between; align-items: start; margin-bottom: 10px;\">\n          <h3 style=\"margin: 0; color: #1e40af; font-size: 16px;\">Task ${i + 1}</h3>\n          <span style=\"background: ${task.priority === 'high' || task.priority === 'urgent' ? '#ef4444' : task.priority === 'normal' ? '#3b82f6' : '#6b7280'}; color: white; padding: 4px 10px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase;\">\n            ${task.priority === 'high' ? '⚡ HIGH' : task.priority === 'urgent' ? '🔥 URGENT' : task.priority === 'normal' ? '📋 NORMAL' : 'LOW'}\n          </span>\n        </div>\n        \n        <p style=\"font-size: 15px; font-weight: 600; color: #1f2937; margin: 10px 0; line-height: 1.5;\">\n          ${task.task}\n        </p>\n        \n        <div style=\"margin: 12px 0; padding: 12px; background: white; border-radius: 4px;\">\n          <p style=\"margin: 5px 0; color: #374151; font-size: 14px;\">\n            <strong>📅 Deadline:</strong> ${task.deadline} \n            ${task.daysUntilDeadline !== null ? `<span style=\"color: ${task.deadlineStatus === 'overdue' ? '#dc2626' : task.deadlineStatus === 'urgent' ? '#f59e0b' : '#6b7280'};\">(${task.daysUntilDeadline} day${task.daysUntilDeadline === 1 ? '' : 's'})</span>` : ''}\n          </p>\n          <p style=\"margin: 5px 0; color: #374151; font-size: 14px;\">\n            <strong>📌 Status:</strong> ${task.status}\n          </p>\n        </div>\n        \n        ${task.context ? `<p style=\"margin-top: 12px; font-style: italic; color: #6b7280; font-size: 13px; line-height: 1.5; padding-top: 12px; border-top: 1px dashed #d1d5db;\">${task.context}</p>` : ''}\n      </div>\n    `).join('') }}\n    \n    <div style=\"text-align: center; margin: 35px 0;\">\n      <a href=\"{{ $json.pdfUrl }}\" style=\"display: inline-block; background: #3b82f6; color: white; padding: 14px 28px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 15px; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);\">\n        📥 Download Full Meeting Minutes\n      </a>\n    </div>",
            "options": {},
            "subject": "=⚡ {{ $json.taskCount }} Action {{ $json.taskCount === 1 ? 'Item' : 'Items' }} from {{ $json.meetingTitle }}"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "a75840d6-4c1f-4940-8a9b-9f05f121c754",
          "name": "Split Tasks for Creation",
          "type": "n8n-nodes-base.code",
          "position": [
            2000,
            528
          ],
          "parameters": {
            "jsCode": "const actionItems = $json.actionItems || [];\nconst meetingTitle = $json.meetingTitle;\nconst meetingDate = $json.meetingDate;\nconst pdfUrl = $json.pdfUrl || '';\n\nif (actionItems.length === 0) {\n  return [];\n}\n\n// Return one item per action item for task creation\nreturn actionItems.map(item => ({\n  json: {\n    task: item.task,\n    assignee: item.assignee,\n    deadline: item.deadline,\n    priority: item.priority,\n    context: item.context,\n    meetingTitle: meetingTitle,\n    meetingDate: meetingDate,\n    status: item.status,\n    daysUntilDeadline: item.daysUntilDeadline\n  }\n}));"
          },
          "typeVersion": 2
        },
        {
          "id": "59146f07-6b6c-4c0b-a31c-37afa7b01ef7",
          "name": "Create Task in Google Tasks",
          "type": "n8n-nodes-base.googleTasks",
          "position": [
            2304,
            528
          ],
          "parameters": {
            "task": "MTYxODQ3NTU3ODAzODc5Njg1NTk6MDow",
            "title": "={{ $json.task }}",
            "additionalFields": {
              "notes": "={{ $json.context }}  \nMeeting: {{ $json.meetingTitle }} \nDate: {{ $json.meetingDate }} \nAssignee: {{ $json.assignee }} \nPriority: {{ $json.priority }}",
              "dueDate": "={{ $json.deadline ? new Date($json.deadline + 'T12:00:00Z').toISOString() : null }}"
            }
          },
          "credentials": {
            "googleTasksOAuth2Api": {
              "id": "credential-id",
              "name": "googleTasksOAuth2Api Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "063a6dc6-cf1c-4a4a-9994-2fb1e9e8f291",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -304,
            -224
          ],
          "parameters": {
            "color": 7,
            "width": 288,
            "height": 352,
            "content": "## WEBHOOK ENDPOINT\n\n- Receives **POST** requests with meeting data.\n- **Expected payload**: title, date, participants[], duration, transcript\n- **Returns**: 200 status when workflow completes\n- **URL**: /webhook/meeting-minutes"
          },
          "typeVersion": 1
        },
        {
          "id": "22ca0f0e-3fc2-4dbc-b5d2-86fcc508c93b",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            16,
            -288
          ],
          "parameters": {
            "color": 7,
            "width": 304,
            "height": 464,
            "content": "## DATA NORMALIZATION\n\nExtracts fields from webhook body:\n- **meetingTitle** (defaults to \"Untitled Meeting\")\n- **meetingDate** (defaults to today)\n- **participants array**\n- **duration**\n- **rawTranscript**\nStandardizes input format for downstream processing."
          },
          "typeVersion": 1
        },
        {
          "id": "5173480f-55d9-4786-a46d-8f9ce7a7ef5d",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            352,
            -336
          ],
          "parameters": {
            "color": 7,
            "height": 480,
            "content": "## TRANSCRIPT CLEANING\n\nOperations performed:\n1. Removes **multiple spaces**\n2. Strips **timestamps** [00:00:00]\n3. Removes generic speaker labels\n4. **Counts words**\n5. Estimates **reading time** (200 words/min)\n**Output**: **cleanedTranscript** ready for AI processing"
          },
          "typeVersion": 1
        },
        {
          "id": "ba992adf-ec87-48bb-b130-b41af85ad4c4",
          "name": "Sticky Note3",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            624,
            -256
          ],
          "parameters": {
            "color": 7,
            "width": 272,
            "height": 400,
            "content": "## QUALITY GATE\n\n**Validates transcript** before **AI processing**:\n- Must not be empty\n- Must contain >50 words\n\n**If fails**: workflow stops** (no AI costs incurred)\n**If passes**: proceeds to **AI extraction**"
          },
          "typeVersion": 1
        },
        {
          "id": "66f5fafa-740b-4a27-893e-d4bcc4db9fcb",
          "name": "Sticky Note4",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            928,
            -336
          ],
          "parameters": {
            "color": 7,
            "width": 288,
            "height": 320,
            "content": "## OPENAI SUMMARY (GPT-4)\n\n**Temperature**: 0.3 (focused, consistent)\n**Max tokens**: 1000 (~750 words)\n**Generates**: Professional 200-300 word summary\n**Format**: 3-4 paragraphs, third person"
          },
          "typeVersion": 1
        },
        {
          "id": "5b0681a7-fd69-4f62-b881-2f27891871ef",
          "name": "Sticky Note5",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            928,
            112
          ],
          "parameters": {
            "color": 7,
            "width": 288,
            "height": 400,
            "content": "\n\n\n\n\n\n\n\n\n\n\n\n## OPENAI ACTION EXTRACTION (GPT-4)\n\n**Temperature**: 0.2 (precise extraction)\n**Max tokens**: 1500\n**Returns**: JSON array of action items\n**Each item**: task, assignee, deadline, priority, context\nDetects urgency from keywords (ASAP, urgent, critical)"
          },
          "typeVersion": 1
        },
        {
          "id": "0723ad57-23fb-41dc-9b95-71b4efda99d2",
          "name": "Sticky Note6",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1296,
            -240
          ],
          "parameters": {
            "color": 7,
            "height": 384,
            "content": "## COMBINE AI RESPONSES\n\n**Mode**: Append\n**Input 1**: Summary text\n**Input 2**: Action items JSON\n**Output**: 2-item array containing both responses\nBoth responses processed in **parallel** for speed"
          },
          "typeVersion": 1
        },
        {
          "id": "b63e42ec-dd33-4b4b-853c-126a905ef376",
          "name": "Sticky Note7",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1568,
            -368
          ],
          "parameters": {
            "color": 7,
            "width": 272,
            "height": 496,
            "content": "## DATA STRUCTURING\n\nOperations:\n1. **Extracts summary** text from response 1\n2. **Parses JSON** from response 2\n3. Enriches each action item with:\n   - Unique ID\n   - Days until deadline\n   - Deadline status (overdue/urgent/upcoming)\n4. Sorts by **priority then deadline**\n5. **Generates metadata** (counts, breakdowns)\nPulls meeting metadata from **Clean Transcript** node"
          },
          "typeVersion": 1
        },
        {
          "id": "96e5ac65-f844-45f2-b598-2f2d23667122",
          "name": "Sticky Note8",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1904,
            -448
          ],
          "parameters": {
            "color": 7,
            "width": 304,
            "height": 464,
            "content": "## PDF CONVERSION\n\n**Converts styled HTML + CSS to PDF**\nFeatures:\n- Gradient header with meeting info\n- Color-coded priority badges\n- Formatted action items table\n- Summary statistics cards\n**Output**: Base64 PDF data\n**Service**: htmlcsstopdf API\n**Link to the node**: https://www.npmjs.com/package/n8n-nodes-htmlcsstopdf"
          },
          "typeVersion": 1
        },
        {
          "id": "9e64cb89-011d-407f-b046-66f2b2723f04",
          "name": "Sticky Note9",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2288,
            -368
          ],
          "parameters": {
            "color": 7,
            "width": 352,
            "height": 368,
            "content": "## BULK EMAIL NOTIFICATION\n\n**Sends to**: All participants (comma-separated)\n**Contains**:\n- Meeting summary highlights\n- Action items list with assignees\n- Download link to PDF (added later)\n- Meeting statistics\nSent via Gmail API"
          },
          "typeVersion": 1
        },
        {
          "id": "e0f7c258-a987-4667-8eee-702336525b23",
          "name": "Sticky Note10",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2016,
            80
          ],
          "parameters": {
            "color": 7,
            "width": 480,
            "height": 208,
            "content": "## PDF URL FETCH\n\n- **Downloads PDF file** from **htmlcsstopdf** URL\n- Converts from URL to **binary data**\n- Required for Google Drive upload\n- **Response format**: Binary file"
          },
          "typeVersion": 1
        },
        {
          "id": "5c473a51-227c-4483-b064-d12c20482212",
          "name": "Sticky Note11",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2544,
            128
          ],
          "parameters": {
            "color": 7,
            "width": 288,
            "height": 432,
            "content": "\n\n\n\n\n\n\n\n\n\n\n\n## CLOUD STORAGE\n\n- **Select your own Google Drive folder for storing meeting minutes**\n- **Uploads PDF to**: \"Minutes of Meeting\" folder\n- **Filename**: **Meeting_Minutes_[Title]_[Date].pdf**\n- **Returns**: **webViewLink** for distribution\n- Provides **permanent storage**"
          },
          "typeVersion": 1
        },
        {
          "id": "649ba897-6e40-42c8-bbb1-e4dc1545f383",
          "name": "Sticky Note12",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2848,
            -80
          ],
          "parameters": {
            "color": 7,
            "height": 384,
            "content": "## URL EXTRACTION\n\n- Extracts **webViewLink** from **Drive** response\n- **Creates**: **pdfUrl** field\n- Preserves all existing meeting data\n- Required for downstream email/Slack notifications"
          },
          "typeVersion": 1
        },
        {
          "id": "2c634a33-5e61-4a88-b6ba-1488dca2cab8",
          "name": "Sticky Note13",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            3184,
            -304
          ],
          "parameters": {
            "color": 7,
            "width": 320,
            "height": 384,
            "content": "## TEAM CHANNEL UPDATE\n\n**Posts to** : [#your-channel]\nIncludes:\n- Meeting title and date\n- Participant count\n- Action items summary with assignees\n- Direct PDF download link\n\nIncreases visibility across team"
          },
          "typeVersion": 1
        },
        {
          "id": "ff75e3fe-540c-4c7d-be9e-3c6b4b4d03b1",
          "name": "Sticky Note14",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            3152,
            288
          ],
          "parameters": {
            "color": 7,
            "width": 320,
            "height": 416,
            "content": "\n\n\n\n\n\n\n\n\n\n\n\n## ASSIGNEE GROUPING\n\n**Input**: 3 individual action items\n**Processing**: Groups tasks by **assignee name**\n**Output**: 2 items (one per unique assignee)\n**Example**: Sarah gets 1 item with 2 tasks\nAkshita gets 1 item with 1 task\n\n- Reduces email volume (1 email per person vs per task)"
          },
          "typeVersion": 1
        },
        {
          "id": "d7d7e9b6-16b5-4db2-be87-20501af66bef",
          "name": "Sticky Note15",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            3568,
            16
          ],
          "parameters": {
            "color": 7,
            "width": 336,
            "height": 464,
            "content": "## PERSONALIZED TASK NOTIFICATIONS\n\nSends to:**[assignee]@company.com**\nDynamic content:\n- Task count (singular/plural handling)\n- All tasks for that assignee\n- Priority-based color coding\n- Days until deadline calculated\n- PDF download link included\n**Loops**: Once per unique assignee"
          },
          "typeVersion": 1
        },
        {
          "id": "b26bb8e7-6955-42e2-997a-139105fcd227",
          "name": "Sticky Note16",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1888,
            512
          ],
          "parameters": {
            "color": 7,
            "width": 320,
            "height": 400,
            "content": "\n\n\n\n\n\n\n\n\n\n\n## TASK ITEM SEPARATION\n\n- **Input**: Complete meeting data with all action items\n- **Processing**: Creates separate item per action item\n- **Output**: N items (one per task)\n- **Purpose**: Allows individual task creation in Google Tasks\n- **Each item contains**: task, assignee, deadline, context"
          },
          "typeVersion": 1
        },
        {
          "id": "b7dd2f52-cc18-4636-846b-0038e3b23eb8",
          "name": "Sticky Note17",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2240,
            512
          ],
          "parameters": {
            "color": 7,
            "width": 272,
            "height": 544,
            "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## TASK MANAGEMENT INTEGRATION\n\n**Select your preferred Google Tasks list**\n**Creates task** in: **Google Tasks**\nFields populated:\n- Title: Task description\n- Due date: ISO format with timezone\n- Notes: Context + meeting reference + assignee\n**Task List**: Default list\nEnables tracking in Google ecosystem"
          },
          "typeVersion": 1
        },
        {
          "id": "756c055c-ef44-4368-8531-44faa8ebb6a1",
          "name": "Sticky Note18",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -816,
            -352
          ],
          "parameters": {
            "color": 7,
            "width": 464,
            "height": 1184,
            "content": "## MEETING MINUTES & ACTION ITEM TRACKER - OVERVIEW\n\n\nPURPOSE:\nAutomates the complete meeting documentation and task distribution \nprocess using AI. Converts raw meeting transcripts into professional \nPDFs, distributes to stakeholders, and creates trackable tasks.\n\nINPUT:\nPOST request to webhook with:\n- Meeting title, date, participants\n- Raw transcript text\n\nPROCESSING STAGES:\n1. DATA PREP: Cleans transcript, validates quality (>50 words)\n2. AI ANALYSIS: GPT-4 generates summary + extracts action items\n3. ENRICHMENT: Adds deadlines, priorities, sorts by urgency\n4. PDF CREATION: Generates professional document with styling\n5. DISTRIBUTION: Emails participants, saves to Drive, posts to Slack\n6. TASK MANAGEMENT: Sends personalized emails, creates Google Tasks\n\nOUTPUT:\n- Professional PDF (stored in Google Drive)\n- Email to all participants with overview\n- Individual emails to each assignee with their specific tasks\n- Slack notification to team channel\n- Tasks created in Google Tasks\n- All action items tracked with deadlines and priorities\n\nKEY FEATURES:\n✓ Parallel processing (speed optimized)\n✓ Priority detection (urgent/high/normal/low)\n✓ Deadline calculation (days remaining)\n✓ Automatic sorting (priority → deadline)\n✓ Grouped notifications (1 email per person, not per task)\n✓ Permanent storage (Google Drive)\n\n\nEXECUTION TIME:\n~30-45 seconds end-to-end\n\nDEPENDENCIES:\n- OpenAI API (GPT-4)\n- Gmail API\n- Google Drive API\n- Google Tasks API\n- Slack API\n- htmlcsstopdf API\n\nERROR HANDLING:\nCurrently no automatic retry. Manual rerun required on failure.\nConsider adding Error Trigger node for production use."
          },
          "typeVersion": 1
        },
        {
          "id": "2828c58b-106b-4131-8e52-7baf1478b85b",
          "name": "Sticky Note19",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -288,
            512
          ],
          "parameters": {
            "color": 7,
            "width": 592,
            "height": 1136,
            "content": "## SETUP INSTRUCTIONS\n\nREQUIRED CREDENTIALS:\n1. OpenAI API - Get from https://platform.openai.com\n2. Gmail OAuth2 - Connect your Google account\n3. Google Drive OAuth2 - Same Google account\n4. Google Tasks OAuth2 - Same Google account\n5. Slack OAuth2 - Connect your workspace\n6. htmlcsstopdf API - Get from https://pdfmunk.com\n\n**CONFIGURATION STEPS**:\n- WEBHOOK: Note your webhook URL after activation\n\n- EMAIL NODES:\n   - \"Email All Participants\": Uses participants array from input\n   - \"Send Individual Task Emails\": Change @yourcompany.com to your domain\n\n- GOOGLE DRIVE:\n   - Select folder where PDFs should be stored\n   - Recommended: Create \"Meeting Minutes\" folder\n\n- SLACK:\n   - Select channel for team notifications\n   - Recommended: Create #meeting-notes channel\n\n- GOOGLE TASKS:\n   - Select task list where tasks should be created\n   - Default list works fine\n\nINPUT FORMAT:\nPOST to webhook with JSON:\n```\n{\n  \"title\": \"Meeting Title\",\n  \"date\": \"2025-09-29\",\n  \"participants\": [\"person1@email.com\", \"person2@email.com\"],\n  \"duration\": \"45 minutes\",\n  \"transcript\": \"Full meeting transcript text here...\"\n}\n```\nTESTING:\n1. Use the webhook URL with sample meeting data\n2. Check execution log for any errors\n3. Verify PDF in Google Drive\n4. Check emails were sent\n5. Confirm tasks created in Google Tasks\n\nCUSTOMIZATION:\n- Modify PDF styling in \"Generate PDF Document\" node\n- Adjust email templates in Gmail nodes\n- Change AI prompts in OpenAI nodes for different output\n- Modify priority/deadline logic in \"Parse and Enrich Data\""
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "ff824dc2-123e-4310-a036-d320361fffe1",
      "connections": {
        "Clean Transcript": {
          "main": [
            [
              {
                "node": "Validate Transcript Length",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Save PDF to Drive": {
          "main": [
            [
              {
                "node": "Add PDF Download Link",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Combine AI Responses": {
          "main": [
            [
              {
                "node": "Parse and Enrich Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Extract Action Items": {
          "main": [
            [
              {
                "node": "Combine AI Responses",
                "type": "main",
                "index": 1
              }
            ]
          ]
        },
        "Notify Slack Channel": {
          "main": [
            []
          ]
        },
        "Receive Meeting Data": {
          "main": [
            [
              {
                "node": "Extract Meeting Metadata",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Add PDF Download Link": {
          "main": [
            [
              {
                "node": "Notify Slack Channel",
                "type": "main",
                "index": 0
              },
              {
                "node": "Group Tasks by Assignee",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Download PDF from URL": {
          "main": [
            [
              {
                "node": "Save PDF to Drive",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Generate PDF Document": {
          "main": [
            [
              {
                "node": "Email All Participants",
                "type": "main",
                "index": 0
              },
              {
                "node": "Download PDF from URL",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Parse and Enrich Data": {
          "main": [
            [
              {
                "node": "Generate PDF Document",
                "type": "main",
                "index": 0
              },
              {
                "node": "Split Tasks for Creation",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Email All Participants": {
          "main": [
            []
          ]
        },
        "Group Tasks by Assignee": {
          "main": [
            [
              {
                "node": "Send Individual Task Emails",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Extract Meeting Metadata": {
          "main": [
            [
              {
                "node": "Clean Transcript",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Generate Meeting Summary": {
          "main": [
            [
              {
                "node": "Combine AI Responses",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Split Tasks for Creation": {
          "main": [
            [
              {
                "node": "Create Task in Google Tasks",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Validate Transcript Length": {
          "main": [
            [
              {
                "node": "Generate Meeting Summary",
                "type": "main",
                "index": 0
              },
              {
                "node": "Extract Action Items",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Send Individual Task Emails": {
          "main": [
            []
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 38,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 1
        },
        "n8n-nodes-base.set": {
          "count": 2
        },
        "n8n-nodes-base.code": {
          "count": 4
        },
        "n8n-nodes-base.gmail": {
          "count": 2
        },
        "n8n-nodes-base.merge": {
          "count": 1
        },
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.webhook": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 20
        },
        "n8n-nodes-base.googleDrive": {
          "count": 1
        },
        "n8n-nodes-base.googleTasks": {
          "count": 1
        },
        "n8n-nodes-base.httpRequest": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.openAi": {
          "count": 2
        },
        "n8n-nodes-htmlcsstopdf.htmlcsstopdf": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Jitesh Dugar",
      "username": "jiteshdugar",
      "bio": "AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/jiteshdugar"
      ],
      "avatar": "https://gravatar.com/avatar/edaa3abb99806b0586dced559d0a5417f24a507e7c4464a63960f0638a4b1b90?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 19,
        "icon": "file:httprequest.svg",
        "name": "n8n-nodes-base.httpRequest",
        "codex": {
          "data": {
            "alias": [
              "API",
              "Request",
              "URL",
              "Build",
              "cURL"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/world-poetry-day-workflow/",
                  "icon": "📜",
                  "label": "Celebrating World Poetry Day with a daily poem in Telegram"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/",
                  "icon": "🎨",
                  "label": "Automate Designs with Bannerbear and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/",
                  "icon": "🧰",
                  "label": "How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                },
                {
                  "url": "https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/",
                  "icon": "🤟",
                  "label": "Creating scheduled text affirmations with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "HTTP Request",
          "color": "#0004F5"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="
        },
        "displayName": "HTTP Request",
        "typeVersion": 4,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 20,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.if",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "Filter",
              "Condition",
              "Logic",
              "Boolean",
              "Branch"
            ],
            "details": "The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/",
                  "icon": "🤬",
                  "label": "Create a toxic language detector for Telegram in 4 step"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "If",
          "color": "#408000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "If",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 24,
        "icon": "file:merge.svg",
        "name": "n8n-nodes-base.merge",
        "codex": {
          "data": {
            "alias": [
              "Join",
              "Concatenate",
              "Wait"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Merge"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Merge",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 38,
        "icon": "fa:pen",
        "name": "n8n-nodes-base.set",
        "codex": {
          "data": {
            "alias": [
              "Set",
              "JS",
              "JSON",
              "Filter",
              "Transform",
              "Map"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/",
                  "icon": "📹",
                  "label": "The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Edit Fields"
        },
        "iconData": {
          "icon": "pen",
          "type": "icon"
        },
        "displayName": "Edit Fields (Set)",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 40,
        "icon": "file:slack.svg",
        "name": "n8n-nodes-base.slack",
        "codex": {
          "data": {
            "alias": [
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/slack/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Slack"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Slack",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 47,
        "icon": "file:webhook.svg",
        "name": "n8n-nodes-base.webhook",
        "codex": {
          "data": {
            "alias": [
              "HTTP",
              "API",
              "Build",
              "WH"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/",
                  "icon": "💻",
                  "label": "How a digital strategist uses n8n for online marketing"
                },
                {
                  "url": "https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/",
                  "icon": "📹",
                  "label": "The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/",
                  "label": "How to automate every step of an incident response workflow"
                },
                {
                  "url": "https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Webhook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"
        },
        "displayName": "Webhook",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 58,
        "icon": "file:googleDrive.svg",
        "name": "n8n-nodes-base.googleDrive",
        "codex": {
          "data": {
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledrive/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Data & Storage"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Google Drive"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Google Drive",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          }
        ]
      },
      {
        "id": 332,
        "icon": "file:googleTasks.svg",
        "name": "n8n-nodes-base.googleTasks",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googletasks/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Productivity"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Google Tasks"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMxLjE0MTEgNS40MjM4M0wyNy45ODQ1IDcuMTYxNDdMMjYuNDIxNCAxMC4xNTExTDI3Ljk4NDUgMTMuODA4NUwzMC45NDM4IDE3LjAxMDdMMzQuMTQ1OSAxNS4yMjc1TDM2LjExMTIgMTEuODM1N0wzNC4xNDU5IDcuNjM5NTJMMzEuMTQxMSA1LjQyMzgzWiIgZmlsbD0iIzAwNjZEQSIvPgo8cGF0aCBkPSJNMTguOTE2OCAxNy42NDhMMjYuNDIxMyAxMC4xNDM1QzI4LjYyOTQgMTEuODIwNSAzMC4yNTMzIDE0LjIyNTggMzAuOTQzOCAxNy4wMDNMMjAuNjQ2OSAyNy4zMDc1QzE5LjcyMTEgMjguMjMzMiAxOC4yMTg3IDI4LjIzMzIgMTcuMjkzIDI3LjMwNzVMMTAuMzUgMjAuMzY0NUM5LjYwNjM3IDE5LjYyMDkgOS42MDYzNyAxOC40MjIgMTAuMzUgMTcuNjg2TDEzLjMwOTMgMTQuNzI2NkMxNC4wNTI5IDEzLjk4MyAxNS4yNTE4IDEzLjk4MyAxNS45ODc5IDE0LjcyNjZMMTguOTE2OCAxNy42NDhaTTM5LjQ0MjMgNS44MjU5NUwzNi40Mjk5IDIuODEzNTNDMzUuNjkzOCAyLjA3NzQ5IDM0LjQ4NzMgMi4wNzc0OSAzMy43NTEzIDIuODEzNTNMMzEuMTQxIDUuNDIzNzlDMzMuMjI3NyA3LjE2OTAyIDM0LjkyNzQgOS4zNTQzNiAzNi4xMTEyIDExLjgzNTZMMzkuNDQyMyA4LjUwNDUxQzQwLjE4NTkgNy43Njg0NyA0MC4xODU5IDYuNTYxOTggMzkuNDQyMyA1LjgyNTk1Wk0zMS4zMDA0IDE5Ljk2OTlDMzEuMzAwNCAyNi43ODM5IDI1Ljc3NjMgMzIuMzAwNCAxOC45Njk5IDMyLjMwMDRDMTIuMTYzNSAzMi4zMDA0IDYuNjM5NDggMjYuNzgzOSA2LjYzOTQ4IDE5Ljk2OTlDNi42Mzk0OCAxMy4xNTU5IDEyLjE1NTkgNy42Mzk0OCAxOC45Njk5IDcuNjM5NDhDMjEuNzY5OSA3LjYzOTQ4IDI0LjM0OTggOC41NzI4IDI2LjQyMTMgMTAuMTUxMUwzMS4xNDEgNS40MzEzOEMyNy44NDc5IDIuNjYxNzcgMjMuNjA2MiAxIDE4Ljk2OTkgMUM4LjQ5MDk0IDEgMCA5LjQ5MDk0IDAgMTkuOTY5OUMwIDMwLjQ0ODkgOC40OTA5NCAzOC45Mzk5IDE4Ljk2OTkgMzguOTM5OUMyOS40NDg5IDM4LjkzOTkgMzcuOTM5OSAzMC40NDg5IDM3LjkzOTkgMTkuOTY5OUMzNy45Mzk5IDE3LjA2MzcgMzcuMjc5NyAxNC4zMDE3IDM2LjExMTIgMTEuODM1NkwzMC45NDM4IDE3LjAxMDZDMzEuMTcxNCAxNy45NTkxIDMxLjMwMDQgMTguOTUzMSAzMS4zMDA0IDE5Ljk2OTlaIiBmaWxsPSIjMjY4NEZDIi8+Cjwvc3ZnPgo="
        },
        "displayName": "Google Tasks",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 4,
            "name": "Productivity"
          }
        ]
      },
      {
        "id": 356,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmail",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Gmail"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 1250,
        "icon": "file:openAi.svg",
        "name": "@n8n/n8n-nodes-langchain.openAi",
        "codex": {
          "data": {
            "alias": [
              "LangChain",
              "ChatGPT",
              "Sora",
              "DallE",
              "whisper",
              "audio",
              "transcribe",
              "tts",
              "assistant"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.openai/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Agents",
                "Miscellaneous",
                "Root Nodes"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "OpenAI"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg1IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NiAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MSA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K"
        },
        "displayName": "OpenAI",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 40,
        "name": "Support Chatbot"
      },
      {
        "id": 47,
        "name": "AI Chatbot"
      }
    ],
    "image": []
  }
}