{"workflow":{"id":13667,"name":"Track Telegram expenses with GPT-4 and Google Sheets (self-learning categories)","views":27,"recentViews":0,"totalViews":27,"createdAt":"2026-02-24T20:11:27.794Z","description":"**💸 HOW IT WORKS — AI TELEGRAM EXPENSE TRACKER**\n\nThis workflow transforms natural Telegram messages into structured expenses using AI — without forms, manual typing, or complex inputs.\n\nSimply send a message like:\n\n\n*Groceries 23€ yesterday*\n\n\n\nThe workflow validates the sender, understands the intent, extracts structured data, and prepares the expense for approval before saving.\n\n────────────────\n\n**🔄 WORKFLOW OVERVIEW**\n\n**🟩 1. Secure Input Layer**\nIncoming Telegram messages are checked against a list of approved Chat IDs to ensure only authorized users can create expenses.\n\n**🟦 2. AI Expense Detection**\nAn AI layer analyzes the message and decides whether it represents a real financial transaction.\nNon-expense messages are safely ignored to avoid noise in your data.\n\n**🟨 3. Smart Category Intelligence**\nExisting categories are loaded from Google Sheets and compared with the message content.\nIf no suitable category exists, the workflow can suggest and learn new categories over time.\n\n**🟪 4. Structured Data Extraction**\nAI converts natural language into structured fields:\n\ndate\n\namount\n\ncategory\n\ndescription\n\nshared vs personal expense\n\nSupports German and English input.\n\n**🟥 5. Human Approval & Storage**\nBefore saving, the user confirms the extracted result directly via Telegram.\nAfter approval, the expense is appended to Google Sheets automatically.\n\n────────────────\n\n📋 SETUP REQUIREMENTS\n\nBefore using this workflow, make sure the following components are ready:\n\n1️⃣**Telegram Bot**\nCreate a Telegram bot using BotFather and connect it to the Telegram Trigger node in n8n. Detailed setup instructions can be found [here](https://medium.com/@robinvm/how-to-create-a-telegram-bot-and-connect-it-to-n8n-99eec8ad6ed0).\n\n2️⃣**LLM API Access**\nAn API Key for a Large Language Model (LLM) is required for:\n\nexpense detection\n\ncategory matching\n\nstructured data extraction\n\nAdd your API credentials inside the AI node configuration.\n\n3️⃣**Google Sheets**\n\nCreate two Google Sheets before importing the workflow.\n\n***EXPENSES***\nRequired columns:\n*date, amount, category, description, common_expense, Person*\n\n***EXPENSE_CATEGORIES***\nRequired columns:\n*category, description, examples*\n\nThe workflow reads existing data and appends new entries automatically.\n\n────────────────\n\n💡**KEY FEATURES**\n\n• AI-powered expense detection from natural language\n• Self-learning category system\n• Human-in-the-loop approval step\n• Multi-language support (DE & EN)\n• Clean Google Sheets integration\n• Designed for real-life shared finance tracking\n\n────────────────\n\n👥**MULTI-USER SUPPORT**\n\nBuilt for couples, roommates, or teams.\n\nAdd multiple Chat IDs in:\nSecurity — Allow Approved Chat IDs\n\nEach expense is automatically tagged with the sender.\nShared expenses are stored as true in the common_expense column, while personal expenses default to false unless shared spending is detected.\n\nThis allows easy downstream analysis, dashboards, or automation.","workflow":{"id":"","meta":{},"name":"AI Telegram Expense Tracker (Self-Learning Categories)","tags":[],"nodes":[{"id":"9f0e8a05-1820-4372-b4c7-1e1902bd93c2","name":"Telegram - Receive Message","type":"n8n-nodes-base.telegramTrigger","position":[-3472,272],"webhookId":"","parameters":{"updates":["message"],"additionalFields":{}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"951ab95a-9e41-4634-ac6b-571ddb7eb3ce","name":"Security — Allow Approved Chat IDs","type":"n8n-nodes-base.if","position":[-3232,272],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"0f85f7d5-8b7e-4bcd-ae10-d7a1785192c4","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.message.chat.id }}","rightValue":0},{"id":"2d18f8cf-2910-4e20-b2f3-16a9ef04e63e","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.message.chat.id }}","rightValue":0}]}},"typeVersion":2.2},{"id":"6ce435ca-7ee5-4b6f-9b17-68eaa70b344e","name":"AI — Detect Expense Message","type":"@n8n/n8n-nodes-langchain.openAi","position":[-2256,256],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4.1-nano","cachedResultName":"GPT-4.1-NANO"},"options":{},"responses":{"values":[{"content":"=You are an EXPENSE EXTRACTION assistant.\n\nYour task:\nAnalyze a chat message and decide whether it contains an EXPENSE.\n\n---\n\nOUTPUT FORMAT (STRICT JSON ONLY)\n\nReturn ONLY one JSON object with EXACTLY these fields:\n\n{\n\"is_expense\": boolean,\n}\n\nNever add explanations.\nNever add additional fields.\n----------------------------\n\nDEFINITION OF AN EXPENSE\n\nAn expense MUST include:\n\n* a description (what money was spent on)\n* a numeric amount\n\nIf one of these is missing → it is NOT an expense.\n\n---\n\nFIELD RULES\n\nis_expense\n\n* true if message clearly contains a payment or spending\n* otherwise false\n\n\n---\n\nLANGUAGE\n\nMessages may be German or English.\nExtract meaning naturally.\n\n---\n\n\n\n\nPROCESSING LOGIC\n\n1. First decide if it is an expense.\n2. If NOT an expense, return:\n\n{\n\"is_expense\": false\n}\n\n3. If it IS an expense, return:\n\n{\n\"is_expense\": false\n}\n\n---\n\nCHAT MESSAGE:\n{{ $json.message.text }}\n"}]},"builtInTools":{}},"credentials":{"openAiApi":{}},"typeVersion":2.1},{"id":"2a9ec1ab-070b-4317-9992-154b1aa8ee1b","name":"Parse — Expense Detection Output","type":"n8n-nodes-base.set","position":[-1968,256],"parameters":{"mode":"raw","options":{},"jsonOutput":"={{ $('AI — Detect Expense Message').item.json.output[0].content[0].text }}"},"typeVersion":3.4},{"id":"aa04206a-f3d1-4470-98e4-4e76a833d093","name":"Filter — Only Continue If Expense","type":"n8n-nodes-base.if","position":[-1776,256],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"32b37996-d536-4142-98f3-8d1cb436ed80","operator":{"type":"boolean","operation":"equals"},"leftValue":"={{ $json.is_expense }}","rightValue":true}]}},"typeVersion":2.3},{"id":"1251654a-de72-4bcd-a548-6416280cfb55","name":"Sheets — Load Existing Categories","type":"n8n-nodes-base.googleSheets","position":[-784,240],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""}},"credentials":{"googleSheetsOAuth2Api":{}},"typeVersion":4.7},{"id":"5f1bda9e-fbdd-46e6-ace5-e6afac19c0ca","name":"Format — Build Category Prompt","type":"n8n-nodes-base.code","position":[-544,240],"parameters":{"jsCode":"const rows = $input.all();\n\n// Header hilft dem Modell die Struktur zu verstehen\nlet categoryText = \"Each line is one category in this format:\\n[Category] | Description | Examples\\n\\n\";\n\nfor (const item of rows) {\n  const c = item.json.category;\n  const d = item.json.description;\n  const e = item.json.examples;\n\n  // Kategorien mit [] markieren (stabileres Parsing fürs LLM)\n  categoryText += `[${c}] | ${d} | ${e}\\n`;\n}\n\nreturn [\n  {\n    json: {\n      category_prompt: categoryText.trim()\n    }\n  }\n];"},"typeVersion":2},{"id":"a5f1180a-966f-487e-a303-ddc574085a42","name":"AI — Classify Expense Category","type":"@n8n/n8n-nodes-langchain.openAi","position":[-320,240],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4.1-mini","cachedResultName":"GPT-4.1-MINI"},"options":{},"responses":{"values":[{"role":"system","content":"You are a strict classification engine.\n\nYou receive category lines in this format:\n[Category] | Description | Examples\n\nTask:\n1) Check if the message belongs to ANY existing category.\n2) If YES → return match:true.\n3) If NO → propose ONE new category.\n\nRules:\n- Be concise.\n- Use similar style as existing categories.\n- Return ONLY valid JSON.\n- No markdown.\n- No explanations.\n\nOutput schema:\n{\n  \"match\": boolean,\n  \"suggested_category\": string | null,\n  \"description\": string | null,\n  \"examples\": string | null\n}"},{"content":"=CATEGORIES:\n{{$json.category_prompt}}\n\nMESSAGE:\n{{ $node[\"Security — Allow Approved Chat IDs\"].json.message.text }}"}]},"builtInTools":{}},"credentials":{"openAiApi":{}},"typeVersion":2.1},{"id":"b2ea33a5-d737-4f38-8e71-8cf4cebfe70b","name":"Parse — Category Classification Output","type":"n8n-nodes-base.set","position":[32,240],"parameters":{"mode":"raw","options":{},"jsonOutput":"={{ $json.output[0].content[0].text }}"},"typeVersion":3.4},{"id":"81ffab19-c6eb-4e75-bc26-2001085d2f9c","name":"Decision — Category Exists?","type":"n8n-nodes-base.if","position":[240,240],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"61384aec-0483-48ab-92a8-b49385e3a581","operator":{"type":"boolean","operation":"equals"},"leftValue":"={{ $json.match }}","rightValue":false}]}},"typeVersion":2.3,"alwaysOutputData":false},{"id":"e9b20118-56f8-415e-92e0-4d2aba77d3ed","name":"Telegram — Ask To Create New Category","type":"n8n-nodes-base.telegram","position":[416,32],"webhookId":"","parameters":{"chatId":"={{ $node[\"Security — Allow Approved Chat IDs\"].json.message.chat.id }}","message":"=🤖 **New category detected**\n\nI couldn’t match this expense to any existing category.\nWould you like to create the following new category?\n\n**📂 Name:** {{$json.suggested_category}}\n**📝 Description:** {{$json.description}}\n**💡 Examples:** {{$json.examples}}\n\nPlease choose:\n\n✅ **YES** – Create category\n❌ **NO** – Discard","options":{"appendAttribution":false},"operation":"sendAndWait","approvalOptions":{"values":{"approvalType":"double","approveLabel":"✅ Yes","disapproveLabel":"❌ No"}}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"28e02ea5-9ef6-4597-a281-752219d2f38a","name":"Decision — Category Approved?","type":"n8n-nodes-base.if","position":[640,32],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"599fb7c5-ab7a-4199-a7c8-fa515a39a088","operator":{"type":"boolean","operation":"equals"},"leftValue":"={{ $json.data.approved }}","rightValue":true}]}},"typeVersion":2.3},{"id":"481ec102-a6dc-426c-85c9-75b76b4f27cc","name":"Telegram — Edit New Category Form","type":"n8n-nodes-base.telegram","position":[912,128],"webhookId":"","parameters":{"chatId":"={{ $node[\"Security — Allow Approved Chat IDs\"].json.message.chat.id }}","message":"=📝 Please fill out the form for the new category","options":{"appendAttribution":false},"operation":"sendAndWait","formFields":{"values":[{"fieldLabel":"Category","placeholder":"={{ $('Decision — Category Exists?').item.json.suggested_category }}","defaultValue":"={{ $('Decision — Category Exists?').item.json.suggested_category }}"},{"fieldLabel":"Description","placeholder":"={{ $('Decision — Category Exists?').item.json.description }}","defaultValue":"={{ $('Decision — Category Exists?').item.json.description }}"},{"fieldLabel":"Examples","defaultValue":"={{ $('Decision — Category Exists?').item.json.examples }}"}]},"responseType":"customForm"},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"4d6dd679-b641-41cf-9af7-2841831575c4","name":"Sheets — Add Suggested Category","type":"n8n-nodes-base.googleSheets","position":[912,-64],"parameters":{"columns":{"value":{"category":"={{ $('Decision — Category Exists?').item.json.suggested_category }}","examples":"={{ $('Decision — Category Exists?').item.json.examples }}","description":"={{ $('Decision — Category Exists?').item.json.description }}"},"schema":[{"id":"category","type":"string","display":true,"removed":false,"required":false,"displayName":"category","defaultMatch":false,"canBeUsedToMatch":true},{"id":"description","type":"string","display":true,"removed":false,"required":false,"displayName":"description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"examples","type":"string","display":true,"removed":false,"required":false,"displayName":"examples","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{},"documentId":{}},"credentials":{"googleSheetsOAuth2Api":{}},"typeVersion":4.7},{"id":"b8c7f4df-4750-4de1-b1fc-e943a659ee71","name":"Sheets — Add Edited Category","type":"n8n-nodes-base.googleSheets","position":[1104,128],"parameters":{"columns":{"value":{"category":"={{ $json.data.Category }}","examples":"={{ $json.data.Examples }}","description":"={{ $json.data.Description }}"},"schema":[{"id":"category","type":"string","display":true,"removed":false,"required":false,"displayName":"category","defaultMatch":false,"canBeUsedToMatch":true},{"id":"description","type":"string","display":true,"removed":false,"required":false,"displayName":"description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"examples","type":"string","display":true,"removed":false,"required":false,"displayName":"examples","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{},"documentId":{}},"credentials":{"googleSheetsOAuth2Api":{}},"typeVersion":4.7},{"id":"a45d1f24-7cd8-4891-8836-be67cb5260f4","name":"Pass Through — Category Data","type":"n8n-nodes-base.code","position":[1600,80],"parameters":{"jsCode":"return $input.all();"},"typeVersion":2},{"id":"956a4aff-8c37-4e4e-9630-38c40184b92b","name":"Prepare — Category Fields (Form)","type":"n8n-nodes-base.set","position":[1280,128],"parameters":{"options":{},"assignments":{"assignments":[{"id":"2b51b13d-18b7-4e34-9151-1e736f2a5c7e","name":"category","type":"string","value":"={{ $json.category }}"},{"id":"6da0578d-9562-4aa5-8187-00af912cb0ef","name":"description","type":"string","value":"={{ $json.description }}"},{"id":"23b3b673-a2d7-4c7a-9e39-0b5695ed3db0","name":"examples","type":"string","value":"={{ $json.examples }}"}]}},"typeVersion":3.4},{"id":"c317d6df-12aa-4f3e-a031-7de112c5a37a","name":"Prepare — Category Fields (Auto)","type":"n8n-nodes-base.set","position":[1264,-64],"parameters":{"options":{},"assignments":{"assignments":[{"id":"8c5414ba-3769-4776-8b00-9df2551e20cb","name":"category","type":"string","value":"={{ $json.category }}"},{"id":"c830b288-2921-424c-9f53-a867bb96d741","name":"description","type":"string","value":"={{ $json.description }}"},{"id":"d855ab2f-a7b2-431f-89db-acb39bda70f5","name":"examples","type":"string","value":"={{ $json.examples }}"}]}},"typeVersion":3.4},{"id":"b945c2cc-3749-4976-aadb-3f23cb22773d","name":"Telegram — Category Created Confirmation","type":"n8n-nodes-base.telegram","position":[1888,80],"webhookId":"","parameters":{"text":"=✅ **Category Created Successfully**\n\nYour new category has been added and will now be used for future expense classifications.\n\n**📂 Category:** {{ $('Pass Through — Category Data').item.json.category }}\n\n**📝 Description:** {{ $('Pass Through — Category Data').item.json.description }}\n\n**💡 Example: ** {{ $('Pass Through — Category Data').item.json.examples }}\n\nThanks for your confirmation — your system just got smarter 🚀","chatId":"={{ $node[\"Security — Allow Approved Chat IDs\"].json.message.chat.id }}","additionalFields":{"appendAttribution":false}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"b5171992-70c9-4801-8971-e28efdaabe3a","name":"Prepare — Updated Categories","type":"n8n-nodes-base.set","position":[2144,80],"parameters":{"options":{},"assignments":{"assignments":[{"id":"ead6c399-5004-4982-b931-488c683c3eb7","name":"category","type":"string","value":"={{ $('Pass Through — Category Data').item.json.category }}"},{"id":"6472df58-a527-4be1-b778-d900c370e587","name":"description","type":"string","value":"={{ $('Pass Through — Category Data').item.json.description }}"},{"id":"6eeebd0c-fa44-481e-94b6-d33b687b6cbd","name":"examples","type":"string","value":"={{ $('Pass Through — Category Data').item.json.examples }}"}]}},"typeVersion":3.4},{"id":"14787bc4-6242-4527-8244-781c6ecb9982","name":"Format — Rebuild Category Prompt","type":"n8n-nodes-base.code","position":[2432,80],"parameters":{"jsCode":"const rows = $input.all().filter(item => item.json?.category);\n\nlet categoryText = \"Each line is one category in this format:\\n[Category] | Description | Examples\\n\\n\";\n\nfor (const item of rows) {\n  const c = item.json.category ?? \"\";\n  const d = item.json.description ?? \"\";\n  const e = item.json.examples ?? \"\";\n\n  categoryText += `[${c}] | ${d} | ${e}\\n`;\n}\n\nreturn [\n  {\n    json: {\n      category_prompt: categoryText.trim()\n    }\n  }\n];"},"typeVersion":2},{"id":"06bdd6d2-5edf-49b3-809a-e38d93ddc6fd","name":"Prepare — Category Prompt Payload","type":"n8n-nodes-base.set","position":[1424,256],"parameters":{"options":{},"assignments":{"assignments":[{"id":"7db24e27-69f8-4c94-a6ea-e6c4b724d4b9","name":"category_prompt","type":"string","value":"={{ $('Format — Build Category Prompt').item.json.category_prompt }}"}]}},"typeVersion":3.4,"alwaysOutputData":false},{"id":"2d4df9a7-1811-420d-b910-55dd092de1ed","name":"Merge — Expense + Categories","type":"n8n-nodes-base.code","position":[2672,256],"parameters":{"jsCode":"return $input.all();"},"typeVersion":2},{"id":"63e73043-7814-4e07-9084-3a8a45e5dfaf","name":"AI — Extract Structured Expense Data","type":"@n8n/n8n-nodes-langchain.openAi","position":[3552,256],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4","cachedResultName":"GPT-4"},"options":{},"responses":{"values":[{"content":"=You are an EXPENSE EXTRACTION AGENT.\n\nYour task:\nAnalyze a chat message and extract expense data.\n\n---\n\nOUTPUT FORMAT (STRICT JSON ONLY)\n\nReturn ONLY one JSON object with EXACTLY these fields:\n\n{\n\"date\": string,\n\"amount\": float,\n\"category\": string,\n\"description\": string,\n\"common_expense\": boolean\n}\n\nNever add explanations.\nNever add additional fields.\n----------------------------\n\nFIELD RULES\n\ndate\n\n* Extract date only if mentioned\n* Format: YYYY-MM-DD\n* If missing AND is_expense = true → use TODAY_DATE\n* If is_expense = false → \"\"\n\namount\n\n* Numeric only\n* No currency symbols\n* If is_expense = false → 0\n\ndescription\n\n* Short, clean object or service\n* NO numbers\n* NO date words\n* Examples: \"Pizza\", \"Taxi ride\", \"Groceries\"\n* If is_expense = false → \"\"\n\ncategory\n\n* Choose ONE category from AVAILABLE_CATEGORIES\n* If none fits → create a NEW short category label\n* If is_expense = false → \"\"\n\ncommon_expense\n\n* true ONLY if shared spending is implied\n  (\"wir\", \"geteilt\", \"split\", \"shared\", \"für uns\")\n* otherwise false\n\n---\n\nLANGUAGE\n\nMessages may be German or English.\nExtract meaning naturally.\n\n---\n\nINPUT VARIABLES\n\nTODAY_DATE = {{ $now.format('yyyy-MM-dd') }}\n\nAVAILABLE_CATEGORIES:\n{{ $json.category_prompt }}\n\n---\n\nPROCESSING LOGIC\n\n1. Decide if the message is an expense.\n2. If NOT an expense, return:\n\n{\n\"is_expense\": false,\n\"date\": \"\",\n\"amount\": 0,\n\"category\": \"\",\n\"description\": \"\",\n\"common_expense\": false\n}\n\n3. If it IS an expense:\n   Fill all fields according to rules.\n\n---\n\nCHAT MESSAGE:\n{{ $node[\"Security — Allow Approved Chat IDs\"].json.message.text }}"}]},"builtInTools":{}},"credentials":{"openAiApi":{}},"typeVersion":2.1},{"id":"1355837d-9b0a-4eed-997f-1ea3ae165acf","name":"Parse — Expense Extraction Output","type":"n8n-nodes-base.set","position":[3888,256],"parameters":{"mode":"raw","options":{},"jsonOutput":"={{ $json.output[0].content[0].text }}"},"typeVersion":3.4},{"id":"d83c533d-1cf8-4fa4-83fa-f6fa16a64bf9","name":"Telegram — Confirm Expense Before Save","type":"n8n-nodes-base.telegram","position":[5200,256],"webhookId":"","parameters":{"chatId":"={{ $node[\"Security — Allow Approved Chat IDs\"].json.message.chat.id }}","message":"=Please review your entry 👇\n\n📅 date: {{ $json.date }}\n💰 amount: {{ $json.amount }}\n📂 category: {{ $json.category }}\n📝 description: {{ $json.description }}\n👥 common_expense: {{ $json.common_expense }}\n\nShould I save this data to the database?\n\n✅ Reply with: YES\n❌ Reply with: NO","options":{"appendAttribution":false},"operation":"sendAndWait","approvalOptions":{"values":{"approvalType":"double","approveLabel":"✅ YES","disapproveLabel":"❌ NO"}}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"d4d8ec37-2ffa-4d14-a66b-96cc97dacbb7","name":"Prepare — Add Person Name","type":"n8n-nodes-base.set","position":[5392,256],"parameters":{"options":{},"assignments":{"assignments":[{"id":"d031284c-bea2-4b4f-97b4-ba55cffa9a73","name":"person","type":"string","value":"={{ $node[\"Security — Allow Approved Chat IDs\"].json.message.from.first_name }}"}]}},"typeVersion":3.4},{"id":"2db75d68-4c1d-4050-a8ba-f9762c63f393","name":"Filter — Only Approved Expenses","type":"n8n-nodes-base.filter","position":[5600,256],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"42845ab5-2e11-497e-8fd8-871a437511e9","operator":{"type":"boolean","operation":"equals"},"leftValue":"={{ $('Telegram — Confirm Expense Before Save').item.json.data.approved }}","rightValue":true}]}},"typeVersion":2.3},{"id":"f880bafe-d5ff-43f3-a1b1-be47c2d4adea","name":"Sheets — Save Expense","type":"n8n-nodes-base.googleSheets","position":[5792,256],"parameters":{"columns":{"value":{"date":"={{ $('Parse — Expense Extraction Output').item.json.date }}","Person":"={{ $('Prepare — Add Person Name').item.json.person }}","amount":"={{ $('Parse — Expense Extraction Output').item.json.amount }}","category":"={{ $('Parse — Expense Extraction Output').item.json.category }}","description":"={{ $('Parse — Expense Extraction Output').item.json.description }}","common_expense":"={{ $('Parse — Expense Extraction Output').item.json.common_expense }}"},"schema":[{"id":"date","type":"string","display":true,"removed":false,"required":false,"displayName":"date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"amount","type":"string","display":true,"removed":false,"required":false,"displayName":"amount","defaultMatch":false,"canBeUsedToMatch":true},{"id":"category","type":"string","display":true,"removed":false,"required":false,"displayName":"category","defaultMatch":false,"canBeUsedToMatch":true},{"id":"description","type":"string","display":true,"removed":false,"required":false,"displayName":"description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"common_expense","type":"string","display":true,"removed":false,"required":false,"displayName":"common_expense","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Person","type":"string","display":true,"removed":false,"required":false,"displayName":"Person","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{},"documentId":{}},"credentials":{"googleSheetsOAuth2Api":{}},"typeVersion":4.7},{"id":"575b4efd-f1f0-4a8f-b13d-cdcbd65bec72","name":"Telegram — Expense Saved Confirmation","type":"n8n-nodes-base.telegram","position":[5984,256],"webhookId":"","parameters":{"text":"✅ Your expense was successfully added!","chatId":"={{ $node[\"Security — Allow Approved Chat IDs\"].json.message.chat.id }}","additionalFields":{"appendAttribution":false}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"6dd3ad87-9410-4d23-aad6-afbe14d233be","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-4560,-928],"parameters":{"color":7,"width":736,"height":1424,"content":"## HOW IT WORKS — AI TELEGRAM EXPENSE TRACKER\n\nThis workflow automatically converts Telegram messages into structured expenses using AI.\n\nInstead of filling out forms, simply send a natural message like:\n\nGroceries 23€ yesterday\n\nThe workflow analyzes, validates, and stores your expense step by step.\n\n────────────────\n\n🔄 **WORKFLOW OVERVIEW**\n\n🟩 **Input & Security**\nA Telegram message is received and validated against approved Chat IDs.\n\n🟦 **AI Detection Layer**\nAI checks whether the message contains a real expense.\nNon-financial messages are ignored.\n\n🟨 **Category Intelligence**\nExisting categories are loaded and compared.\nIf no match is found, the workflow can suggest and learn new categories.\n\n🟪 **Expense Extraction**\nAI extracts structured data such as date, amount, category, and description.\n\n🟥 **Approval & Save**\nYou confirm the result before it is saved to Google Sheets.\n\n────────────────\n\n📋 **WHAT YOU NEED**\n\nCreate two Google Sheets before using this workflow.\n\nEXPENSES\nColumns:\ndate, amount, category, description, common_expense, Person\n\nEXPENSE_CATEGORIES\nColumns:\ncategory, description, examples\n\nThe workflow will read and append data automatically.\n\n\n────────────────\n\n💡 **KEY FEATURES**\n\n• AI-powered expense detection\n• Self-learning category system\n• Human approval before saving\n• Works with natural language (German & English)\n\n────────────────\n\n⭐ **MULTI-USER HINT**\n\nThis workflow is designed for multiple people.\n\nYou can add several Chat IDs in the\nSecurity — Allow Approved Chat IDs node\nso different users can track expenses at the same time.\n\nEach entry is tagged with the person who sent the message.\n\nExpenses can be marked as shared or personal.\nShared expenses are stored in the common_expense column as a boolean value (true/false).\n\nBy default, expenses are treated as personal unless shared spending is detected."},"typeVersion":1},{"id":"59d9a681-502e-489e-a931-1b314eddb7a4","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-3568,-80],"parameters":{"color":4,"width":704,"height":576,"content":"## INPUT\nWhen a new Telegram message is received, the workflow first performs a **security validation**.\nOnly messages from approved Telegram users are allowed to continue.\n\nThis prevents unauthorized users from triggering your expense automation.\n\n\n\n⚠️ **Action Required**\n-> Add your Telegram Credentials to the following Nodes:\n   **Receive Message**\n-> Replace Telegram Chat IDs in following Security Nodes:\n**Allow Approved Chat IDs**"},"typeVersion":1},{"id":"3445cc94-ae89-486c-9a86-9fe37e1ba310","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-2736,-80],"parameters":{"color":5,"width":1136,"height":576,"content":"## AI DETECTION LAYER\nThis section uses AI to determine whether an incoming Telegram message actually contains an expense.\n\nInstead of processing every message, the workflow first performs a lightweight classification step to reduce errors and unnecessary processing.\n\n**1. AI — Detect Expense Message**\nThe AI analyzes the text and decides if it represents a real expense.\n\n**2. Parse — Expense Detection Output**\nThe AI response is converted into structured JSON data.\n\n**3. Filter — Only Continue If Expense**\nThe workflow only continues if is_expense = true.\n\n\n⚠️ **Action Required**\n\n--> Add your AI Credentials to the following Node:\n   **Detect Expense Message**"},"typeVersion":1},{"id":"7504dec5-0779-4f08-bb40-359d1e5a9ba3","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-1552,-80],"parameters":{"width":4496,"height":576,"content":"## CATEGORY INTELLIGENCE - Smart Category Handling\nThis section ensures that every expense is assigned to the correct category.\n\nFirst, the workflow loads your existing categories from Google Sheets and formats them into an AI-readable structure.\nThe AI then checks whether the new expense fits an existing category.\n\nIf no match is found, the workflow proposes a new category and asks for confirmation before adding it to your category list.\n\n\n\n🔎 **What happens here?**\n-> Load existing categories from Sheets\n-> AI compares the message against known categories\n-> If no match is found, AI suggests a new category (name, description, examples)\n-> You can approve the suggestion or create your own category via form\n-> New categories are added to your system and used automatically in future expenses\n\n\n\n\n\n⚠️ **Action Required**\n-> Connect to the Sheet that contains the category data in following Sheet Nodes: \n     **Load Existing Categories, Add Suggested Category, Add Edited Category**\n\n-> Add your Telegram Credentials to the following Nodes:\n   **Ask To Create New Category,  Edit New Category Form, Category Created Confirmation**\n\n--> Add your AI Credentials to the following Node:\n   **Classify Expense Category**"},"typeVersion":1},{"id":"f154793b-d1e9-42c5-8f13-21edb177b88e","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[3136,-80],"parameters":{"color":6,"width":1008,"height":576,"content":"## EXPENSE EXTRACTION\nIn this section, the workflow uses AI to transform the detected expense message into structured data.\n\nThe AI receives the original chat message together with the current category list and extracts all relevant expense information in a strict JSON format.\n\n🔎 **What happens here?**\n-> Merge message data with available categories\n-> AI extracts structured fields (date, amount, category, description, shared expense)\n-> Output is converted into clean JSON for further processing\n-> This step converts natural language into database-ready expense records.\n\n\n⚠️ **Action Required**\n--> Add your AI Credentials to the following Node:\n   **Extract Structured Expense Data**"},"typeVersion":1},{"id":"54a789a8-ea82-4833-a0c2-1127fd2459e2","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[4592,-80],"parameters":{"color":3,"width":1584,"height":576,"content":"## APPROVAL & SAVE\n\nBefore saving the expense, the workflow asks the user for final confirmation via Telegram.\nThis ensures that extracted data is correct and prevents incorrect entries from being stored.\n\nOnly approved expenses are written to Google Sheets and confirmed back to the user.\n\n\n🔎 **What happens here?**\n-> Show extracted expense data for review\n-> Wait for user approval\n-> Add user information to the record\n-> Save the expense to Google Sheets\n-> Send a confirmation message\n\nThis step adds a human-in-the-loop safety layer before data is stored permanently.\n\n\n\n\n\n⚠️ **Action Required**\n-> Connect to the Sheet that contains the category data in following Sheet Nodes: \n     **Save Expense**\n\n-> Add your Telegram Credentials to the following Nodes:\n   **Confirm Expense Before Save, Expense Saved Confirmation**"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"","connections":{"Sheets — Save Expense":{"main":[[{"node":"Telegram — Expense Saved Confirmation","type":"main","index":0}]]},"Telegram - Receive Message":{"main":[[{"node":"Security — Allow Approved Chat IDs","type":"main","index":0}]]},"Prepare — Add Person Name":{"main":[[{"node":"Filter — Only Approved Expenses","type":"main","index":0}]]},"AI — Detect Expense Message":{"main":[[{"node":"Parse — Expense Detection Output","type":"main","index":0}]]},"Decision — Category Exists?":{"main":[[{"node":"Telegram — Ask To Create New Category","type":"main","index":0}],[{"node":"Prepare — Category Prompt Payload","type":"main","index":0}]]},"Merge — Expense + Categories":{"main":[[{"node":"AI — Extract Structured Expense Data","type":"main","index":0}]]},"Pass Through — Category Data":{"main":[[{"node":"Telegram — Category Created Confirmation","type":"main","index":0}]]},"Prepare — Updated Categories":{"main":[[{"node":"Format — Rebuild Category Prompt","type":"main","index":0}]]},"Sheets — Add Edited Category":{"main":[[{"node":"Prepare — Category Fields (Form)","type":"main","index":0}]]},"Decision — Category Approved?":{"main":[[{"node":"Sheets — Add Suggested Category","type":"main","index":0}],[{"node":"Telegram — Edit New Category Form","type":"main","index":0}]]},"AI — Classify Expense Category":{"main":[[{"node":"Parse — Category Classification Output","type":"main","index":0}]]},"Format — Build Category Prompt":{"main":[[{"node":"AI — Classify Expense Category","type":"main","index":0}]]},"Filter — Only Approved Expenses":{"main":[[{"node":"Sheets — Save Expense","type":"main","index":0}]]},"Sheets — Add Suggested Category":{"main":[[{"node":"Prepare — Category Fields (Auto)","type":"main","index":0}]]},"Format — Rebuild Category Prompt":{"main":[[{"node":"Merge — Expense + Categories","type":"main","index":0}]]},"Parse — Expense Detection Output":{"main":[[{"node":"Filter — Only Continue If Expense","type":"main","index":0}]]},"Prepare — Category Fields (Auto)":{"main":[[{"node":"Pass Through — Category Data","type":"main","index":0}]]},"Prepare — Category Fields (Form)":{"main":[[{"node":"Pass Through — Category Data","type":"main","index":0}]]},"Filter — Only Continue If Expense":{"main":[[{"node":"Sheets — Load Existing Categories","type":"main","index":0}]]},"Parse — Expense Extraction Output":{"main":[[{"node":"Telegram — Confirm Expense Before Save","type":"main","index":0}]]},"Prepare — Category Prompt Payload":{"main":[[{"node":"Merge — Expense + Categories","type":"main","index":0}]]},"Sheets — Load Existing Categories":{"main":[[{"node":"Format — Build Category Prompt","type":"main","index":0}]]},"Telegram — Edit New Category Form":{"main":[[{"node":"Sheets — Add Edited Category","type":"main","index":0}]]},"Security — Allow Approved Chat IDs":{"main":[[{"node":"AI — Detect Expense Message","type":"main","index":0}]]},"AI — Extract Structured Expense Data":{"main":[[{"node":"Parse — Expense Extraction Output","type":"main","index":0}]]},"Telegram — Ask To Create New Category":{"main":[[{"node":"Decision — Category Approved?","type":"main","index":0}]]},"Parse — Category Classification Output":{"main":[[{"node":"Decision — Category Exists?","type":"main","index":0}]]},"Telegram — Confirm Expense Before Save":{"main":[[{"node":"Prepare — Add Person Name","type":"main","index":0}]]},"Telegram — Category Created Confirmation":{"main":[[{"node":"Prepare — Updated Categories","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":36,"nodeTypes":{"n8n-nodes-base.if":{"count":4},"n8n-nodes-base.set":{"count":8},"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.filter":{"count":1},"n8n-nodes-base.telegram":{"count":5},"n8n-nodes-base.stickyNote":{"count":6},"n8n-nodes-base.googleSheets":{"count":4},"n8n-nodes-base.telegramTrigger":{"count":1},"@n8n/n8n-nodes-langchain.openAi":{"count":3}}},"status":"published","readyToDemo":null,"user":{"name":"Robin","username":"robinvm","bio":"I design automated data systems — from ingestion to insight.\nPython | dbt | n8n | Tableau | Data Quality","verified":false,"links":["https://medium.com/@robinvm"],"avatar":"https://gravatar.com/avatar/2ffa76cd23594a355e441c0b2144d28de99a292c4e382505d6d1df157aa1c7ce?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":49,"icon":"file:telegram.svg","name":"n8n-nodes-base.telegram","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/creating-telegram-bots-with-n8n-a-no-code-platform/","icon":"💬","label":"Creating Telegram Bots with n8n, a No-Code Platform"},{"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.telegram/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/telegram/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Telegram"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjYgNjYiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzM3YWVlMiIgZD0iTTAgMzJjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMyczMyLTE0LjMyNyAzMi0zMlM0OS42NzMgMCAzMiAwIDAgMTQuMzI3IDAgMzIiLz48cGF0aCBmaWxsPSIjYzhkYWVhIiBkPSJtMjEuNjYxIDM0LjMzOCAzLjc5NyAxMC41MDhzLjQ3NS45ODMuOTgzLjk4MyA4LjA2OC03Ljg2NCA4LjA2OC03Ljg2NGw4LjQwNy0xNi4yMzctMjEuMTE5IDkuODk4eiIvPjxwYXRoIGZpbGw9IiNhOWM2ZDgiIGQ9Im0yNi42OTUgMzcuMDM0LS43MjkgNy43NDZzLS4zMDUgMi4zNzMgMi4wNjggMGw0LjY0NC00LjIwMyIvPjxwYXRoIGQ9Im0yMS43MyAzNC43MTItNy44MDktMi41NDVzLS45MzItLjM3OC0uNjMzLTEuMjM3Yy4wNjItLjE3Ny4xODYtLjMyOC41NTktLjU4OCAxLjczMS0xLjIwNiAzMi4wMjgtMTIuMDk2IDMyLjAyOC0xMi4wOTZzLjg1Ni0uMjg4IDEuMzYxLS4wOTdjLjIzMS4wODguMzc4LjE4Ny41MDMuNTQ4LjA0NS4xMzIuMDcxLjQxMS4wNjguNjg5LS4wMDMuMjAxLS4wMjcuMzg2LS4wNDUuNjc4LS4xODQgMi45NzgtNS43MDYgMjUuMTk4LTUuNzA2IDI1LjE5OHMtLjMzIDEuMy0xLjUxNCAxLjM0NWMtLjQzMi4wMTYtLjk1Ni0uMDcxLTEuNTgyLS42MS0yLjMyMy0xLjk5OC0xMC4zNTItNy4zOTQtMTIuMTI2LTguNThhLjM0LjM0IDAgMCAxLS4xNDYtLjIzOWMtLjAyNS0uMTI1LjEwOC0uMjguMTA4LS4yOHMxMy45OC0xMi40MjcgMTQuMzUyLTEzLjczMWMuMDI5LS4xMDEtLjA3OS0uMTUxLS4yMjYtLjEwNy0uOTI5LjM0Mi0xNy4wMjUgMTAuNTA2LTE4LjgwMSAxMS42MjktLjEwNC4wNjYtLjM5NS4wMjMtLjM5NS4wMjMiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Telegram","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":50,"icon":"file:telegram.svg","name":"n8n-nodes-base.telegramTrigger","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/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/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/creating-telegram-bots-with-n8n-a-no-code-platform/","icon":"💬","label":"Creating Telegram Bots with n8n, a No-Code Platform"},{"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/trigger-nodes/n8n-nodes-base.telegramtrigger/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/telegram/"}]},"categories":["Communication"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"Telegram Trigger"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjYgNjYiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzM3YWVlMiIgZD0iTTAgMzJjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMyczMyLTE0LjMyNyAzMi0zMlM0OS42NzMgMCAzMiAwIDAgMTQuMzI3IDAgMzIiLz48cGF0aCBmaWxsPSIjYzhkYWVhIiBkPSJtMjEuNjYxIDM0LjMzOCAzLjc5NyAxMC41MDhzLjQ3NS45ODMuOTgzLjk4MyA4LjA2OC03Ljg2NCA4LjA2OC03Ljg2NGw4LjQwNy0xNi4yMzctMjEuMTE5IDkuODk4eiIvPjxwYXRoIGZpbGw9IiNhOWM2ZDgiIGQ9Im0yNi42OTUgMzcuMDM0LS43MjkgNy43NDZzLS4zMDUgMi4zNzMgMi4wNjggMGw0LjY0NC00LjIwMyIvPjxwYXRoIGQ9Im0yMS43MyAzNC43MTItNy44MDktMi41NDVzLS45MzItLjM3OC0uNjMzLTEuMjM3Yy4wNjItLjE3Ny4xODYtLjMyOC41NTktLjU4OCAxLjczMS0xLjIwNiAzMi4wMjgtMTIuMDk2IDMyLjAyOC0xMi4wOTZzLjg1Ni0uMjg4IDEuMzYxLS4wOTdjLjIzMS4wODguMzc4LjE4Ny41MDMuNTQ4LjA0NS4xMzIuMDcxLjQxMS4wNjguNjg5LS4wMDMuMjAxLS4wMjcuMzg2LS4wNDUuNjc4LS4xODQgMi45NzgtNS43MDYgMjUuMTk4LTUuNzA2IDI1LjE5OHMtLjMzIDEuMy0xLjUxNCAxLjM0NWMtLjQzMi4wMTYtLjk1Ni0uMDcxLTEuNTgyLS42MS0yLjMyMy0xLjk5OC0xMC4zNTItNy4zOTQtMTIuMTI2LTguNThhLjM0LjM0IDAgMCAxLS4xNDYtLjIzOWMtLjAyNS0uMTI1LjEwOC0uMjguMTA4LS4yOHMxMy45OC0xMi40MjcgMTQuMzUyLTEzLjczMWMuMDI5LS4xMDEtLjA3OS0uMTUxLS4yMjYtLjEwNy0uOTI5LjM0Mi0xNy4wMjUgMTAuNTA2LTE4LjgwMSAxMS42MjktLjEwNC4wNjYtLjM5NS4wMjMtLjM5NS4wMjMiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Telegram Trigger","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"}]},{"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":844,"icon":"fa:filter","name":"n8n-nodes-base.filter","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The Filter node can be used to filter items based on a condition. If the condition is met, the item will be passed on to the next node. If the condition is not met, the item will be omitted. Conditions can be combined together by AND(meet all conditions), or OR(meet at least one condition).","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Filter","color":"#229eff"},"iconData":{"icon":"filter","type":"icon"},"displayName":"Filter","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1250,"icon":"file:openAi.svg","name":"@n8n/n8n-nodes-langchain.openAi","codex":{"data":{"alias":["LangChain","ChatGPT","Sora","DallE","whisper","audio","transcribe","tts","assistant"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.openai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Miscellaneous","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenAI"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg1IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NiAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MSA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K"},"displayName":"OpenAI","typeVersion":2,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":35,"name":"Document Extraction"},{"id":49,"name":"AI Summarization"}],"image":[]}}