{
  "name": "Email Organizer",
  "nodes": [
    {
      "parameters": {},
      "id": "e4d19d2b-5a89-42d6-b77d-a83eb60614a8",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        15936,
        -336
      ]
    },
    {
      "parameters": {
        "resource": "label"
      },
      "id": "5b9b1676-cae7-49ea-84a5-61acad2d16fc",
      "name": "Get All Labels",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        16176,
        -336
      ],
      "webhookId": "cc0599c5-bf45-44dd-8ed7-ed9f1c2078c3",
      "credentials": {
        "gmailOAuth2": {
          "id": "gO8EWg5jZuSVkFxz",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const allItems = $input.all();\nconst userLabels = allItems.filter(i => i.json.type === 'user').map(i => '  [' + i.json.id + '] ' + i.json.name);\nconst sysLabels = allItems.filter(i => i.json.type === 'system').map(i => '  ' + i.json.name);\nconst lines = ['\\uD83D\\uDCCB *Gmail Label Audit*', '']\n  .concat(['*User Labels (' + userLabels.length + '):*'])\n  .concat(userLabels)\n  .concat(['', '*System Labels (' + sysLabels.length + '):*'])\n  .concat(sysLabels)\n  .concat(['', '_Total: ' + allItems.length + ' labels_']);\nreturn { message: lines.join('\\n') };"
      },
      "id": "b60070e2-771a-479e-9cf6-86d782223265",
      "name": "Format Label List",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        16400,
        -336
      ]
    },
    {
      "parameters": {
        "chatId": "-1003769081383",
        "text": "={{ $json.message }}",
        "additionalFields": {}
      },
      "id": "cff2daf9-3419-4c43-ae1d-5b945ccb51a0",
      "name": "Send Label Audit",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        16656,
        -336
      ],
      "webhookId": "0f64b320-dabc-4b40-adad-842d8521bb9a",
      "credentials": {
        "telegramApi": {
          "id": "bnyBxist2KsEGbou",
          "name": "Gmail Organizer"
        }
      }
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "id": "65dc3e90-6714-4356-af7f-bf8a823cc1f5",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.1,
      "position": [
        15920,
        -128
      ]
    },
    {
      "parameters": {
        "resource": "label"
      },
      "id": "7e9a23e0-03e0-42e3-9677-a3a42ea65c34",
      "name": "Get Gmail Labels",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        16160,
        -128
      ],
      "webhookId": "2118cf8c-eb52-475c-b75d-4fc352646e7f",
      "credentials": {
        "gmailOAuth2": {
          "id": "gO8EWg5jZuSVkFxz",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {
        "operation": "getAll",
        "limit": 10,
        "filters": {
          "q": "in:inbox has:nouserlabels"
        }
      },
      "id": "b8f3f5f1-daf5-4803-b00f-695af18d24f5",
      "name": "Get Unlabeled Emails",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        16400,
        -128
      ],
      "webhookId": "2ef87838-bd8a-44c7-988b-be809fb0d5fe",
      "credentials": {
        "gmailOAuth2": {
          "id": "gO8EWg5jZuSVkFxz",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const labels = $('Get Gmail Labels').all();\nconst email = $input.item.json;\n\nconst subject = email.subject || email.Subject || '';\nconst from = email.from || email.From || '';\nconst to = email.to || email.To || '';\nconst snippet = email.snippet || '';\n\n// Base64 decoder for Gmail API body content\nfunction decodeBase64(str) {\n  try {\n    return Buffer.from(str, 'base64').toString('utf-8');\n  } catch {\n    return str;\n  }\n}\n\n// Prefer full plain-text body; fall back to HTML-stripped text, then snippet\nlet rawBody = '';\nif (email.text) rawBody = email.text;\nelse if (email.body?.text) rawBody = email.body.text;\nelse if (email.payload?.body?.data) rawBody = decodeBase64(email.payload.body.data);\nelse if (email.payload?.parts) {\n  // Handle multipart emails - find text/plain part\n  const textPart = email.payload.parts.find(p => p.mimeType === 'text/plain' && p.body?.data);\n  if (textPart) rawBody = decodeBase64(textPart.body.data);\n  else {\n    // Try HTML part as fallback\n    const htmlPart = email.payload.parts.find(p => p.mimeType === 'text/html' && p.body?.data);\n    if (htmlPart) rawBody = decodeBase64(htmlPart.body.data).replace(/<[^>]+>/g, ' ');\n  }\n}\nconst htmlBody = email.html || email.body?.html || '';\nconst strippedHtml = htmlBody.replace(/<[^>]+>/g, ' ').replace(/\\s{2,}/g, ' ').trim();\nconst bodyText = (rawBody || strippedHtml || snippet).substring(0, 2000);\n\nconst existingLabels = labels.filter(l => l.json.type === 'user').map(l => ({ id: l.json.id, name: l.json.name }));\nconst existingLabelsList = existingLabels.map(l => l.name).join(', ');\n\n// Fixed professional taxonomy — AI must pick exactly one of these\nconst taxonomy = [\n  'Finance',\n  'Bills',\n  'Banking',\n  'Receipts',\n  'Orders',\n  'Work',\n  'Recruitment',\n  'Legal',\n  'Security',\n  'Newsletters',\n  'Notifications',\n  'Travel',\n  'Health',\n  'Social',\n  'AI',\n  'Dev',\n  'Support',\n  'Personal',\n  'Promotions'\n];\n\nconst categoryDescriptions = [\n  'Finance — investment, stocks, crypto, trading, portfolio, dividends',\n  'Bills — utility bills, subscriptions, recurring charges, due payments',\n  'Banking — bank statements, account activity, wire transfers, card alerts',\n  'Receipts — purchase confirmations, payment receipts, invoices',\n  'Orders — order placed/shipped/delivered, tracking, e-commerce',\n  'Work — colleagues, meetings, projects, business tasks, office topics',\n  'Recruitment — job offers, interviews, applications, LinkedIn recruiter messages',\n  'Legal — contracts, terms of service, compliance, legal notices',\n  'Security — password resets, 2FA codes, login alerts, account security warnings',\n  'Newsletters — editorial newsletters, blog digests, content subscriptions',\n  'Notifications — automated system alerts, app notifications, ping messages',\n  'Travel — flights, hotels, car rentals, itineraries, booking confirmations',\n  'Health — medical appointments, prescriptions, health insurance, lab results',\n  'Social — personal communications, events, invitations, friends and family',\n  'AI — AI tools, LLM services, AI product updates',\n  'Dev — code repositories, CI/CD, developer tools, GitHub, APIs',\n  'Support — customer support tickets, help desk replies, service issues',\n  'Personal — personal admin, government, private matters not covered above',\n  'Promotions — marketing emails, sales, discounts, advertisements'\n];\n\nreturn {\n  emailId: email.id,\n  emailSubject: subject || '(no subject)',\n  emailFrom: from || '(unknown sender)',\n  emailTo: to || '(unknown recipient)',\n  bodyText,\n  existingLabels,\n  existingLabelsList,\n  taxonomy,\n  categoryDescriptions\n};"
      },
      "id": "98b4260a-5de1-4946-b459-87dba1f812e3",
      "name": "Prepare Email Data",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        16656,
        -128
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "You are an email analysis agent. Extract the following from this email:\n\n1. SENDER CONTEXT: Who sent this? (person, company, automated system)\n2. PRIMARY INTENT: What is the main purpose? (inform, request, confirm, alert, sell)\n3. KEY ENTITIES: What specific things are mentioned? (products, services, dates, amounts)\n4. URGENCY: Does this require action? (urgent, normal, informational)\n5. DOMAIN: What business domain does this fall into? (finance, travel, work, shopping, etc.)\n\nReturn JSON only:\n{\n  \"sender_context\": \"...\",\n  \"primary_intent\": \"...\",\n  \"key_entities\": [\"...\", \"...\"],\n  \"urgency\": \"...\",\n  \"domain\": \"...\"\n}\n\n--- EMAIL TO ANALYZE ---\nFrom: {{ $('Prepare Email Data').item.json.emailFrom }}\nTo: {{ $('Prepare Email Data').item.json.emailTo }}\nSubject: {{ $('Prepare Email Data').item.json.emailSubject }}\n\nBody:\n{{ $('Prepare Email Data').item.json.bodyText }}"
      },
      "id": "f318943d-4e60-4be9-98a3-eb24829bb68c",
      "name": "Step 1: Summarize Email",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        16848,
        -128
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "Given this email analysis:\n{{ $json.json }}\n\nAvailable label taxonomy:\n{{ $('Prepare Email Data').item.json.taxonomy.join(', ') }}\n\nGenerate 3 candidate categories from the taxonomy that could fit this email.\nFor each candidate, provide:\n- Category name (must be EXACTLY from taxonomy)\n- Confidence score (0.0 - 1.0)\n- One-sentence reasoning why it fits\n\nReturn JSON only:\n{\n  \"candidates\": [\n    {\"category\": \"...\", \"confidence\": 0.9, \"reason\": \"...\"},\n    {\"category\": \"...\", \"confidence\": 0.7, \"reason\": \"...\"},\n    {\"category\": \"...\", \"confidence\": 0.4, \"reason\": \"...\"}\n  ]\n}"
      },
      "id": "a5f95b15-2204-4056-9b4c-edeaa50249bd",
      "name": "Step 2: Generate Candidates",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        17152,
        -128
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "Review the candidates below and select the single best category.\nConsider:\n- Does the reasoning align with email content?\n- Is the confidence score justified?\n- Are there any red flags (sarcasm, ambiguity, mixed topics)?\n\nCandidates:\n{{ $json.json }}\n\nEmail Subject: {{ $('Prepare Email Data').item.json.emailSubject }}\nEmail From: {{ $('Prepare Email Data').item.json.emailFrom }}\n\nReturn JSON only:\n{\n  \"selected_category\": \"...\",\n  \"final_confidence\": 0.95,\n  \"explanation\": \"...\"\n}"
      },
      "id": "54b7d7b1-03c2-4411-b386-08c2f9a44080",
      "name": "Step 3: Select Best",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        17440,
        -128
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "Verify this category assignment is correct:\n- Selected: {{ $json.json.selected_category }}\n- Email subject: {{ $('Prepare Email Data').item.json.emailSubject }}\n- Email from: {{ $('Prepare Email Data').item.json.emailFrom }}\n\nExisting Gmail labels: {{ $('Prepare Email Data').item.json.existingLabelsList }}\n\nTaxonomy: {{ $('Prepare Email Data').item.json.taxonomy.join(', ') }}\n\nReturn ONLY a valid JSON object. Do not include any conversational text, explanations, or markdown formatting. Your output must be parseable by JSON.parse().\n\n{\n  \"valid\": true/false,\n  \"matched_label_id\": \"...\" or null,\n  \"matched_label_name\": \"...\" or null,\n  \"alternative_suggestion\": \"...\" (if invalid)\n}"
      },
      "id": "6cd36d79-1a3a-4196-a364-09900aeff023",
      "name": "Step 4: Validate Against Labels",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        17712,
        -128
      ]
    },
    {
      "parameters": {
        "model": "gemma4:31b-cloud",
        "options": {
          "temperature": 0
        }
      },
      "id": "0f2bd375-7a70-4f93-bd6a-f92f08c41d31",
      "name": "Ollama Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOllama",
      "typeVersion": 1,
      "position": [
        17296,
        128
      ],
      "credentials": {
        "ollamaApi": {
          "id": "9k920xXzUND3cX1z",
          "name": "Ollama account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "function safeParse(text) {\n  if (!text) return {};\n  try {\n    const cleanedText = text.replace(/```json\\n?|```/g, '').trim();\n    return JSON.parse(cleanedText);\n  } catch (e) {\n    console.error(\"Failed to parse JSON, treating as plain text:\", e);\n    return { text: text, isPlainText: true };\n  }\n}\n\n// Parse Step 4 output (Validate Against Labels)\nconst step4Output = safeParse($json.text);\nconst preparedData = $('Prepare Email Data').item.json;\n\n// Extract selected category from Step 3\nconst step3Output = safeParse($('Step 3: Select Best').item.json.text);\nconst selectedCategory = step3Output.selected_category || step3Output.text || 'Notifications';\n\n// Find matching label from existing Gmail labels\nfunction normalize(str) {\n  return (str || '').toLowerCase().trim();\n}\n\nconst normalizedSelected = normalize(selectedCategory);\nlet matchedLabel = preparedData.existingLabels.find(l => normalize(l.name) === normalizedSelected)\n  || preparedData.existingLabels.find(l => normalize(l.name).includes(normalizedSelected))\n  || preparedData.existingLabels.find(l => normalizedSelected.includes(normalize(l.name)));\n\n// Confidence threshold - if below 0.7, mark as uncategorized\nconst finalConfidence = step3Output.final_confidence || 0;\nconst isLowConfidence = finalConfidence < 0.7;\n\nif (matchedLabel && matchedLabel.id && !isLowConfidence) {\n  return {\n    emailId: preparedData.emailId,\n    emailSubject: preparedData.emailSubject,\n    emailFrom: preparedData.emailFrom,\n    matchedLabelId: matchedLabel.id,\n    matchedLabelName: matchedLabel.name,\n    selectedCategory,\n    confidence: finalConfidence,\n    explanation: step3Output.explanation || '',\n    status: 'matched'\n  };\n} else if (isLowConfidence) {\n  return {\n    emailId: preparedData.emailId,\n    emailSubject: preparedData.emailSubject,\n    emailFrom: preparedData.emailFrom,\n    matchedLabelId: null,\n    matchedLabelName: null,\n    selectedCategory,\n    confidence: finalConfidence,\n    explanation: step3Output.explanation || '',\n    status: 'low_confidence'\n  };\n} else {\n  return {\n    emailId: preparedData.emailId,\n    emailSubject: preparedData.emailSubject,\n    emailFrom: preparedData.emailFrom,\n    matchedLabelId: null,\n    matchedLabelName: null,\n    selectedCategory,\n    confidence: finalConfidence,\n    explanation: step3Output.explanation || '',\n    status: 'no_match'\n  };\n}"
      },
      "id": "68ddffc4-8b79-4c86-83ea-d0794429272b",
      "name": "Match Label",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        18016,
        -128
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true
          },
          "conditions": [
            {
              "id": "check-has-match",
              "leftValue": "={{ $json.status }}",
              "rightValue": "matched",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "526c07a0-f0fd-4014-ab0b-f8abc12ed9ae",
      "name": "Has Match?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        18224,
        -224
      ]
    },
    {
      "parameters": {
        "operation": "addLabels",
        "messageId": "={{ $json.emailId }}",
        "labelIds": "={{ $json.matchedLabelId }}"
      },
      "id": "6bd73b59-6dde-4dfd-900d-b2c9c7abf73d",
      "name": "Apply Existing Label",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        18432,
        -384
      ],
      "webhookId": "e97fb5ae-cc82-413e-ac5b-34c4dc1e2117",
      "credentials": {
        "gmailOAuth2": {
          "id": "gO8EWg5jZuSVkFxz",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {
        "operation": "removeLabels",
        "messageId": "={{ $('Match Label').item.json.emailId }}",
        "labelIds": [
          "INBOX"
        ]
      },
      "id": "ac49dc3b-5ae5-4f3d-b89c-4c73d2ea5ada",
      "name": "Remove From Inbox",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        18624,
        -384
      ],
      "webhookId": "996e799b-05f0-49a3-be5f-1194119f577e",
      "credentials": {
        "gmailOAuth2": {
          "id": "gO8EWg5jZuSVkFxz",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {},
      "id": "f5b22d62-b5c4-4471-90c7-02887b083ebd",
      "name": "Merge Results",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        19024,
        -192
      ]
    },
    {
      "parameters": {
        "chatId": "-1003769081383",
        "text": "={{ $json.message }}",
        "additionalFields": {}
      },
      "id": "68e0caab-fb05-41d2-9d76-cb8c14e4cad0",
      "name": "Telegram Summary",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        19376,
        -192
      ],
      "webhookId": "bd91720a-8c00-47bd-8805-da65eb8a600b",
      "credentials": {
        "telegramApi": {
          "id": "bnyBxist2KsEGbou",
          "name": "Gmail Organizer"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const preparedData = $('Prepare Email Data').item.json;\nconst labelData = $('Match Label').item.json;\n\nreturn {\n  emailId: labelData.emailId,\n  emailSubject: preparedData.emailSubject,\n  emailFrom: preparedData.emailFrom,\n  labelApplied: labelData.matchedLabelName,\n  newLabelCreated: false,\n  status: 'labeled_existing'\n};"
      },
      "id": "7ee515e3-5afd-45b7-8be3-6ec3e7f29594",
      "name": "Collect Existing Label Result",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        18800,
        -208
      ]
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\n\nif (items.length === 0) {\n  return [{\n    json: {\n      message: 'Email organizer run completed, but no emails were processed.'\n    }\n  }];\n}\n\nconst total = items.length;\nconst createdCount = items.filter(item => item.json.newLabelCreated).length;\nconst reusedCount = total - createdCount;\nconst maxLines = 25;\nconst lines = items.slice(0, maxLines).map((item, index) => {\n  const email = item.json;\n  return `${index + 1}. ${email.emailSubject}\\n   From: ${email.emailFrom}\\n   Label: ${email.labelApplied}${email.newLabelCreated ? ' (new)' : ''}`;\n});\n\nif (total > maxLines) {\n  lines.push(`...and ${total - maxLines} more emails.`);\n}\n\nconst message = [\n  'Email organizer summary',\n  '',\n  `Processed: ${total}`,\n  `Existing labels reused: ${reusedCount}`,\n  `New labels created: ${createdCount}`,\n  '',\n  'Emails:',\n  ...lines\n].join('\\n');\n\nreturn [{\n  json: {\n    message,\n    totalProcessed: total,\n    reusedCount,\n    createdCount\n  }\n}];"
      },
      "id": "f89f3b81-53e8-47d3-9bfa-bb27610bd824",
      "name": "Build Batch Summary",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        19216,
        -192
      ]
    }
  ],
  "pinData": {},
  "connections": {
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Get All Labels",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get All Labels": {
      "main": [
        [
          {
            "node": "Format Label List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Label List": {
      "main": [
        [
          {
            "node": "Send Label Audit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Gmail Labels",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Gmail Labels": {
      "main": [
        [
          {
            "node": "Get Unlabeled Emails",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Unlabeled Emails": {
      "main": [
        [
          {
            "node": "Prepare Email Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Email Data": {
      "main": [
        [
          {
            "node": "Step 1: Summarize Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ollama Model": {
      "ai_languageModel": [
        [
          {
            "node": "Step 1: Summarize Email",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Step 2: Generate Candidates",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Step 3: Select Best",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Step 4: Validate Against Labels",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Step 1: Summarize Email": {
      "main": [
        [
          {
            "node": "Step 2: Generate Candidates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Step 2: Generate Candidates": {
      "main": [
        [
          {
            "node": "Step 3: Select Best",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Step 3: Select Best": {
      "main": [
        [
          {
            "node": "Step 4: Validate Against Labels",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Step 4: Validate Against Labels": {
      "main": [
        [
          {
            "node": "Match Label",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Match Label": {
      "main": [
        [
          {
            "node": "Has Match?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has Match?": {
      "main": [
        [
          {
            "node": "Apply Existing Label",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Collect Existing Label Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Apply Existing Label": {
      "main": [
        [
          {
            "node": "Remove From Inbox",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove From Inbox": {
      "main": [
        [
          {
            "node": "Collect Existing Label Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Collect Existing Label Result": {
      "main": [
        [
          {
            "node": "Merge Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Results": {
      "main": [
        [
          {
            "node": "Build Batch Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Batch Summary": {
      "main": [
        [
          {
            "node": "Telegram Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "versionId": "f71fa09f-9824-4efd-89fe-f0ba357b06c3",
  "meta": {
    "instanceId": "e09d1f0f8b9f78e80ac70b6dc8726dd263b0b6ffc4300b0eee3b58f6da316f29"
  },
  "id": "1d4yBFeOloT625xN",
  "tags": [
    {
      "updatedAt": "2026-03-17T19:45:12.616Z",
      "createdAt": "2026-03-17T19:45:12.616Z",
      "id": "Aoeg74KWWTIHIqLw",
      "name": "Organizer"
    }
  ]
}