{
  "workflow": {
    "id": 10821,
    "name": "Analyze Facebook comment sentiment with GPT-4, Slack, Sheets & Outlook reports",
    "views": 176,
    "recentViews": 1,
    "totalViews": 176,
    "createdAt": "2025-11-14T12:08:35.911Z",
    "description": "## 📊 Description\nAutomatically analyze the sentiment of Facebook posts and their audience comments using GPT-4 to identify trends and potential PR risks. 🧠💬\n This workflow fetches recent posts via the Facebook Graph API, performs AI-powered sentiment analysis on both posts and comments, routes negative results to Slack for immediate attention, logs all data into Google Sheets, and sends a beautifully formatted sentiment summary report via Outlook. 📈📧\n\n## What This Template Does\n1️⃣ Trigger – Runs daily at 10 AM to fetch the latest Facebook posts. ⏰\n 2️⃣ Data Extraction – Pulls post text, reactions, and up to 100 comments per post using Facebook Graph API. 📲\n 3️⃣ Formatting – Structures and cleans Facebook data for AI analysis. 🧩\n 4️⃣ AI Sentiment Analysis – GPT-4 evaluates post tone and audience sentiment with confidence scores and explanations. 🤖\n 5️⃣ Routing – Sends negative sentiment alerts directly to Slack for quick response. ⚠️\n 6️⃣ Logging – Records all sentiment metrics in Google Sheets, including positivity ratio and engagement data. 📊\n 7️⃣ Reporting – Generates a color-coded HTML email report and delivers it via Outlook. 💌\n 8️⃣ Error Handling – Sends Slack alerts if any node in the workflow fails. 🛡️\n\n## Key Benefits\n✅ Monitors brand reputation automatically across Facebook comments\n ✅ Provides structured AI sentiment reports for data-driven decisions\n ✅ Flags negative audience sentiment for timely intervention\n ✅ Maintains an always-updated sentiment log in Google Sheets\n ✅ Delivers professional HTML summary emails to teams\n\n## Features\n- Automated daily trigger for post sentiment scanning\n- Facebook Graph API integration for posts and comments\n- GPT-4–powered comment tone and sentiment scoring\n- Slack notifications for negative sentiment alerts\n- Google Sheets sentiment dashboard logging\n- Beautiful HTML report delivery through Microsoft Outlook\n- Built-in error detection with Slack fallback alerts\n\n## Requirements\n- Facebook Graph API credentials with pages_read_engagement access\n- OpenAI API key for GPT-4 or GPT-4o\n- Slack Bot token with chat:write permission\n- Google Sheets OAuth2 credentials with edit rights\n- Microsoft Outlook OAuth2 credentials for email delivery\n\n## Target Audience\n- Social media and marketing teams monitoring brand perception 📣\n- PR teams managing engagement or audience sentiment 🧾\n- Analysts building data dashboards from engagement metrics 📊\n- Agencies offering automated reporting for client pages 🧑‍💼\n\n## Step-by-Step Setup Instructions\n1️⃣ Connect Facebook Graph API credentials and set your page ID.\n 2️⃣ Add OpenAI credentials for GPT-4 sentiment analysis.\n 3️⃣ Configure Slack and provide your channel ID for alerts.\n 4️⃣ Set Google Sheets credentials and specify sheet ID and name.\n 5️⃣ Connect Microsoft Outlook for email report delivery.\n 6️⃣ Adjust the daily schedule (default 10 AM) as needed.\n 7️⃣ Run once manually to verify setup, then enable automation. ✅\n",
    "workflow": {
      "id": "FycdG8VvsWdUUDag",
      "meta": {
        "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
        "templateCredsSetupCompleted": true
      },
      "name": "Monitor and Analyze Facebook Comment Sentiment with GPT-4, Slack, Sheets, and Outlook Reports",
      "tags": [],
      "nodes": [
        {
          "id": "e0f900e3-e48a-4795-9bd7-a5ccb42d3aa6",
          "name": "Main Overview",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1008,
            -1392
          ],
          "parameters": {
            "width": 420,
            "height": 668,
            "content": "## Facebook Sentiment Monitor – Overview\n\nThis workflow automatically tracks new Facebook posts and comments, analyzes audience sentiment using AI, and routes the results to alerts, logs, and daily reports. It helps teams quickly spot negative engagement and maintain a useful record of how audiences respond over time.\n\n### How it works\n1. A daily trigger fetches recent posts and comments.\n2. The data is cleaned and formatted for analysis.\n3. GPT evaluates sentiment for the post and each comment.\n4. Negative sentiment triggers Slack alerts, while all results are logged to Google Sheets.\n5. A daily HTML email report summarizes sentiment trends.\n6. Errors are captured and reported automatically.\n\n### Setup steps\n- Connect Facebook, OpenAI, Slack, Google Sheets, and Outlook credentials.\n- Set your preferred Slack channel.\n- Run a test execution to confirm access.\n\n### Customization\nAdjust trigger timing, sentiment thresholds, or reporting formats as needed.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "d8799315-9170-426d-a89e-f8c1647ed494",
          "name": "Data Collection Group",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1008,
            -688
          ],
          "parameters": {
            "color": 2,
            "width": 392,
            "height": 316,
            "content": "## Data Collection\nFetches recent Facebook posts, reactions, and comments on a daily schedule.  \nGroups all retrieval steps before processing.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "1174ab64-c4ef-43fd-9549-083603267c5a",
          "name": "AI Analysis Group",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -352,
            -656
          ],
          "parameters": {
            "color": 2,
            "width": 464,
            "height": 464,
            "content": "## AI Sentiment Analysis\nEvaluates sentiment for posts and comments using GPT and outputs structured JSON.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "3dc35ae3-4a8c-4557-be24-b69cec7508fe",
          "name": "Routing Logic",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            128,
            -672
          ],
          "parameters": {
            "color": 2,
            "width": 280,
            "height": 312,
            "content": "## Routing Logic\nRoutes negative sentiment to alerts and logs, while positive/neutral flows go to reporting.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "17ca8b08-897f-42cb-bdea-14cc092a04de",
          "name": "Alerts & Reporting",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            416,
            -848
          ],
          "parameters": {
            "color": 2,
            "width": 480,
            "height": 660,
            "content": "## Alerts & Logging\nSends Slack alerts for negative sentiment and updates Google Sheets for tracking trends.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "d8910011-bab9-4cd2-8549-29ec54527fce",
          "name": "Error Handling",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -960,
            144
          ],
          "parameters": {
            "color": 2,
            "width": 616,
            "height": 260,
            "content": "## Error Handling\nCaptures workflow failures and sends details to Slack for quick debugging.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "3ff16e53-59e8-4d1e-ac52-4cd35fb1cdc9",
          "name": "Error Handler Trigger",
          "type": "n8n-nodes-base.errorTrigger",
          "position": [
            -784,
            256
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "e872c20b-75f7-412e-8c8e-3b38d1860eb7",
          "name": "Slack: Send Error Alert",
          "type": "n8n-nodes-base.slack",
          "position": [
            -576,
            256
          ],
          "webhookId": "d5eff2c3-ff6e-4116-bdda-59455acd861b",
          "parameters": {
            "text": "=⚠️ *Error in API Error Catalog Workflow*\n*Node:* {{ $json.node.name }}\n*Message:* {{ $json.error.message }}\n*Time:* {{ $json.timestamp }}",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "id",
              "value": "C08358MKDCU"
            },
            "otherOptions": {}
          },
          "typeVersion": 2.3
        },
        {
          "id": "53d2eab6-4686-4608-a0c3-17ab64a2f981",
          "name": "Fetch Recent Facebook Posts",
          "type": "n8n-nodes-base.facebookGraphApi",
          "position": [
            -752,
            -544
          ],
          "parameters": {
            "edge": "posts",
            "options": {
              "fields": {
                "field": [
                  {
                    "name": "id,message,story,created_time,permalink_url,full_picture,attachments{media_type,media,url,description},shares,likes.limit(100).summary(true){id,name},comments.limit(100).summary(true){id,from,message,created_time,like_count,comment_count,reactions.summary(true)},reactions.limit(100).summary(true){type,id,name},from{id,name,category}"
                  }
                ]
              }
            },
            "graphApiVersion": "v23.0"
          },
          "typeVersion": 1
        },
        {
          "id": "253741a6-d741-410f-8fa9-c93b1bc3588d",
          "name": "💬 Agent - Sentiment & Tone Evaluator",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            -224,
            -544
          ],
          "parameters": {
            "text": "=Analyze the following Facebook post and its audience comments.\n\nPost ID: {{$json.postId}}\nPost Message: \"{{$json.message}}\"\nComments: {{JSON.stringify($json.comments)}}\n\nReturn the result strictly in JSON format:\n\n{\n  \"postId\": string,\n  \"postMessage\": string,\n  \"postSentiment\": {\n    \"score\": number,\n    \"label\": string,\n    \"explanation\": string\n  },\n  \"comments\": [\n    {\n      \"commentId\": string,\n      \"commentMessage\": string,\n      \"score\": number,\n      \"label\": string,\n      \"explanation\": string\n    }\n  ],\n  \"overallCommentSentiment\": {\n    \"score\": number,\n    \"label\": string,\n    \"explanation\": string\n  }\n}\n",
            "options": {
              "systemMessage": "=You are an AI sentiment analysis model specialized in analyzing Facebook posts and their audience comments.\n\nYour task:\n1. Analyze the emotional tone of the main post message.\n2. Analyze each comment individually.\n3. Compute the overall comment sentiment score that represents the collective audience reaction.\n\nOutput Rules:\n- Return strictly valid JSON.\n- Include these top-level fields:\n  - postId (string)\n  - postMessage (string)\n  - postSentiment (object with score, label, explanation)\n  - comments (array of objects with commentId, commentMessage, score, label, explanation)\n  - overallCommentSentiment (object with score, label, explanation)\n- \"score\" must be a number between -1.0 (very negative) and +1.0 (very positive).\n- \"label\" must be one of: \"Negative\", \"Neutral\", or \"Positive\".\n- \"explanation\" must briefly describe why that sentiment was assigned.\n\nRules for aggregation:\n- Calculate overallCommentSentiment.score as the average of all comment scores.\n- Determine overallCommentSentiment.label based on this logic:\n  - score < -0.3 → \"Negative\"\n  - -0.3 ≤ score ≤ 0.3 → \"Neutral\"\n  - score > 0.3 → \"Positive\"\n- Always include a short explanation for the overall sentiment.\n- Do not include any extra commentary or text outside of valid JSON.\n"
            },
            "promptType": "define",
            "hasOutputParser": true
          },
          "typeVersion": 2.1
        },
        {
          "id": "f489eeba-46f0-47ee-8bee-365d6c51b52e",
          "name": "Route Based on Sentiment Score",
          "type": "n8n-nodes-base.switch",
          "position": [
            208,
            -544
          ],
          "parameters": {
            "rules": {
              "values": [
                {
                  "conditions": {
                    "options": {
                      "version": 2,
                      "leftValue": "",
                      "caseSensitive": true,
                      "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                      {
                        "id": "7ee8a25a-3c77-4674-8fc3-bb2ceb798661",
                        "operator": {
                          "type": "number",
                          "operation": "lt"
                        },
                        "leftValue": "={{ $json.output.overallCommentSentiment.score }}",
                        "rightValue": -0.4
                      }
                    ]
                  }
                },
                {
                  "conditions": {
                    "options": {
                      "version": 2,
                      "leftValue": "",
                      "caseSensitive": true,
                      "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                      {
                        "id": "ea4a9e85-6731-4c0a-8cc1-c4c6205611be",
                        "operator": {
                          "type": "number",
                          "operation": "gt"
                        },
                        "leftValue": "={{ $json.output.overallCommentSentiment.score }}",
                        "rightValue": 0
                      }
                    ]
                  }
                }
              ]
            },
            "options": {}
          },
          "typeVersion": 3.3
        },
        {
          "id": "4c816578-1372-4441-86ee-e6bfb3ba4cb7",
          "name": "Slack Alert - Negative Sentiment",
          "type": "n8n-nodes-base.slack",
          "position": [
            704,
            -768
          ],
          "webhookId": "819acfce-80d8-4026-a65e-335ffdbbcc5e",
          "parameters": {
            "text": "=🚨 *Negative Sentiment Alert*\n\n📝 *Post Message:*\n{{ $json.output.postMessage }}\n\n🔗 *Post ID:* `{{ $json.output.postId }}`\n\n😊 *Post Sentiment:* {{ $json.output.postSentiment.label }} (Score: {{ $json.output.postSentiment.score }})\n_{{ $json.output.postSentiment.explanation }}_\n\n⚠️ *Overall Comment Sentiment:* {{ $json.output.overallCommentSentiment.label }} (Score: {{ $json.output.overallCommentSentiment.score }})\n_{{ $json.output.overallCommentSentiment.explanation }}_\n\n💬 *Comments ({{ $json.output.comments.length }}):*\n\n{{ $json.output.comments.map((comment, index) => {\n  const emoji = comment.label === 'Positive' ? '✅' : comment.label === 'Negative' ? '❌' : '➖';\n  return `${emoji} *Comment ${index + 1}:*\n\"${comment.commentMessage}\"\n• Sentiment: ${comment.label} (Score: ${comment.score})\n• Reason: _${comment.explanation}_\n• Comment ID: \\`${comment.commentId}\\`\n`;\n}).join('\\n') }}\n\n🎯 *Recommended Actions:*\n• Review and respond to negative comments\n• Consider adjusting content strategy\n• Monitor engagement trends",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "id",
              "value": "C08358MKDCU"
            },
            "otherOptions": {},
            "authentication": "oAuth2"
          },
          "credentials": {
            "slackOAuth2Api": {
              "id": "credential-id",
              "name": "slackOAuth2Api Credential"
            }
          },
          "typeVersion": 2.3
        },
        {
          "id": "3c2d3443-cb45-48bd-b16f-c8ac444c8e51",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -608,
            -656
          ],
          "parameters": {
            "color": 2,
            "height": 272,
            "content": "## Data Formatting\nNormalizes Facebook API data into a consistent structure for downstream AI analysis.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "0cc0d69f-6365-45ac-a3c6-8a2b4ca81e97",
          "name": "LLM - OpenAI GPT-4 Model",
          "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
          "position": [
            -272,
            -320
          ],
          "parameters": {
            "model": {
              "__rl": true,
              "mode": "id",
              "value": "gpt-4o"
            },
            "options": {
              "temperature": 0.4
            }
          },
          "credentials": {
            "openAiApi": {
              "id": "credential-id",
              "name": "openAiApi Credential"
            }
          },
          "typeVersion": 1.2
        },
        {
          "id": "e9612735-bc0c-4c97-866c-2f009c67e996",
          "name": "Memory Buffer - Session Context",
          "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
          "position": [
            -144,
            -320
          ],
          "parameters": {
            "sessionKey": "=\"Candidate Screening\"",
            "sessionIdType": "customKey"
          },
          "typeVersion": 1.3
        },
        {
          "id": "eef0d55e-1adf-454e-a319-4ac721c0feb2",
          "name": "Structured JSON Parser",
          "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
          "position": [
            -16,
            -320
          ],
          "parameters": {
            "jsonSchemaExample": "{\n  \"postId\": \"230476031170639_1153939926828947\",\n  \"postMessage\": \"Our team just launched something amazing 🚀\",\n  \"postSentiment\": {\n    \"score\": 0.94,\n    \"label\": \"Positive\",\n    \"explanation\": \"The post conveys excitement and enthusiasm through upbeat language and emoji.\"\n  },\n  \"comments\": [\n    {\n      \"commentId\": \"1153939926828947_12+1234567890\",\n      \"commentMessage\": \"This post is amazing.\",\n      \"score\": 0.88,\n      \"label\": \"Positive\",\n      \"explanation\": \"The comment expresses strong admiration and positivity.\"\n    },\n    {\n      \"commentId\": \"1153939926828947_904835525302859\",\n      \"commentMessage\": \"amazing view of river and mountain.\",\n      \"score\": 0.76,\n      \"label\": \"Positive\",\n      \"explanation\": \"The comment praises the photo using positive adjectives.\"\n    }\n  ],\n  \"overallCommentSentiment\": {\n    \"score\": 0.82,\n    \"label\": \"Positive\",\n    \"explanation\": \"Most comments show enthusiasm and admiration toward the post.\"\n  }\n}\n"
          },
          "typeVersion": 1.3
        },
        {
          "id": "9f4f35ae-ba39-48cc-9303-0b7b996a23ae",
          "name": "Format Facebook Data (Code Node)",
          "type": "n8n-nodes-base.code",
          "position": [
            -496,
            -544
          ],
          "parameters": {
            "jsCode": "// n8n Code Node - Facebook Posts Data Formatter with Comments\n// Access the input items correctly in n8n\n\nconst items = $input.all();\nconst formattedPosts = [];\n\n// Loop through each input item\nfor (const item of items) {\n  // Access the data array - handle both wrapped and unwrapped formats\n  let postsData = [];\n  \n  if (Array.isArray(item.json)) {\n    // If json is an array, get the first element's data\n    postsData = item.json[0]?.data || [];\n  } else if (item.json.data) {\n    // If json has a data property directly\n    postsData = item.json.data;\n  } else if (Array.isArray(item.json)) {\n    // If json itself is the data array\n    postsData = item.json;\n  }\n  \n  // Process each post\n  for (const post of postsData) {\n    // Format comments data\n    const commentsData = (post.comments?.data || []).map(comment => ({\n      commentId: comment.id || '',\n      commentMessage: comment.message || '',\n      commentCreatedTime: comment.created_time || '',\n      commentLikeCount: comment.like_count || 0,\n      commentCount: comment.comment_count || 0,\n      commentor: {\n        id: comment.from?.id || '',\n        name: comment.from?.name || ''\n      },\n      commentReactions: {\n        count: comment.reactions?.summary?.total_count || 0,\n        viewerReaction: comment.reactions?.summary?.viewer_reaction || 'NONE'\n      }\n    }));\n    \n    const formattedPost = {\n      // Basic Post Information\n      postId: post.id || '',\n      message: post.message || '',\n      createdTime: post.created_time || '',\n      permalinkUrl: post.permalink_url || '',\n      \n      // Page Information\n      pageInfo: {\n        pageId: post.from?.id || '',\n        pageName: post.from?.name || '',\n        pageCategory: post.from?.category || ''\n      },\n      \n      // Media Information\n      media: {\n        hasMedia: (post.attachments?.data?.length || 0) > 0,\n        fullPictureUrl: post.full_picture || '',\n        attachments: (post.attachments?.data || []).map(att => ({\n          mediaType: att.media_type || '',\n          url: att.url || '',\n          description: att.description || '',\n          imageUrl: att.media?.image?.src || '',\n          imageWidth: att.media?.image?.width || 0,\n          imageHeight: att.media?.image?.height || 0\n        }))\n      },\n      \n      // Engagement Metrics\n      engagement: {\n        likes: {\n          count: post.likes?.summary?.total_count || 0,\n          canLike: post.likes?.summary?.can_like || false,\n          hasLiked: post.likes?.summary?.has_liked || false\n        },\n        comments: {\n          count: post.comments?.summary?.total_count || 0,\n          canComment: post.comments?.summary?.can_comment || false\n        },\n        reactions: {\n          count: post.reactions?.summary?.total_count || 0,\n          viewerReaction: post.reactions?.summary?.viewer_reaction || 'NONE'\n        }\n      },\n      \n      // Comments Array - DETAILED COMMENT DATA\n      comments: commentsData,\n      \n      // Metadata\n      metadata: {\n        hasComments: (post.comments?.summary?.total_count || 0) > 0,\n        hasLikes: (post.likes?.summary?.total_count || 0) > 0,\n        hasReactions: (post.reactions?.summary?.total_count || 0) > 0,\n        totalEngagement: (post.likes?.summary?.total_count || 0) + \n                        (post.comments?.summary?.total_count || 0) + \n                        (post.reactions?.summary?.total_count || 0),\n        totalComments: commentsData.length\n      }\n    };\n    \n    formattedPosts.push(formattedPost);\n  }\n}\n\n// Return the formatted posts in n8n format\nreturn formattedPosts.map(post => ({ json: post }));"
          },
          "typeVersion": 2
        },
        {
          "id": "76ab3da1-46ca-4d90-833d-a6c1faabcf7d",
          "name": "Trigger - Daily Sentiment Analysis",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            -992,
            -544
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "triggerAtHour": 10
                }
              ]
            }
          },
          "typeVersion": 1.2
        },
        {
          "id": "37e98fd9-1a99-4c03-84e4-0ba922727c86",
          "name": "Format HTML Email Report (Code Node)",
          "type": "n8n-nodes-base.code",
          "position": [
            432,
            -352
          ],
          "parameters": {
            "jsCode": "// n8n Code Node - Format Sentiment Analysis Data for Email\n\nconst data = $input.all();\n\n// Helper function to get sentiment color\nfunction getSentimentColor(label) {\n  const colors = {\n    'Positive': '#10b981',\n    'Negative': '#ef4444',\n    'Neutral': '#6b7280'\n  };\n  return colors[label] || '#6b7280';\n}\n\n// Helper function to get emoji for sentiment\nfunction getSentimentEmoji(label) {\n  const emojis = {\n    'Positive': '😊',\n    'Negative': '😞',\n    'Neutral': '😐'\n  };\n  return emojis[label] || '😐';\n}\n\n// Process each item\nconst emailData = data.map(item => {\n  const output = item.json.output;\n  \n  // Build HTML for comments\n  let commentsHtml = '';\n  if (output.comments && output.comments.length > 0) {\n    commentsHtml = output.comments.map(comment => `\n      <div style=\"background-color: #f9fafb; border-left: 4px solid ${getSentimentColor(comment.label)}; padding: 15px; margin: 10px 0; border-radius: 5px;\">\n        <p style=\"margin: 0 0 10px 0; color: #374151; font-size: 14px;\">${comment.commentMessage}</p>\n        <div style=\"display: flex; align-items: center; gap: 10px;\">\n          <span style=\"background-color: ${getSentimentColor(comment.label)}; color: white; padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 600;\">\n            ${getSentimentEmoji(comment.label)} ${comment.label}\n          </span>\n          <span style=\"color: #6b7280; font-size: 12px;\">Score: ${(comment.score * 100).toFixed(0)}%</span>\n        </div>\n        <p style=\"margin: 10px 0 0 0; color: #6b7280; font-size: 12px; font-style: italic;\">${comment.explanation}</p>\n      </div>\n    `).join('');\n  } else {\n    commentsHtml = '<p style=\"color: #6b7280; font-style: italic;\">No comments yet.</p>';\n  }\n  \n  // Build complete HTML email\n  const htmlBody = `\n    <!DOCTYPE html>\n    <html>\n    <head>\n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    </head>\n    <body style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #1f2937; background-color: #f3f4f6; margin: 0; padding: 20px;\">\n      <div style=\"max-width: 650px; margin: 0 auto; background-color: white; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); overflow: hidden;\">\n        \n        <div style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 30px; text-align: center;\">\n          <h1 style=\"color: white; margin: 0; font-size: 24px;\">📊 Social Media Sentiment Report</h1>\n        </div>\n        \n        <div style=\"padding: 30px;\">\n          \n          <div style=\"margin-bottom: 30px;\">\n            <h2 style=\"color: #1f2937; font-size: 20px; margin: 0 0 15px 0; border-bottom: 2px solid #e5e7eb; padding-bottom: 10px;\">\n              📝 Post Analysis\n            </h2>\n            \n            <div style=\"background-color: #f9fafb; padding: 20px; border-radius: 8px; border: 1px solid #e5e7eb;\">\n              <p style=\"margin: 0 0 15px 0; font-size: 16px; color: #374151; font-weight: 500;\">${output.postMessage}</p>\n              \n              <div style=\"display: flex; align-items: center; gap: 15px; flex-wrap: wrap;\">\n                <span style=\"background-color: ${getSentimentColor(output.postSentiment.label)}; color: white; padding: 6px 16px; border-radius: 20px; font-size: 14px; font-weight: 600;\">\n                  ${getSentimentEmoji(output.postSentiment.label)} ${output.postSentiment.label}\n                </span>\n                <span style=\"color: #6b7280; font-size: 14px;\">\n                  <strong>Confidence:</strong> ${(output.postSentiment.score * 100).toFixed(0)}%\n                </span>\n              </div>\n              \n              <p style=\"margin: 15px 0 0 0; color: #6b7280; font-size: 13px; font-style: italic; border-top: 1px solid #e5e7eb; padding-top: 15px;\">\n                ${output.postSentiment.explanation}\n              </p>\n            </div>\n            \n            <p style=\"margin: 10px 0 0 0; color: #9ca3af; font-size: 12px;\">\n              <strong>Post ID:</strong> ${output.postId}\n            </p>\n          </div>\n          \n          <div style=\"margin-bottom: 30px;\">\n            <h2 style=\"color: #1f2937; font-size: 20px; margin: 0 0 15px 0; border-bottom: 2px solid #e5e7eb; padding-bottom: 10px;\">\n              💬 Comments (${output.comments ? output.comments.length : 0})\n            </h2>\n            ${commentsHtml}\n          </div>\n          \n          <div style=\"background: linear-gradient(135deg, #667eea15 0%, #764ba215 100%); padding: 20px; border-radius: 8px; border: 2px solid ${getSentimentColor(output.overallCommentSentiment.label)};\">\n            <h3 style=\"color: #1f2937; font-size: 18px; margin: 0 0 15px 0;\">\n              📈 Overall Comment Sentiment\n            </h3>\n            \n            <div style=\"display: flex; align-items: center; gap: 15px; margin-bottom: 15px; flex-wrap: wrap;\">\n              <span style=\"background-color: ${getSentimentColor(output.overallCommentSentiment.label)}; color: white; padding: 8px 20px; border-radius: 20px; font-size: 16px; font-weight: 600;\">\n                ${getSentimentEmoji(output.overallCommentSentiment.label)} ${output.overallCommentSentiment.label}\n              </span>\n              <span style=\"color: #374151; font-size: 16px; font-weight: 500;\">\n                Score: ${(output.overallCommentSentiment.score * 100).toFixed(0)}%\n              </span>\n            </div>\n            \n            <p style=\"margin: 0; color: #4b5563; font-size: 14px;\">\n              ${output.overallCommentSentiment.explanation}\n            </p>\n          </div>\n          \n        </div>\n        \n        <div style=\"background-color: #f9fafb; padding: 20px; text-align: center; border-top: 1px solid #e5e7eb;\">\n          <p style=\"margin: 0; color: #6b7280; font-size: 12px;\">\n            Generated by n8n Sentiment Analysis Workflow | ${new Date().toLocaleString()}\n          </p>\n        </div>\n        \n      </div>\n    </body>\n    </html>\n  `;\n  \n  // Generate subject line\n  const subject = 'Sentiment Report: ' + output.postSentiment.label + ' Post with ' + (output.comments ? output.comments.length : 0) + ' Comments';\n  \n  return {\n    json: {\n      subject: subject,\n      htmlBody: htmlBody,\n      postId: output.postId,\n      postSentiment: output.postSentiment.label,\n      commentCount: output.comments ? output.comments.length : 0,\n      overallSentiment: output.overallCommentSentiment.label\n    }\n  };\n});\n\nreturn emailData;"
          },
          "typeVersion": 2
        },
        {
          "id": "ab4f20d4-c34b-4529-bb98-f11b6554524a",
          "name": "Prepare Data for Google Sheets",
          "type": "n8n-nodes-base.code",
          "position": [
            432,
            -544
          ],
          "parameters": {
            "jsCode": "// n8n Code Node - Format Sentiment Data for Google Sheets\n// This flattens the nested sentiment data into sheet-friendly rows\n\nconst items = $input.all();\nconst sheetRows = [];\n\nfor (const item of items) {\n  const data = item.json.output || item.json;\n  \n  // Create main post row\n  const postRow = {\n    // Post Information\n    postId: data.postId || '',\n    postMessage: data.postMessage || '',\n    \n    // Post Sentiment\n    postSentimentScore: data.postSentiment?.score || 0,\n    postSentimentLabel: data.postSentiment?.label || '',\n    postSentimentExplanation: data.postSentiment?.explanation || '',\n    \n    // Overall Comment Sentiment\n    overallCommentScore: data.overallCommentSentiment?.score || 0,\n    overallCommentLabel: data.overallCommentSentiment?.label || '',\n    overallCommentExplanation: data.overallCommentSentiment?.explanation || '',\n    \n    // Comment Counts\n    totalComments: data.comments?.length || 0,\n    positiveComments: data.comments?.filter(c => c.label === 'Positive').length || 0,\n    negativeComments: data.comments?.filter(c => c.label === 'Negative').length || 0,\n    neutralComments: data.comments?.filter(c => c.label === 'Neutral').length || 0,\n    \n    // Timestamp\n    analyzedAt: new Date().toISOString(),\n    \n    // Alert Flag\n    needsAttention: data.overallCommentSentiment?.label === 'Negative' || \n                    data.overallCommentSentiment?.score < -0.3,\n    \n    // Comments Details (JSON string for reference)\n    commentsJson: JSON.stringify(data.comments || [])\n  };\n  \n  sheetRows.push(postRow);\n}\n\n// Return formatted data for Google Sheets\nreturn sheetRows.map(row => ({ json: row }));"
          },
          "typeVersion": 2
        },
        {
          "id": "31a51d00-433e-400a-b4cd-3972461093bc",
          "name": "Update Google Sheet - Sentiment Log",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            656,
            -544
          ],
          "parameters": {
            "columns": {
              "value": {},
              "mappingMode": "defineBelow"
            },
            "options": {},
            "operation": "appendOrUpdate",
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": "gid=0",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pCLHkzcZy42HCL9mAh8bOBQ6wN5PcxnfEXeR6rPUKVg/edit?gid=0",
              "cachedResultName": "Sheet1"
            },
            "documentId": {
              "__rl": true,
              "mode": "url",
              "value": "1pCLHkzcZy42HCL9mAh8bOBQ6wN5PcxnfEXeR6rPUKVg",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pCLHkzcZy42HCL9mAh8bOBQ6wN5PcxnfEXeR6rPUKVg/edit?gid=0"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "credential-id",
              "name": "googleSheetsOAuth2Api Credential"
            }
          },
          "typeVersion": 4.7
        },
        {
          "id": "db65a4a0-c870-4f2a-bcd8-688d2e1e0cb2",
          "name": "Send Sentiment Report (Outlook)",
          "type": "n8n-nodes-base.microsoftOutlook",
          "position": [
            656,
            -352
          ],
          "webhookId": "ab5ae3e5-02fc-443c-bf4d-50ab36a96be9",
          "parameters": {
            "subject": "={{ $json.subject }}",
            "bodyContent": "={{ $json.htmlBody }}",
            "additionalFields": {
              "importance": "High",
              "bodyContentType": "html"
            }
          },
          "credentials": {
            "microsoftOutlookOAuth2Api": {
              "id": "credential-id",
              "name": "microsoftOutlookOAuth2Api Credential"
            }
          },
          "typeVersion": 2
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "160ea59e-1849-484d-9696-dd0c9a479352",
      "connections": {
        "Error Handler Trigger": {
          "main": [
            [
              {
                "node": "Slack: Send Error Alert",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Structured JSON Parser": {
          "ai_outputParser": [
            [
              {
                "node": "💬 Agent - Sentiment & Tone Evaluator",
                "type": "ai_outputParser",
                "index": 0
              }
            ]
          ]
        },
        "LLM - OpenAI GPT-4 Model": {
          "ai_languageModel": [
            [
              {
                "node": "💬 Agent - Sentiment & Tone Evaluator",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Recent Facebook Posts": {
          "main": [
            [
              {
                "node": "Format Facebook Data (Code Node)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Prepare Data for Google Sheets": {
          "main": [
            [
              {
                "node": "Update Google Sheet - Sentiment Log",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Route Based on Sentiment Score": {
          "main": [
            [
              {
                "node": "Slack Alert - Negative Sentiment",
                "type": "main",
                "index": 0
              },
              {
                "node": "Prepare Data for Google Sheets",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Format HTML Email Report (Code Node)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Memory Buffer - Session Context": {
          "ai_memory": [
            [
              {
                "node": "💬 Agent - Sentiment & Tone Evaluator",
                "type": "ai_memory",
                "index": 0
              }
            ]
          ]
        },
        "Format Facebook Data (Code Node)": {
          "main": [
            [
              {
                "node": "💬 Agent - Sentiment & Tone Evaluator",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Trigger - Daily Sentiment Analysis": {
          "main": [
            [
              {
                "node": "Fetch Recent Facebook Posts",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format HTML Email Report (Code Node)": {
          "main": [
            [
              {
                "node": "Send Sentiment Report (Outlook)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "💬 Agent - Sentiment & Tone Evaluator": {
          "main": [
            [
              {
                "node": "Route Based on Sentiment Score",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 22,
      "nodeTypes": {
        "n8n-nodes-base.code": {
          "count": 3
        },
        "n8n-nodes-base.slack": {
          "count": 2
        },
        "n8n-nodes-base.switch": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 7
        },
        "n8n-nodes-base.errorTrigger": {
          "count": 1
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.agent": {
          "count": 1
        },
        "n8n-nodes-base.scheduleTrigger": {
          "count": 1
        },
        "n8n-nodes-base.facebookGraphApi": {
          "count": 1
        },
        "n8n-nodes-base.microsoftOutlook": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.lmChatOpenAi": {
          "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": 12,
        "icon": "fa:bug",
        "name": "n8n-nodes-base.errorTrigger",
        "codex": {
          "data": {
            "details": "In n8n, when a workflow execution fails, it can start another workflow. This second workflow can be any arbitrary workflow on your n8n instance. Use the Error Trigger node as your Trigger in the Error workflow.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/creating-error-workflows-in-n8n/",
                  "icon": "🌪",
                  "label": "Creating Error Workflows in n8n"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Other Trigger Nodes"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Error Trigger",
          "color": "#0000FF"
        },
        "iconData": {
          "icon": "bug",
          "type": "icon"
        },
        "displayName": "Error Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core 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": 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": 112,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.switch",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "If",
              "Path",
              "Filter",
              "Condition",
              "Logic",
              "Branch",
              "Case"
            ],
            "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/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/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/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Switch",
          "color": "#506000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "Switch",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 314,
        "icon": "file:facebook.svg",
        "name": "n8n-nodes-base.facebookGraphApi",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.facebookgraphapi/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/facebookgraph/"
                }
              ]
            },
            "categories": [
              "Development"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Facebook Graph API"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MCA2MCI+PHBhdGggZmlsbD0iIzE4NzdmMiIgZD0iTTU5LjUgMzBDNTkuNSAxMy43MSA0Ni4yOS41IDMwIC41Uy41IDEzLjcxLjUgMzBjMCAxNC43MiAxMC43OSAyNi45MyAyNC44OSAyOS4xNFYzOC41M0gxNy45VjMwaDcuNDl2LTYuNWMwLTcuMzkgNC40LTExLjQ4IDExLjE0LTExLjQ4IDMuMjMgMCA2LjYuNTggNi42LjU4djcuMjZoLTMuNzJjLTMuNjYgMC00LjgxIDIuMjctNC44MSA0LjYxVjMwaDguMThsLTEuMzEgOC41M0gzNC42djIwLjYxQzQ4LjcxIDU2LjkzIDU5LjUgNDQuNzIgNTkuNSAzMCIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik00MS40OCAzOC41MyA0Mi43OSAzMGgtOC4xOHYtNS41M2MwLTIuMzMgMS4xNC00LjYxIDQuODEtNC42MWgzLjcyVjEyLjZzLTMuMzgtLjU4LTYuNi0uNThjLTYuNzQgMC0xMS4xNCA0LjA4LTExLjE0IDExLjQ4VjMwaC03LjV2OC41M2g3LjQ5djIwLjYxYzEuNS4yNCAzLjA0LjM2IDQuNjEuMzZzMy4xMS0uMTIgNC42MS0uMzZWMzguNTN6Ii8+PC9zdmc+"
        },
        "displayName": "Facebook Graph API",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          }
        ]
      },
      {
        "id": 433,
        "icon": "file:outlook.svg",
        "name": "n8n-nodes-base.microsoftOutlook",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.microsoftoutlook/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/microsoft/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Microsoft Outlook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgODEiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48cGF0aCBmaWxsPSIjMjM3MmJhIiBzdHJva2U9Im5vbmUiIGQ9Ik03Ny45IDE5LjJINDYuODZWMEwwIDguMjMyVjcxLjk4TDQ2Ljg2IDgwVjYxLjg0N0g3Ny45YzEuMjY2IDAgMi4xLTEuMDU1IDIuMS0yLjFWMjEuMzJjMC0xLjI2Ni0uODQ0LTIuMS0yLjEtMi4xek0yMS45NTIgNTQuNDZjLTE1LjQtMS4wNTUtMTQuNzc2LTI5LjEzLjQyMi0yOS45NzQgMTYuNjc1LS44NDQgMTYuMjUzIDMxLjAzLS40MjIgMjkuOTc0bTU1LjUxNSA0LjY0NEg0Ni44NlYzNS4wNGw5LjUgOS4wNzdjLjQyMi40MjIuODQ0LjYzMyAxLjQ3Ny42MzNzMS4wNTUtLjIgMS40NzgtLjYzM0w3Ny40NjcgMjcuMjN6bTAtMzUuNDYyLTE5LjYzIDE4LjE1M0w0Ni44NiAzMS40NXYtOS43aDMwLjM5NnYxLjloLjJ6bS01NS4wOTIgNi41NDNjLTguMjMyLjQyMi04LjQ0MyAxOC4zNjQtLjIgMTguNTc1IDguNjU0LjQyMiA4LjY1NC0xOC45OTcuMi0xOC41NzUiLz48L3N5bWJvbD48L3N2Zz4="
        },
        "displayName": "Microsoft Outlook",
        "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": 839,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.scheduleTrigger",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Schedule Trigger",
          "color": "#31C49F"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Schedule Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "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": 1153,
        "icon": "file:openAiLight.svg",
        "name": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenai/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Language Models",
                "Root Nodes"
              ],
              "Language Models": [
                "Chat Models (Recommended)"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "OpenAI Chat Model"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg0IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NyAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MiA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSIjN0Q3RDg3Ii8+Cjwvc3ZnPgo="
        },
        "displayName": "OpenAI Chat Model",
        "typeVersion": 1,
        "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"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 32,
        "name": "Market Research"
      },
      {
        "id": 49,
        "name": "AI Summarization"
      }
    ],
    "image": []
  }
}