{
  "workflow": {
    "id": 9680,
    "name": "Smart email triage with Gmail, GPT-4, Slack and Google Sheets",
    "views": 72,
    "recentViews": 0,
    "totalViews": 72,
    "createdAt": "2025-10-15T06:52:24.512Z",
    "description": "## Description\nThis workflow intelligently analyzes incoming Gmail emails, classifies intent using GPT-4, and sends real-time Slack notifications while logging structured data into Google Sheets. It provides a smart, AI-assisted communication workflow that saves time and ensures no important email is overlooked. 🤖💌📊\n\n## What This Template Does\n- Monitors Gmail for unread or new incoming emails. 📥\n- Extracts sender, subject, and body content for processing. ✉️\n- Uses GPT-4 to analyze email intent and determine priority. 🧠\n- Formats key insights (sender, summary, intent, urgency). 🧾\n- Posts structured summaries and priority alerts in Slack. 💬\n- Logs all processed emails with classification results in Google Sheets. 📊\n- Sends error notifications in case of API or parsing failures. 🚨\n\n## Key Benefits\n✅ AI-driven email intent classification for smarter response handling.\n ✅ Seamless Slack notifications for high-priority or urgent emails.\n ✅ Maintains a centralized record of email insights in Google Sheets.\n ✅ Reduces response time by surfacing critical messages instantly.\n ✅ Minimizes manual email triage and improves team productivity.\n\n## Features\n- Real-time Gmail monitoring for unread emails.\n- AI-based classification using GPT-4.\n- Slack notifications with rich formatting and urgency tagging.\n- Google Sheets logging for tracking and analytics.\n- Built-in error handling with notification alerts.\n- Modular setup for easy credential reuse across projects.\n\n## Requirements\n- Gmail OAuth2 credentials with inbox read access.\n- Slack Bot token with chat:write and channels:history scopes.\n- Google Sheets OAuth2 credentials for data logging.\n- Azure OpenAI (or OpenAI GPT-4) API credentials.\n- n8n instance (cloud or self-hosted).\n\n## Target Audience\n- Customer support teams managing shared inboxes.\n- Operations teams tracking email-based requests.\n- Sales or marketing teams prioritizing inbound leads.\n- AI automation enthusiasts optimizing email workflows.\n- Remote teams using Slack for real-time updates.\n\n## Step-by-Step Setup Instructions\n- Connect your Gmail, Slack, Google Sheets, and GPT-4 credentials in n8n. 🔑\n- Specify the Gmail search filter (e.g., is:unread) for tracking new emails. 📬\n- Add your Slack channel ID in the notification node. 💬\n- Set your Google Sheet ID and tab name for logging results. 📊\n- Run once manually to verify connection and output structure. ✅\n- Enable the workflow for continuous, real-time execution. 🚀",
    "workflow": {
      "id": "EkrH16IadUZrhHQT",
      "meta": {
        "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
        "templateCredsSetupCompleted": true
      },
      "name": "AI-Powered Email Triage from Gmail to Slack and Sheets",
      "tags": [],
      "nodes": [
        {
          "id": "0165f79d-f529-425c-8b1c-acdb665c4e04",
          "name": "Gmail Trigger",
          "type": "n8n-nodes-base.gmailTrigger",
          "position": [
            -1696,
            608
          ],
          "parameters": {
            "simple": false,
            "filters": {},
            "options": {},
            "pollTimes": {
              "item": [
                {
                  "mode": "everyMinute"
                }
              ]
            }
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "ad5d0c60-0851-4084-89b8-29f93541cba9",
          "name": "Extract Email Data",
          "type": "n8n-nodes-base.code",
          "position": [
            -1472,
            608
          ],
          "parameters": {
            "jsCode": "const emailData = items[0].json;\n\nconst extractedData = {\n  sender: emailData.from || 'Unknown Sender',\n  subject: emailData.subject || 'No Subject',\n  bodyText: emailData.textPlain || emailData.text || '',\n  bodyHtml: emailData.html || '',\n  attachments: emailData.attachments || [],\n  messageId: emailData.id,\n  receivedDate: emailData.date || new Date().toISOString(),\n  threadId: emailData.threadId\n};\n\nconst linkRegex = /https?:\\/\\/[^\\s<>\"{}|\\\\^`\\[\\]]+/gi;\nconst textLinks = (extractedData.bodyText.match(linkRegex) || []);\nconst htmlLinks = (extractedData.bodyHtml.match(linkRegex) || []);\nconst allLinks = [...new Set([...textLinks, ...htmlLinks])];\n\nextractedData.links = allLinks;\n\n// ENHANCED ATTACHMENT DETECTION LOGIC\nlet attachmentCount = 0;\nlet hasAttachments = false;\n\n// Check the original attachments array first\nif (extractedData.attachments && extractedData.attachments.length > 0) {\n  attachmentCount = extractedData.attachments.length;\n  hasAttachments = true;\n}\n\n// Check Gmail payload parts for attachments\nif (!hasAttachments && emailData.payload && emailData.payload.parts) {\n  const attachmentParts = emailData.payload.parts.filter(part => \n    part.filename && part.filename !== '' && part.body && part.body.attachmentId\n  );\n  if (attachmentParts.length > 0) {\n    attachmentCount = attachmentParts.length;\n    hasAttachments = true;\n  }\n}\n\n// Check content-type header for multipart/mixed (indicates attachments)\nif (!hasAttachments && emailData.headers && emailData.headers['content-type']) {\n  const contentType = emailData.headers['content-type'];\n  if (contentType.includes('multipart/mixed')) {\n    hasAttachments = true;\n    attachmentCount = 1; // At least one attachment\n  }\n}\n\n// Check email content for attachment keywords as final fallback\nif (!hasAttachments) {\n  const emailText = (extractedData.bodyText + ' ' + extractedData.bodyHtml).toLowerCase();\n  const attachmentKeywords = ['attached', 'attachment', 'please review the attached', 'pdf', 'excel', 'document'];\n  \n  if (attachmentKeywords.some(keyword => emailText.includes(keyword))) {\n    hasAttachments = true;\n    attachmentCount = 1;\n  }\n}\n\nextractedData.hasAttachments = hasAttachments;\nextractedData.attachmentCount = attachmentCount;\n\nconst bodyForAnalysis = extractedData.bodyText || extractedData.bodyHtml.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\nextractedData.bodyForAnalysis = bodyForAnalysis.substring(0, 3000);\n\nreturn [{ json: extractedData }];"
          },
          "typeVersion": 2
        },
        {
          "id": "0a775b80-163e-4048-8fd3-01ab020a3d2a",
          "name": "Check Attachments",
          "type": "n8n-nodes-base.if",
          "position": [
            -1248,
            608
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 1,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "or",
              "conditions": [
                {
                  "id": "has-attachments",
                  "operator": {
                    "type": "boolean",
                    "operation": "equal"
                  },
                  "leftValue": "={{ $json.hasAttachments }}",
                  "rightValue": true
                },
                {
                  "id": "bdea6274-0c71-4d15-b97d-8cd325208efe",
                  "operator": {
                    "type": "boolean",
                    "operation": "true",
                    "singleValue": true
                  },
                  "leftValue": "={{ $json.hasAttachments }}",
                  "rightValue": 0
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "60bdd6dc-2c09-4e41-bd24-2d191827cfde",
          "name": "Process Attachments",
          "type": "n8n-nodes-base.code",
          "position": [
            -1024,
            512
          ],
          "parameters": {
            "jsCode": "const emailData = items[0].json;\nlet attachmentText = '';\nconst processedAttachments = [];\n\nif (emailData.attachments && emailData.attachments.length > 0) {\n  for (const attachment of emailData.attachments) {\n    const processed = {\n      filename: attachment.filename || 'unknown',\n      contentType: attachment.contentType || 'unknown',\n      size: attachment.size || 0,\n      textExtracted: false,\n      extractedText: ''\n    };\n    \n    if (attachment.contentType) {\n      if (attachment.contentType.includes('text/')) {\n        processed.extractedText = 'Text file content available';\n        processed.textExtracted = true;\n      } else if (attachment.contentType.includes('pdf')) {\n        processed.extractedText = 'PDF attachment detected - text extraction requires additional service';\n        processed.textExtracted = false;\n      } else if (attachment.contentType.includes('word') || attachment.contentType.includes('document')) {\n        processed.extractedText = 'Word document detected - text extraction requires additional service';\n        processed.textExtracted = false;\n      }\n    }\n    \n    processedAttachments.push(processed);\n    \n    if (processed.textExtracted) {\n      attachmentText += `\\n[Attachment: ${processed.filename}] ${processed.extractedText}`;\n    }\n  }\n}\n\nconst combinedContent = emailData.bodyForAnalysis + attachmentText;\n\nreturn [{\n  json: {\n    ...emailData,\n    processedAttachments,\n    combinedContent: combinedContent.substring(0, 4000),\n    attachmentProcessingComplete: true\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "cabfad79-67be-4fb5-83ca-a22b73275101",
          "name": "Skip Attachments",
          "type": "n8n-nodes-base.code",
          "position": [
            -1024,
            704
          ],
          "parameters": {
            "jsCode": "const emailData = items[0].json;\n\nreturn [{\n  json: {\n    ...emailData,\n    processedAttachments: [],\n    combinedContent: emailData.bodyForAnalysis,\n    attachmentProcessingComplete: true\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "8a4771ff-2e1f-4411-9b7f-7c57b663494e",
          "name": "Parse AI Response",
          "type": "n8n-nodes-base.code",
          "position": [
            -336,
            608
          ],
          "parameters": {
            "jsCode": "// Parse AI response and handle the actual output structure\nlet aiData;\ntry {\n  // Get the AI response - handle multiple possible structures\n  let aiResponse;\n  \n  // Check if it's the direct output structure you showed\n  if (items[0].json.output) {\n    aiResponse = items[0].json.output;\n  }\n  // Check for standard OpenAI response formats\n  else if (items[0].json.message?.content) {\n    const content = items[0].json.message.content;\n    // Try to parse JSON from content\n    const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n    if (jsonMatch) {\n      aiResponse = JSON.parse(jsonMatch[0]);\n    } else {\n      aiResponse = content;\n    }\n  }\n  // Check for other possible response formats\n  else if (items[0].json.text) {\n    const text = items[0].json.text;\n    const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n    if (jsonMatch) {\n      aiResponse = JSON.parse(jsonMatch[0]);\n    } else {\n      aiResponse = text;\n    }\n  }\n  // Check if the response is directly in the json\n  else if (items[0].json.summary || items[0].json.callToAction || items[0].json.insights) {\n    aiResponse = items[0].json;\n  }\n  else {\n    throw new Error('Unknown AI response format');\n  }\n  \n  // Now handle the parsed response\n  if (typeof aiResponse === 'object' && aiResponse.summary) {\n    // Direct object format (like your output)\n    aiData = {\n      summary: aiResponse.summary || 'AI analysis unavailable',\n      callToAction: aiResponse.callToAction || 'For Your Information',\n      insights: aiResponse.insights || 'No specific insights available'\n    };\n  } else if (typeof aiResponse === 'string') {\n    // String format - try to parse JSON\n    const jsonMatch = aiResponse.match(/\\{[\\s\\S]*\\}/);\n    if (jsonMatch) {\n      const parsed = JSON.parse(jsonMatch[0]);\n      aiData = {\n        summary: parsed.summary || 'AI analysis unavailable',\n        callToAction: parsed.callToAction || 'For Your Information',\n        insights: parsed.insights || 'No specific insights available'\n      };\n    } else {\n      throw new Error('Could not extract JSON from AI response');\n    }\n  } else {\n    throw new Error('Unexpected AI response format');\n  }\n  \n  // Validate and clean up the data\n  if (!aiData.summary) aiData.summary = 'AI analysis unavailable';\n  if (!aiData.callToAction) aiData.callToAction = 'For Your Information';\n  if (!aiData.insights) aiData.insights = 'No specific insights available';\n  \n  // Ensure callToAction is one of the expected values\n  const validActions = ['Reply Needed', 'Review Attachment', 'For Your Information'];\n  if (!validActions.includes(aiData.callToAction)) {\n    aiData.callToAction = 'For Your Information';\n  }\n  \n} catch (error) {\n  // Fallback if AI parsing fails\n  aiData = {\n    summary: 'Email received but AI analysis failed. Please review manually.',\n    callToAction: 'For Your Information',\n    insights: 'Manual review required due to AI processing error.',\n    aiError: true,\n    aiErrorMessage: error.message\n  };\n}\n\n// Get the original email data from the previous node\n// Try multiple node references in case the node name is different\nlet emailData;\ntry {\n  emailData = $node['AI Analysis'].json || $input.first().json;\n} catch (e) {\n  // Fallback to items[0].json if node reference fails\n  emailData = items[0].json;\n}\n\n// Return the processed data\nreturn [{\n  json: {\n    ...emailData,\n    aiAnalysis: aiData,\n    processingComplete: true,\n    timestamp: new Date().toISOString()\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "e654bdf6-3782-4220-ade3-19bf09294e2a",
          "name": "Route Urgent",
          "type": "n8n-nodes-base.if",
          "position": [
            -112,
            608
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 1,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "reply-needed",
                  "operator": {
                    "type": "string",
                    "operation": "equals"
                  },
                  "leftValue": "={{ $json.aiAnalysis.callToAction }}",
                  "rightValue": "Reply Needed"
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "1a1f32a6-67f2-4bb4-92b1-3c0e6b6c40ee",
          "name": "Route Attachments",
          "type": "n8n-nodes-base.if",
          "position": [
            112,
            704
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 1,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "review-attachment",
                  "operator": {
                    "type": "string",
                    "operation": "equals"
                  },
                  "leftValue": "={{ $json.aiAnalysis.callToAction }}",
                  "rightValue": "Review Attachment"
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "7f338c68-740c-48b0-9776-c57bd4707d60",
          "name": "Slack Urgent",
          "type": "n8n-nodes-base.slack",
          "position": [
            336,
            416
          ],
          "webhookId": "4e77062d-a1d4-46ca-8d70-1a3bf3beaa71",
          "parameters": {
            "text": "=🚨 URGENT EMAIL REQUIRES REPLY\n\n*From:* {{ $('Extract Email Data').item.json.sender.value[0].address }}\n*Subject:* {{ $('Extract Email Data').item.json.subject }}\n*Received:* {{ $('Extract Email Data').item.json.receivedDate }}\n\n*AI Summary:*\n{{ $json.aiAnalysis.summary }}\n\n*Action Required:* {{ $json.aiAnalysis.callToAction }}\n*Insights:* {{ $json.aiAnalysis.insights }}\n",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C09H21LK9BJ",
              "cachedResultName": "reply-needed"
            },
            "otherOptions": {}
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2
        },
        {
          "id": "09091b5d-fbae-4fb4-b23c-077a7b59d36f",
          "name": "Slack Attachments",
          "type": "n8n-nodes-base.slack",
          "position": [
            336,
            608
          ],
          "webhookId": "9e25a820-c2f1-4639-91ad-aa55a1a2d976",
          "parameters": {
            "text": "=📎 EMAIL WITH ATTACHMENTS TO REVIEW\n\n*From:* {{ $('Extract Email Data').item.json.sender.value[0].address }}\n*Subject:* {{ $('Extract Email Data').item.json.subject }}\n*Received:* {{ $('Extract Email Data').item.json.receivedDate }}\n\n*AI Summary:*\n{{ $json.aiAnalysis.summary }}\n\n*Action Required:* {{ $json.aiAnalysis.callToAction }}\n*Insights:* {{ $json.aiAnalysis.insights }} \n\n*Links* {{ $json.output.links }}\n\n\n",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C09G3QM1NUT",
              "cachedResultName": "review-needed"
            },
            "otherOptions": {}
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2
        },
        {
          "id": "e752f272-dc3f-4e8b-a9c7-729cfd1a9862",
          "name": "Slack General",
          "type": "n8n-nodes-base.slack",
          "position": [
            336,
            800
          ],
          "webhookId": "4f99f77b-98ab-4dd9-b6c2-c4284c6ebfbe",
          "parameters": {
            "text": "=📧 EMAIL FOR YOUR INFORMATION\n\n*From:* {{ $('Extract Email Data').item.json.sender.value[0].address }}\n*Subject:* {{ $('Extract Email Data').item.json.subject }}\n*Received:* {{ $('Extract Email Data').item.json.receivedDate }}\n\n*AI Summary:*\n{{ $json.aiAnalysis.summary }}\n\n*Action Required:* {{ $json.aiAnalysis.callToAction }}\n*Insights:* {{ $json.aiAnalysis.insights }} ",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C09GNB90TED",
              "cachedResultName": "general-information"
            },
            "otherOptions": {}
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2
        },
        {
          "id": "93b2c1f4-b532-4102-aef9-42fd0192b6ba",
          "name": "Structured Output Parser",
          "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
          "position": [
            -544,
            832
          ],
          "parameters": {
            "jsonSchemaExample": "{\n  \"summary\": \"string\",\n  \"callToAction\": \"Reply Needed | Review Attachment | For Your Information\",\n  \"insights\": \"string\",\n  \"links\": [\"string\"],\n  \"attachments\": [\"string\"]\n}\n"
          },
          "typeVersion": 1.3
        },
        {
          "id": "80a7ba77-5601-4a8b-a45d-5dea98b1d112",
          "name": "Azure OpenAI Chat Model1",
          "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
          "position": [
            -800,
            832
          ],
          "parameters": {
            "model": "gpt-4o",
            "options": {}
          },
          "credentials": {
            "azureOpenAiApi": {
              "id": "credential-id",
              "name": "azureOpenAiApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "c9b3832f-eef9-4c7f-a7a0-b5585cf5b610",
          "name": "Simple Memory1",
          "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
          "position": [
            -672,
            832
          ],
          "parameters": {
            "sessionKey": "\"json_review\"",
            "sessionIdType": "customKey",
            "contextWindowLength": 7
          },
          "typeVersion": 1.3
        },
        {
          "id": "5a329a24-6335-4f09-aed3-c410023c520d",
          "name": "AI Agent",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            -752,
            608
          ],
          "parameters": {
            "text": "={{ $json.subject }},{{ $json.bodyForAnalysis }}{{ $json.bodyHtml }}{{ $json.links }}",
            "options": {
              "systemMessage": "=You are an AI email assistant. Analyze the provided email content (subject, body text, HTML, and links) and return a structured JSON with the following fields:\n\n- summary: A concise plain text summary of the email.\n- callToAction: Choose one of [\"Reply Needed\", \"Review Attachment\", \"For Your Information\"] based on the email’s intent.\n- insights: Key points, deadlines, or important notes mentioned in the email.\n- links: Extract all valid links from the email content. If none are present, return an empty array [].\n- attachments: If attachments are mentioned in the text, list them as [\"PDF\", \"Excel\", \"Word\"] or return [].\n\nAlways respond with valid JSON only.\n"
            },
            "promptType": "define",
            "hasOutputParser": true
          },
          "typeVersion": 2.1
        },
        {
          "id": "87dededf-da46-4af9-9537-5a837f8bc3f8",
          "name": "Log to Google Sheets",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            784,
            608
          ],
          "parameters": {
            "columns": {
              "value": {},
              "schema": [
                {
                  "id": "timestamp",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "timestamp",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "sender",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "sender",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "subject",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "subject",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "ai_summary",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "ai_summary",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "action_required",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "action_required",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "slack_channel",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "slack_channel",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "has_attachments",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "has_attachments",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                }
              ],
              "mappingMode": "autoMapInputData",
              "matchingColumns": [
                "id"
              ],
              "attemptToConvertTypes": false,
              "convertFieldsToString": false
            },
            "options": {},
            "operation": "appendOrUpdate",
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": "gid=0",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1w_oZJKqp8sX4IAGs_UuAIx6U-ztqKsOpkTa7plhUQ3E/edit#gid=0",
              "cachedResultName": "Sheet1"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "1w_oZJKqp8sX4IAGs_UuAIx6U-ztqKsOpkTa7plhUQ3E",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1w_oZJKqp8sX4IAGs_UuAIx6U-ztqKsOpkTa7plhUQ3E/edit?usp=drivesdk",
              "cachedResultName": "Emails Sync data"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "credential-id",
              "name": "googleSheetsOAuth2Api Credential"
            }
          },
          "typeVersion": 4
        },
        {
          "id": "e8db91ad-dbbf-47de-9ad0-c632909dc1ad",
          "name": "Code",
          "type": "n8n-nodes-base.code",
          "position": [
            560,
            608
          ],
          "parameters": {
            "jsCode": "// Format only essential data for Google Sheets logging\nconst slackResponse = items[0].json;\nconst slackMessage = slackResponse.message || {};\nconst messageText = slackMessage.text || '';\n\n// Extract key information from Slack message\nconst fromMatch = messageText.match(/\\*From:\\*\\s*(?:<mailto:([^|>]+)\\|([^>]+)>|([^\\n*]+))/);\nconst subjectMatch = messageText.match(/\\*Subject:\\*\\s*([^\\n*]+)/);\nconst summaryMatch = messageText.match(/\\*AI Summary:\\*\\s*([\\s\\S]*?)(?=\\n\\n\\*|\\n\\*|$)/);\nconst actionMatch = messageText.match(/\\*Action Required:\\*\\s*([^\\n*]+)/);\n\n// Determine channel based on message content\nlet channelName = '#general';\nif (messageText.includes('URGENT EMAIL REQUIRES REPLY')) {\n  channelName = '#urgent';\n} else if (messageText.includes('EMAIL WITH ATTACHMENTS')) {\n  channelName = '#attachments';\n}\n\n// Check for attachments\nconst hasAttachments = messageText.includes('📎') || messageText.includes('Attachments');\n\n// Essential data only (6-7 columns)\nconst essentialData = {\n  timestamp: new Date().toISOString(),\n  sender: fromMatch?.[1] || fromMatch?.[2] || fromMatch?.[3] || 'Unknown',\n  subject: subjectMatch?.[1]?.trim() || 'Unknown',\n  ai_summary: summaryMatch?.[1]?.trim().replace(/\\n/g, ' ').substring(0, 200) || 'No summary',\n  action_required: actionMatch?.[1]?.trim() || 'For Your Information',\n  slack_channel: channelName,\n  has_attachments: hasAttachments\n};\n\nreturn [{\n  json: essentialData\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "76c9328a-719f-4fc0-9328-920d6da6b216",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1536,
            208
          ],
          "parameters": {
            "height": 400,
            "content": "## 🔧 Extract Email Data\nProcesses raw Gmail data and extracts key information.\n\n**Details:**\n- Extracts sender, subject, body text/HTML\n- Identifies and extracts all links from email content\n- Advanced attachment detection using multiple methods\n- Checks for attachment keywords in email text\n- Prepares clean data structure for AI analysis\n"
          },
          "typeVersion": 1
        },
        {
          "id": "f76d4704-8586-4793-ba03-764aa910629d",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2016,
            544
          ],
          "parameters": {
            "height": 304,
            "content": "## 📧 Gmail Trigger\nMonitors your **Gmail inbox** for new incoming emails.\n\n**Details:**\n- Polls Gmail every minute for new messages\n- Uses OAuth2 authentication\n- Triggers the workflow when new emails arrive\n- Provides raw email data to the next node.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "28ca059c-fe2f-4bc6-857e-d580d2170114",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -752,
            176
          ],
          "parameters": {
            "height": 400,
            "content": "## 🎯 AI Agent\nCore AI engine that analyzes email content and generates insights.\n\n**Details:**\n- Analyzes subject, body text, HTML, and links\n- Categorizes emails by urgency and action required\n- Extracts key insights, deadlines, and important notes\n- Uses structured output parser for consistent JSON responses\n- Connected to OpenAI model and memory for context"
          },
          "typeVersion": 1
        },
        {
          "id": "380d301a-47ef-4271-83af-f1fa7838abd7",
          "name": "Sticky Note3",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1088,
            848
          ],
          "parameters": {
            "height": 336,
            "content": "## ⏭️ Skip Attachments\nBypass attachment processing for emails without attachments.\n\n**Details:**\n- Sets empty processedAttachments array\n- Uses only email body content for analysis\n- Maintains data structure consistency\n- Flags attachment processing as complete"
          },
          "typeVersion": 1
        },
        {
          "id": "5a52def0-ef68-4220-b883-59a9e6b12f97",
          "name": "Sticky Note4",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1120,
            48
          ],
          "parameters": {
            "height": 400,
            "content": "## 📎 Process Attachments\nAnalyzes and processes email attachments when present.\n\n**Details:**\n- Identifies attachment types (text, PDF, Word)\n- Extracts metadata (filename, size, content type)\n- Combines attachment info with email content\n- Prepares enhanced content for AI analysis\n- Limits combined content to 4000 characters"
          },
          "typeVersion": 1
        },
        {
          "id": "276b34ce-62ab-40ef-b1b6-669aa8675978",
          "name": "Sticky Note5",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1440,
            784
          ],
          "parameters": {
            "height": 368,
            "content": "## ❓ Check Attachments\nDecision node that routes emails based on attachment presence.\n\n**Details:**\n- Evaluates if email has attachments\n- Routes to 'Process Attachments' if attachments found\n- Routes to 'Skip Attachments' if no attachments\n- Uses boolean logic for attachment detection"
          },
          "typeVersion": 1
        },
        {
          "id": "427d163f-0133-4a9b-8d3d-93de608e1445",
          "name": "Sticky Note6",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            560,
            128
          ],
          "parameters": {
            "height": 432,
            "content": "## 🔧 Format Data for Sheets\nPrepares and formats data for Google Sheets logging.\n\n**Details:**\n- Extracts essential information from Slack messages\n- Parses sender, subject, AI summary, and action required\n- Determines which Slack channel was used\n- Creates clean, structured data for spreadsheet\n- Limits text fields to appropriate lengths for sheets"
          },
          "typeVersion": 1
        },
        {
          "id": "d51337f2-1cae-45a0-aadc-d307d6c3004a",
          "name": "Sticky Note7",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            672,
            832
          ],
          "parameters": {
            "height": 368,
            "content": "## 📎 Slack Attachments\nSends attachment email notifications to review channel.\n\n**Details:**\n- Posts to #review-needed channel\n- Includes attachment indicator emoji\n- Shows extracted links from email\n- Provides AI summary and insights\n- Prompts for attachment review action\n"
          },
          "typeVersion": 1
        },
        {
          "id": "38c03951-45f4-4820-8a16-952ab81c6a39",
          "name": "Sticky Note8",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            208,
            16
          ],
          "parameters": {
            "height": 336,
            "content": "## 🚨 Slack Urgent\nSends urgent email notifications to priority Slack channel.\n\n**Details:**\n- Posts to #reply-needed channel\n- Includes sender, subject, AI summary\n- Highlights urgent nature with emoji\n- Contains action required and insights\n- Formatted for immediate attention"
          },
          "typeVersion": 1
        },
        {
          "id": "d928682f-8c44-466c-be80-43a59f7fe312",
          "name": "Sticky Note9",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            336,
            1008
          ],
          "parameters": {
            "height": 368,
            "content": "## 📎 Slack Attachments\nSends attachment email notifications to review channel.\n\n**Details:**\n- Posts to #review-needed channel\n- Includes attachment indicator emoji\n- Shows extracted links from email\n- Provides AI summary and insights\n- Prompts for attachment review action"
          },
          "typeVersion": 1
        },
        {
          "id": "05108295-8e4c-4256-8b44-807921e31481",
          "name": "Sticky Note10",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -16,
            896
          ],
          "parameters": {
            "height": 352,
            "content": "## 📎 Route Attachments\nRoutes emails with attachments that need review.\n\n**Details:**\n- Checks if callToAction equals 'Review Attachment'\n- Sends attachment emails to dedicated Slack channel\n- Routes informational emails to general channel\n- Second-level priority routing decision"
          },
          "typeVersion": 1
        },
        {
          "id": "950030af-00be-4ec7-84b7-8df2aa13adf4",
          "name": "Sticky Note11",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -144,
            288
          ],
          "parameters": {
            "height": 304,
            "content": "## 🚨 Route Urgent\nRoutes urgent emails that require immediate reply.\n\n**Details:**\n- Checks if callToAction equals 'Reply Needed'\n- Sends urgent emails to dedicated Slack channel\n- Routes non-urgent emails to attachment check\n- First-level priority routing decision"
          },
          "typeVersion": 1
        },
        {
          "id": "12a423f0-60d5-4b1d-8ecc-7be9cd38eaa9",
          "name": "Sticky Note12",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -432,
            176
          ],
          "parameters": {
            "height": 416,
            "content": "## 🧠 Parse AI Response\nProcesses and validates AI analysis results.\n\n**Details:**\n- Handles multiple AI response formats\n- Extracts summary, callToAction, and insights\n- Validates callToAction values (Reply Needed, Review Attachment, For Your Information)\n- Provides fallback data if AI parsing fails\n- Combines AI results with original email data"
          },
          "typeVersion": 1
        },
        {
          "id": "9a0c14ef-dc99-4055-b330-7f15c765689b",
          "name": "Sticky Note13",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            976,
            704
          ],
          "parameters": {
            "height": 368,
            "content": "## 📊 Log to Google Sheets\nRecords all processed emails in a Google Sheets database.\n\n**Details:**\n- Appends/updates email data in centralized spreadsheet\n- Maintains historical record of all processed emails\n- Uses OAuth2 authentication with Google Sheets API\n- Auto-maps input data to sheet columns\n- Provides audit trail and analytics capability"
          },
          "typeVersion": 1
        },
        {
          "id": "bf7f53b9-b1e0-4df8-a20a-6e324bfb3b4c",
          "name": "Sticky Note14",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1008,
            1248
          ],
          "parameters": {
            "height": 336,
            "content": "## 🤖 Azure OpenAI Chat Model\nProvides GPT-4o AI model for email analysis.\n\n**Details:**\n- Uses Azure OpenAI GPT-4o model\n- Processes email content for intelligent analysis\n- Generates structured responses\n- Connected to output parser for formatting"
          },
          "typeVersion": 1
        },
        {
          "id": "90b58171-fa94-4608-8f7f-1396fee6e357",
          "name": "Sticky Note15",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -688,
            1024
          ],
          "parameters": {
            "height": 320,
            "content": "## 🧠 Simple Memory\nProvides conversation memory for AI agent consistency.\n\n**Details:**\n- Maintains context across email analyses\n- Uses 7-message sliding window\n- Custom session key for email processing\n- Helps AI learn patterns and improve responses"
          },
          "typeVersion": 1
        },
        {
          "id": "3b91f3d6-6a71-494d-8716-cd32284ece23",
          "name": "Sticky Note16",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -368,
            800
          ],
          "parameters": {
            "height": 352,
            "content": "## 🏗️ Structured Output Parser\nDefines the expected JSON structure for AI responses.\n\n**Details:**\n- Enforces consistent AI output format\n- Specifies required fields (summary, callToAction, insights)\n- Validates callToAction options\n- Ensures structured data for downstream processing"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "831a8262-6cf6-4bfc-90f2-dd19774de466",
      "connections": {
        "Code": {
          "main": [
            [
              {
                "node": "Log to Google Sheets",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Agent": {
          "main": [
            [
              {
                "node": "Parse AI Response",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Route Urgent": {
          "main": [
            [
              {
                "node": "Slack Urgent",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Route Attachments",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Slack Urgent": {
          "main": [
            [
              {
                "node": "Code",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Gmail Trigger": {
          "main": [
            [
              {
                "node": "Extract Email Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Slack General": {
          "main": [
            [
              {
                "node": "Code",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Simple Memory1": {
          "ai_memory": [
            [
              {
                "node": "AI Agent",
                "type": "ai_memory",
                "index": 0
              }
            ]
          ]
        },
        "Skip Attachments": {
          "main": [
            [
              {
                "node": "AI Agent",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Check Attachments": {
          "main": [
            [
              {
                "node": "Process Attachments",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Skip Attachments",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Parse AI Response": {
          "main": [
            [
              {
                "node": "Route Urgent",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Route Attachments": {
          "main": [
            [
              {
                "node": "Slack Attachments",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Slack General",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Slack Attachments": {
          "main": [
            [
              {
                "node": "Code",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Extract Email Data": {
          "main": [
            [
              {
                "node": "Check Attachments",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Process Attachments": {
          "main": [
            [
              {
                "node": "AI Agent",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Azure OpenAI Chat Model1": {
          "ai_languageModel": [
            [
              {
                "node": "AI Agent",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Structured Output Parser": {
          "ai_outputParser": [
            [
              {
                "node": "AI Agent",
                "type": "ai_outputParser",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 34,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 3
        },
        "n8n-nodes-base.code": {
          "count": 5
        },
        "n8n-nodes-base.slack": {
          "count": 3
        },
        "n8n-nodes-base.stickyNote": {
          "count": 17
        },
        "n8n-nodes-base.gmailTrigger": {
          "count": 1
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.agent": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.memoryBufferWindow": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.outputParserStructured": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Rahul Joshi",
      "username": "rahul08",
      "bio": "Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.\n\n",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/callrahul/"
      ],
      "avatar": "https://gravatar.com/avatar/b6cf57822463143589b36ada06fbf6cb1509223a740fae3160b28f1ce41ccc12?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 18,
        "icon": "file:googleSheets.svg",
        "name": "n8n-nodes-base.googleSheets",
        "codex": {
          "data": {
            "alias": [
              "CSV",
              "Sheet",
              "Spreadsheet",
              "GS"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "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-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/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/",
                  "icon": "⏲",
                  "label": "Creating triggers for n8n workflows using polling"
                },
                {
                  "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/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "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/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                },
                {
                  "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/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-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/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.googlesheets/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Data & Storage",
              "Productivity"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\",\"output\"]",
        "defaults": {
          "name": "Google Sheets"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="
        },
        "displayName": "Google Sheets",
        "typeVersion": 5,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 4,
            "name": "Productivity"
          }
        ]
      },
      {
        "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": 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": 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": 824,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmailTrigger",
        "codex": {
          "data": {
            "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/trigger-nodes/n8n-nodes-base.gmailtrigger/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Gmail Trigger"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          }
        ]
      },
      {
        "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": 1119,
        "icon": "fa:robot",
        "name": "@n8n/n8n-nodes-langchain.agent",
        "codex": {
          "data": {
            "alias": [
              "LangChain",
              "Chat",
              "Conversational",
              "Plan and Execute",
              "ReAct",
              "Tools"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Agents",
                "Root Nodes"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "AI Agent",
          "color": "#404040"
        },
        "iconData": {
          "icon": "robot",
          "type": "icon"
        },
        "displayName": "AI Agent",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1163,
        "icon": "fa:database",
        "name": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.memorybufferwindow/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Memory"
              ],
              "Memory": [
                "For beginners"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Simple Memory"
        },
        "iconData": {
          "icon": "database",
          "type": "icon"
        },
        "displayName": "Simple Memory",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1179,
        "icon": "fa:code",
        "name": "@n8n/n8n-nodes-langchain.outputParserStructured",
        "codex": {
          "data": {
            "alias": [
              "json",
              "zod"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.outputparserstructured/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Output Parsers"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Structured Output Parser"
        },
        "iconData": {
          "icon": "code",
          "type": "icon"
        },
        "displayName": "Structured Output Parser",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1253,
        "icon": "file:azure.svg",
        "name": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatazureopenai/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Language Models",
                "Root Nodes"
              ],
              "Language Models": [
                "Chat Models (Recommended)"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Azure OpenAI Chat Model"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMjQyIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iNTguOTcyJSIgeDI9IjM3LjE5MSUiIHkxPSI3LjQxMSUiIHkyPSIxMDMuNzYyJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzExNEE4QiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzA2NjlCQyIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTkuNzE5JSIgeDI9IjUyLjY5MSUiIHkxPSI1Mi4zMTMlIiB5Mj0iNTQuODY0JSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1vcGFjaXR5PSIuMyIvPjxzdG9wIG9mZnNldD0iNy4xJSIgc3RvcC1vcGFjaXR5PSIuMiIvPjxzdG9wIG9mZnNldD0iMzIuMSUiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjYyLjMlIiBzdG9wLW9wYWNpdHk9Ii4wNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1vcGFjaXR5PSIwIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIzNy4yNzklIiB4Mj0iNjIuNDczJSIgeTE9IjQuNiUiIHkyPSI5OS45NzklIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjM0NDQkY0Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMjg5MkRGIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHBhdGggZmlsbD0idXJsKCNhKSIgZD0iTTg1LjM0My4wMDNoNzUuNzUzTDgyLjQ1NyAyMzNhMTIuMDggMTIuMDggMCAwIDEtMTEuNDQyIDguMjE2SDEyLjA2QTEyLjA2IDEyLjA2IDAgMCAxIC42MzMgMjI1LjMwM0w3My44OTggOC4yMTlBMTIuMDggMTIuMDggMCAwIDEgODUuMzQzIDB6Ii8+PHBhdGggZmlsbD0iIzAwNzhENCIgZD0iTTE5NS40MjMgMTU2LjI4Mkg3NS4yOTdhNS41NiA1LjU2IDAgMCAwLTMuNzk2IDkuNjI3bDc3LjE5IDcyLjA0N2ExMi4xNCAxMi4xNCAwIDAgMCA4LjI4IDMuMjZoNjguMDJ6Ii8+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTg1LjM0My4wMDNhMTEuOTggMTEuOTggMCAwIDAtMTEuNDcxIDguMzc2TC43MjMgMjI1LjEwNWExMi4wNDUgMTIuMDQ1IDAgMCAwIDExLjM3IDE2LjExMmg2MC40NzVhMTIuOTMgMTIuOTMgMCAwIDAgOS45MjEtOC40MzdsMTQuNTg4LTQyLjk5MSA1Mi4xMDUgNDguNmExMi4zMyAxMi4zMyAwIDAgMCA3Ljc1NyAyLjgyOGg2Ny43NjZsLTI5LjcyMS04NC45MzUtODYuNjQzLjAyTDE2MS4zNy4wMDN6Ii8+PHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTE4Mi4wOTggOC4yMDdBMTIuMDYgMTIuMDYgMCAwIDAgMTcwLjY3LjAwM0g4Ni4yNDVjNS4xNzUgMCA5Ljc3MyAzLjMwMSAxMS40MjggOC4yMDRMMTcwLjk0IDIyNS4zYTEyLjA2MiAxMi4wNjIgMCAwIDEtMTEuNDI4IDE1LjkyaDg0LjQyOWExMi4wNjIgMTIuMDYyIDAgMCAwIDExLjQyNS0xNS45MnoiLz48L3N2Zz4="
        },
        "displayName": "Azure OpenAI Chat Model",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 41,
        "name": "Ticket Management"
      },
      {
        "id": 49,
        "name": "AI Summarization"
      }
    ],
    "image": []
  }
}