{"workflow":{"id":14136,"name":"Send AI-parsed restaurant orders and status updates via Telegram and Google Sheets","views":57,"recentViews":3,"totalViews":57,"createdAt":"2026-03-18T09:31:50.777Z","description":"# 🍕 AI-Powered Restaurant Order & Notification System\n### **A Complete n8n Workflow for Automated Ordering and Customer Updates**\n\nThis professional n8n workflow provides an end-to-end solution for small restaurants. It includes a **Telegram Customer Bot** for placing orders and an **Automated Notification System** that updates customers via Google Sheets.\n\n---\n\n## 📖 Description\n\nThis system eliminates the need for manual order taking and status updates. It features:\n\n1. **AI Order Bot:** Customers chat with a Telegram bot to view the menu and place orders. An AI agent (Claude Haiku) parses natural language (e.g., \"2 pizza + 1 coke\") into structured data.\n2. **Order Management:** Orders are saved automatically to Google Sheets for staff to manage.\n3. **Real-Time Notifications:** As staff change the status in the sheet (e.g., to *Preparing* or *Ready*), n8n instantly notifies the customer via Telegram.\n\n### **Key Bot Commands**\n\n| Command | Description |\n| :--- | :--- |\n| `/start` | Welcome message and instructions |\n| `/menu` | View today's food and drink offerings |\n| `/help` | See all available commands |\n| `STATUS [Queue #]` | Check the live status of an order |\n| `CANCEL [Queue #]` | Cancel an order (only if Pending) |\n| `/myorders` | View your last 5 orders |\n\n---\n\n## 🛠 Setup Requirements\n\n### **1. Google Sheets Configuration**\n\nYour spreadsheet acts as your **Admin Dashboard**. Ensure Row 1 has these exact headers in order:\n\n| Column | Header Name | Description |\n| :---: | :--- | :--- |\n| A | `Queue Number` | Auto-generated by the bot (e.g., #4582) |\n| B | `Chat ID` | Customer's Telegram ID — captured automatically |\n| C | `Name` | Customer's first name |\n| D | `Order` | Items ordered — parsed and cleaned by AI |\n| E | `Status` | Dropdown: **Pending**, **Preparing**, **Ready**, **Completed**, **Cancelled** |\n| F | `Order Time` | Timestamp of when the order was placed |\n| G | `Order Date` | Date of the order |\n| H | `Last Status Sent` | *Internal:* Tracks last notification sent to prevent duplicates |\n\n&gt; **⚠️ Important:** Set up a **Data Validation dropdown** on column E with the values: `Pending`, `Preparing`, `Ready`, `Completed`, `Cancelled`. This is how staff update order status.\n\n&gt; **⚠️ Important:** In the **Read All Rows** node, go to **Options → Output Row Number** and ensure it is **enabled**. The workflow uses `row_number` to write back to the correct cell.\n\n---\n\n### **2. n8n Credential Configuration**\n\nYou need 3 credentials set up in n8n before activating:\n\n| Credential Type | Where Used | Notes |\n| :--- | :--- | :--- |\n| **Anthropic API** | Claude Haiku node | Required for AI order parsing |\n| **Google Sheets OAuth2 API** | All Google Sheets nodes | Connect your Google account |\n| **Telegram Bot API** | All Telegram nodes | Use your bot token from @BotFather |\n\n**Steps:**\n1. Go to **n8n → Settings → Credentials → Add Credential**\n2. Add each credential type above\n3. After importing the workflow, open each node and select the correct credential\n\n---\n\n### **3. Workflow Import Steps**\n\n1. Copy the workflow JSON\n2. In n8n, click **+** → **Import from JSON** → Paste and confirm\n3. Connect all credentials in each node\n4. Ensure **Output Row Number** is enabled in `Read All Rows` node options\n5. Pre-fill column H (`Last Status Sent`) with the current Status for all existing rows to prevent old rows from firing notifications on first run\n6. Turn the workflow **Active**\n\n---\n\n## 🏗 How It Works\n\n### **Phase 1: The Customer Bot (Workflow 1)**\n\n```\nCustomer texts bot\n       ↓\nRoute Message — detects command type\n       ↓\n┌─────────────────────────────────────┐\n│ /start    → Welcome message         │\n│ /help     → Help guide              │\n│ /menu     → Today's menu            │\n│ /myorders → Last 5 orders           │\n│ STATUS    → Live order status       │\n│ CANCEL    → Cancel if Pending only  │\n│ [order]   → AI parses → saves       │\n└─────────────────────────────────────┘\n       ↓\nOrder saved to Google Sheet (Status = Pending)\nCustomer receives queue number + wait time\n```\n\n### **Phase 2: The Staff Notification System (Workflow 2)**\n\n```\nEvery 1 minute — Schedule Trigger fires\n       ↓\nRead ALL rows from Google Sheet\n       ↓\nFor EACH row independently (runOnceForEachItem):\n  - Skip if no Queue Number or Chat ID\n  - Skip if Status = Pending\n  - Skip if Status = Last Status Sent (already notified)\n  - ✅ Send notification if Status changed\n       ↓\nSend Telegram message to that customer only\n       ↓\nWrite new Status into column H (Last Status Sent)\n→ Prevents duplicate notification next minute\n```\n\n### **Status Flow & Customer Messages**\n\n| Staff sets Status to | Customer receives |\n| :--- | :--- |\n| `Preparing` | 👨‍🍳 *\"Your order is being Prepared! We'll notify you when it's ready.\"* |\n| `Ready` | 🍕 *\"Your order is READY for collection! Please collect from the counter.\"* |\n| `Completed` | ✅ *\"Order marked as Completed. Thank you for dining with us!\"* |\n| `Cancelled` | ❌ *\"Your order has been Cancelled. We apologise for the inconvenience.\"* |\n\n---\n\n## 🔒 Order Cancellation Rules\n\nCustomers can only cancel orders in **Pending** status. All other states are protected:\n\n| Current Status | Customer tries CANCEL | Response |\n| :--- | :--- | :--- |\n| Pending | `CANCEL 1234` | ✅ Cancelled successfully |\n| Preparing | `CANCEL 1234` | ⚠️ Cannot cancel — being prepared |\n| Ready | `CANCEL 1234` | ⚠️ Already ready — please collect |\n| Completed | `CANCEL 1234` | ⚠️ Already completed |\n| Cancelled | `CANCEL 1234` | ⚠️ Already cancelled |\n| Someone else's order | `CANCEL 1234` | ❌ You can only cancel your own orders |\n\n---\n\n## 📦 Required Credentials Summary\n\n| Credential | Provider | Free Tier |\n| :--- | :--- | :--- |\n| **Anthropic API** | anthropic.com | Paid — ~$5 minimum deposit |\n| **Google Sheets OAuth2 API** | Google Cloud Console | Free |\n| **Google Sheets Trigger OAuth2 API** | Google Cloud Console | Free |\n| **Telegram Bot API** | @BotFather on Telegram | Free forever |\n\n---\n\n## 🧪 Test Scenarios\n\nRun these in order to verify the full system:\n\n1. `/start` → Should receive welcome message\n2. `/menu` → Should see the menu with prices\n3. Type `2 pizza + 1 coke` → Should get queue number\n4. `STATUS [queue]` → Should show ⏳ Pending\n5. In sheet: change Status to `Preparing` → Within 1 min, customer gets 👨‍🍳 message\n6. In sheet: change Status to `Ready` → Customer gets 🍕 message\n7. `STATUS [queue]` → Should now show 🍕 Ready\n8. `CANCEL [queue]` → Should say \"already ready, please collect\"\n9. In sheet: change Status to `Completed` → Customer gets ✅ message\n10. `/myorders` → Should show order history with final status\n\n---\n\n## ⚠️ Known Limitations\n\n- **Notification delay:** Up to 1 minute between staff updating the sheet and customer receiving the message (due to polling interval)\n- **Column H required:** The `Last Status Sent` column must exist in your sheet. Without it, every row will fire a notification on every poll\n- **Anthropic API cost:** Claude Haiku is not free — very low cost (~$0.25 per million tokens) but requires a funded account\n- **Google Sheets trigger limitation:** The Google Sheets Trigger cannot detect which specific row changed, which is why a Schedule Trigger with row comparison is used instead\n\n---\n\n## 🗂 File Structure\n\n```\nrestaurant_WITH_STICKIES.json   — Complete workflow (W1 + W2) with sticky notes\nrestaurant_workflow_docs.md     — This documentation file\n```\n\n---\n\n*Built with n8n • Claude Haiku AI • Google Sheets • Telegram Bot API*","workflow":{"meta":{"instanceId":"18dd7b5b2a819da255b0592c0c20c9327ca21e0c36c31033c172c57edf46fb54","templateCredsSetupCompleted":true},"nodes":[{"id":"b7299a4b-43b0-4f92-bad4-fb1dfa8bb206","name":"Customer Bot Listener","type":"n8n-nodes-base.telegramTrigger","position":[7040,3552],"webhookId":"new-restaurant-customer-webhook","parameters":{"updates":["message"],"additionalFields":{}},"typeVersion":1.1},{"id":"e492c4f7-a371-40fb-9d0d-b6f17f2fc063","name":"Route Message","type":"n8n-nodes-base.code","position":[7296,3552],"parameters":{"jsCode":"\nconst msg = $input.first().json;\nconst text = (msg.message?.text || msg.text || '').trim();\nconst chatId = msg.message?.chat?.id || msg.chat?.id || '';\nconst firstName = msg.message?.from?.first_name || msg.from?.first_name || 'Customer';\nconst upper = text.toUpperCase();\nconst statusMatch  = upper.match(/^STATUS\\s+(\\d+)/);\nconst cancelMatch  = upper.match(/^CANCEL\\s+(\\d+)/);\nconst startMatch   = upper.match(/^\\/START/);\nconst helpMatch    = upper.match(/^\\/HELP|^HELP/);\nconst menuMatch    = upper.match(/^\\/MENU|^MENU/);\nconst myorderMatch = upper.match(/^\\/MYORDERS|^MYORDERS/);\nlet route = 'order';\nif (statusMatch)   route = 'status';\nif (cancelMatch)   route = 'cancel';\nif (startMatch)    route = 'start';\nif (helpMatch)     route = 'help';\nif (menuMatch)     route = 'menu';\nif (myorderMatch)  route = 'myorders';\nif (upper.match(/^READY\\s+\\d+/)) route = 'blocked';\nconsole.log('ChatID:', chatId, '| Route:', route, '| Text:', text);\nreturn [{ json: {\n  chat_id: String(chatId), text, first_name: firstName, upper, route,\n  queue_match: statusMatch?.[1] || cancelMatch?.[1] || null\n}}];\n"},"typeVersion":2},{"id":"604a199d-c32f-4eed-a5a1-82ed3d9abba5","name":"Message Switch","type":"n8n-nodes-base.switch","position":[7552,3456],"parameters":{"rules":{"values":[{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s1","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"start"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s2","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"help"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s3","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"order"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s4","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"cancel"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s5","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"status"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s6","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"menu"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s7","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"myorders"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"s8","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.route }}","rightValue":"blocked"}]}}]},"options":{}},"typeVersion":3.2},{"id":"c2920056-7417-479a-aead-cbda24afc2ff","name":"Send Welcome","type":"n8n-nodes-base.telegram","position":[8144,3152],"webhookId":"welcome-new-01","parameters":{"text":"=👋 Welcome *{{ $('Route Message').first().json.first_name }}*\\!\n\nI am the 🍕 *Restaurant Order Bot*\n\nJust type your order to get started:\n_\"2 Margherita pizza \\+ 1 Coke\"_\n\n📋 *Your Commands:*\n• /menu — see today's menu\n• STATUS 1234 — check your order\n• CANCEL 1234 — cancel \\(Pending orders only\\)\n• /myorders — your recent orders\n• /help — all commands\n\n_Orders are managed by staff via their dashboard_","chatId":"={{ $('Route Message').first().json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"0f8cb239-b193-44a2-aaea-71cf82027ca8","name":"Send Help","type":"n8n-nodes-base.telegram","position":[8144,3312],"webhookId":"help-new-01","parameters":{"text":"=📖 *How to use this bot:*\n\n*Place an order:*\nJust type what you want\n_Example: 2 pizza \\+ 1 coke_\n\n*Check your order status:*\nSTATUS 1234\n\n*Cancel your order \\(Pending only\\):*\nCANCEL 1234\n\n*/menu* — see today's menu\n*/myorders* — your last 5 orders\n\n_You will be automatically notified when your order status changes\\!_","chatId":"={{ $('Route Message').first().json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"57c9c3eb-27c1-47d1-89fc-8d1a662f06c6","name":"AI Parse Order","type":"@n8n/n8n-nodes-langchain.agent","position":[8144,3504],"parameters":{"text":"=You are a restaurant order parser.\n\nParse this message and return ONLY raw JSON, single line, no markdown.\n\nFormat: {\"items\":\"clean readable order summary\",\"valid\":true}\n\nIf it is a food/drink order → valid: true, clean up the items text nicely\nIf it is NOT a food order (random text, commands, questions etc) → valid: false\n\nMessage: {{ $('Route Message').first().json.text }}\n\nReturn JSON only. Nothing else.","options":{"systemMessage":"Restaurant order parser. Return raw JSON only. Single line. No markdown."},"promptType":"define"},"typeVersion":3.1},{"id":"969199f6-771c-4662-a5a4-dd223ed9798b","name":"Claude Haiku","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[8032,3680],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-haiku-4-5-20251001","cachedResultName":"Claude Haiku 4.5"},"options":{}},"typeVersion":1.3},{"id":"9660e8dd-aacd-418d-b941-f9caecccbc94","name":"Build Order Response","type":"n8n-nodes-base.code","position":[8448,3504],"parameters":{"jsCode":"\nconst aiRaw = $input.first().json.output || '';\nconst prev = $('Route Message').first().json;\nlet p = null;\ntry { p = JSON.parse(aiRaw.trim()); } catch(e) {}\nif (!p) { try { const m = aiRaw.match(/\\{[\\s\\S]*\\}/); if(m) p = JSON.parse(m[0]); } catch(e) {} }\nif (!p) { p = { items: prev.text, valid: true }; }\nif (!p.valid) {\n  return [{ json: {\n    chat_id: prev.chat_id,\n    reply: \"Sorry, I didn't understand that as a food order! 🤔\\n\\nType your order like:\\n\\\"2 Margherita pizza + 1 Coke\\\"\\n\\nType /menu to see what we offer\\nType /help for all commands.\",\n    is_order: false\n  }}];\n}\nconst queueNum = Math.floor(Date.now() / 1000) % 9000 + 1000;\nconst waitMins = 10 + Math.floor(Math.random() * 10);\nconst now = new Date();\nconst reply = `✅ Order received!\\n\\n📋 Order: ${p.items}\\n🔢 Queue: #${queueNum}\\n⏱️ Wait: ~${waitMins} mins\\n\\nYou'll be notified automatically when ready!\\n\\nCheck anytime: STATUS ${queueNum}\\nTo cancel: CANCEL ${queueNum}`;\nreturn [{ json: {\n  chat_id: prev.chat_id, first_name: prev.first_name, reply,\n  is_order: true, queue_number: queueNum,\n  parsed_order: p.items,\n  wait_mins: waitMins, status: 'Pending',\n  order_time: now.toISOString(), order_date: now.toLocaleDateString('en-IN')\n}}];\n"},"typeVersion":2},{"id":"9d2a106c-6e29-4ee3-85ff-97a31610581e","name":"Save Order","type":"n8n-nodes-base.googleSheets","position":[8624,3504],"parameters":{"columns":{"value":{"Name":"={{ $json.first_name }}","Order":"={{ $json.parsed_order }}","Status":"=Pending","Chat ID":"={{ $json.chat_id }}","Order Date":"={{ $json.order_date }}","Order Time":"={{ $json.order_time }}","Queue Number":"={{ $json.queue_number }}"},"schema":[{"id":"Queue Number","type":"string","display":true,"required":false,"displayName":"Queue Number","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Chat ID","type":"string","display":true,"required":false,"displayName":"Chat ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Name","type":"string","display":true,"required":false,"displayName":"Name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Order","type":"string","display":true,"required":false,"displayName":"Order","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Order Time","type":"string","display":true,"required":false,"displayName":"Order Time","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Order Date","type":"string","display":true,"required":false,"displayName":"Order Date","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit?usp=drivesdk","cachedResultName":"Restaurant Orders"}},"typeVersion":4.5},{"id":"486eb607-db75-4ef5-b5dc-9d73b4e9c7e1","name":"Send Confirmation","type":"n8n-nodes-base.telegram","position":[8864,3504],"webhookId":"confirm-new-01","parameters":{"text":"={{ $('Build Order Response').first().json.reply }}","chatId":"={{ $('Build Order Response').first().json.chat_id }}","additionalFields":{}},"typeVersion":1.2},{"id":"8263cbdb-1615-4eb6-aca4-be09ed515d54","name":"Find Order to Cancel","type":"n8n-nodes-base.googleSheets","position":[8144,3792],"parameters":{"options":{"returnFirstMatch":true},"filtersUI":{"values":[{"lookupValue":"={{ $json.queue_match }}","lookupColumn":"Queue Number"}]},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit?usp=drivesdk","cachedResultName":"Restaurant Orders"}},"executeOnce":false,"retryOnFail":false,"typeVersion":4.5,"alwaysOutputData":false},{"id":"40e8a6e7-9c83-4fbe-8cd5-5a5f7a9a009b","name":"Validate Cancel","type":"n8n-nodes-base.code","position":[8384,3792],"parameters":{"jsCode":"\nconst routeData = $('Route Message').first().json;\nconst orderRow = $input.first().json;\nconst queueNum = routeData.queue_match;\nconst chatId = String(routeData.chat_id);\nconst hasData = orderRow && (orderRow['Queue Number'] || orderRow['Order']);\nif (!hasData) {\n  return [{ json: { chat_id: chatId, reply: `❌ Order #${queueNum} not found.\\n\\nPlease check the queue number and try again.`, can_cancel: false }}];\n}\nconst currentStatus = orderRow['Status'] || 'Unknown';\nconst orderItems = orderRow['Order'] || 'your order';\nconst orderChatId = String(orderRow['Chat ID'] || '');\nif (orderChatId !== chatId) {\n  return [{ json: { chat_id: chatId, reply: `❌ You can only cancel your own orders.`, can_cancel: false }}];\n}\nif (currentStatus === 'Completed') {\n  return [{ json: { chat_id: chatId, reply: `⚠️ Order #${queueNum} is already *Completed*.\\n\\n📋 Order: ${orderItems}\\n\\nCompleted orders cannot be cancelled.`, can_cancel: false }}];\n}\nif (currentStatus === 'Cancelled') {\n  return [{ json: { chat_id: chatId, reply: `⚠️ Order #${queueNum} is already *Cancelled*.`, can_cancel: false }}];\n}\nif (currentStatus === 'Ready') {\n  return [{ json: { chat_id: chatId, reply: `⚠️ Order #${queueNum} is *Ready for collection*!\\n\\n📋 Order: ${orderItems}\\n\\nPlease collect your order from the counter 😊`, can_cancel: false }}];\n}\nif (currentStatus === 'Preparing') {\n  return [{ json: { chat_id: chatId, reply: `⚠️ Order #${queueNum} is currently being *Prepared*.\\n\\n📋 Order: ${orderItems}\\n\\nUnfortunately it cannot be cancelled at this stage.`, can_cancel: false }}];\n}\nreturn [{ json: {\n  chat_id: chatId,\n  reply: `✅ Order #${queueNum} has been *cancelled*.\\n\\n📋 Order: ${orderItems}\\n\\nWe're sorry for any inconvenience.`,\n  can_cancel: true, queue_number: String(queueNum), order_items: orderItems\n}}];\n"},"typeVersion":2},{"id":"cdd711a0-62c7-4502-bf33-0bc8a153d279","name":"Can Cancel?","type":"n8n-nodes-base.if","position":[8624,3792],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cc1","operator":{"type":"boolean","operation":"equals","rightType":"boolean"},"leftValue":"={{ $json.can_cancel }}","rightValue":true}]}},"typeVersion":2.1},{"id":"20d2f37c-e3f2-4287-99d3-e9455c6f5ad2","name":"Mark as Cancelled","type":"n8n-nodes-base.googleSheets","position":[8864,3712],"parameters":{"columns":{"value":{"Status":"=Cancelled","Queue Number":"={{ $('Validate Cancel').first().json.queue_number }}"},"schema":[{"id":"Queue Number","type":"string","display":true,"required":false,"displayName":"Queue Number","defaultMatch":true,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":false}],"mappingMode":"defineBelow","matchingColumns":["Queue Number"]},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit?usp=drivesdk","cachedResultName":"Restaurant Orders"}},"typeVersion":4.5},{"id":"49a0e6bc-c4dc-4e81-ae52-f842ba6a3e5c","name":"Send Cancel Reply","type":"n8n-nodes-base.telegram","position":[8864,3920],"webhookId":"cancel-reply-new-01","parameters":{"text":"={{ $('Validate Cancel').first().json.reply }}","chatId":"={{ $('Validate Cancel').first().json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"0922b378-6b25-4657-8f07-5d6966d7fd74","name":"Find Order Status","type":"n8n-nodes-base.googleSheets","position":[8144,4032],"parameters":{"options":{"returnFirstMatch":true},"filtersUI":{"values":[{"lookupValue":"={{ $json.queue_match }}","lookupColumn":"Queue Number"}]},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit?usp=drivesdk","cachedResultName":"Restaurant Orders"}},"typeVersion":4.5},{"id":"f2a8feb2-7bcd-4df2-b10b-ef6dc8dd1cf6","name":"Build Status Reply","type":"n8n-nodes-base.code","position":[8384,4032],"parameters":{"jsCode":"\nconst routeData = $('Route Message').first().json;\nconst orderRow = $input.first().json;\nconst queueNum = routeData.queue_match;\nconst hasData = orderRow && (orderRow['Queue Number'] || orderRow['Order']);\nif (!hasData) {\n  return [{ json: { chat_id: String(routeData.chat_id), reply: `❌ Order #${queueNum} not found.\\n\\nPlease check the queue number and try again.` } }];\n}\nconst status = orderRow['Status'] || 'Unknown';\nconst orderItems = orderRow['Order'] || 'Unknown order';\nconst name = orderRow['Name'] || '';\nconst orderTime = orderRow['Order Time'] || '';\nconst emojiMap = { 'Completed': '✅', 'Cancelled': '❌', 'Pending': '⏳', 'Ready': '🍕', 'Preparing': '👨‍🍳' };\nconst emoji = emojiMap[status] || '📋';\nlet timeStr = '';\nif (orderTime) {\n  try {\n    const d = new Date(orderTime);\n    timeStr = `\\n🕐 Ordered: ${d.toLocaleTimeString('en-IN', {hour:'2-digit', minute:'2-digit'})}`;\n  } catch(e) {}\n}\nconst reply = `${emoji} *Order #${queueNum}*\\n\\n📋 Order: ${orderItems}\\n📊 Status: *${status}*${timeStr}${name ? '\\n👤 Name: ' + name : ''}`;\nreturn [{ json: { chat_id: String(routeData.chat_id), reply } }];\n"},"typeVersion":2},{"id":"63503809-fd44-4f47-9e30-4d925f834750","name":"Send Status","type":"n8n-nodes-base.telegram","position":[8624,4032],"webhookId":"status-new-01","parameters":{"text":"={{ $json.reply }}","chatId":"={{ $json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"e57c63eb-94ba-48e9-922f-fb1f3a73b23e","name":"Send Menu","type":"n8n-nodes-base.telegram","position":[8144,4240],"webhookId":"menu-new-01","parameters":{"text":"=🍕 *Today's Menu*\n\n*Pizza*\n• Margherita — ₹299\n• Pepperoni — ₹349\n• Veggie Supreme — ₹329\n\n*Burgers*\n• Classic Beef — ₹249\n• Chicken Crispy — ₹229\n• Veggie Delight — ₹199\n\n*Drinks*\n• Coke / Pepsi — ₹79\n• Fresh Juice — ₹99\n• Water — ₹29\n\n_Just type your order to place it\\!_","chatId":"={{ $('Route Message').first().json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"ace66359-2499-4716-8405-85252b0e51c4","name":"Read All Orders","type":"n8n-nodes-base.googleSheets","position":[8144,4400],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit?usp=drivesdk","cachedResultName":"Restaurant Orders"}},"typeVersion":4.5},{"id":"45aadc39-9aae-4166-b100-76924bcb09b4","name":"Build My Orders","type":"n8n-nodes-base.code","position":[8384,4400],"parameters":{"jsCode":"\nconst routeData = $('Route Message').first().json;\nconst allRows = $input.all();\nconst myChatId = String(routeData.chat_id);\nconst myOrders = allRows.filter(r => String(r.json['Chat ID'] || '') === myChatId).slice(-5).reverse();\nif (myOrders.length === 0) {\n  return [{ json: { chat_id: myChatId, reply: \"📋 You have no orders yet.\\n\\nJust type your order to get started!\\nType /menu to see what we offer.\" } }];\n}\nconst emojiMap = { 'Completed': '✅', 'Cancelled': '❌', 'Pending': '⏳', 'Ready': '🍕', 'Preparing': '👨‍🍳' };\nlet reply = `📋 *Your Recent Orders:*\\n\\n`;\nfor (const r of myOrders) {\n  const row = r.json;\n  const status = row['Status'] || 'Unknown';\n  const emoji = emojiMap[status] || '📋';\n  reply += `${emoji} *#${row['Queue Number']}* — ${row['Order']}\\n   ${status} | ${row['Order Date'] || ''}\\n\\n`;\n}\nreturn [{ json: { chat_id: myChatId, reply } }];\n"},"typeVersion":2},{"id":"f1dbb23a-aa98-40f0-b41b-b5cb7edfb421","name":"Send My Orders","type":"n8n-nodes-base.telegram","position":[8624,4400],"webhookId":"myorders-new-01","parameters":{"text":"={{ $json.reply }}","chatId":"={{ $json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"2cd124c8-cefa-4bad-abac-d149ecbde775","name":"Send Blocked Message","type":"n8n-nodes-base.telegram","position":[8144,4560],"webhookId":"blocked-new-01","parameters":{"text":"=🚫 Staff commands are not available here.\n\nOrders are managed by restaurant staff via their dashboard.\n\nYou will be *automatically notified* when your order status changes\\!","chatId":"={{ $('Route Message').first().json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"ff90e51e-be1b-46e6-8ac1-7bd40e993c7b","name":"Every 1 Minute","type":"n8n-nodes-base.scheduleTrigger","position":[7072,5072],"parameters":{"rule":{"interval":[{"field":"minutes","minutesInterval":1}]}},"typeVersion":1.2},{"id":"6645a964-f1a8-48c3-9613-d731670735d9","name":"Read All Rows","type":"n8n-nodes-base.googleSheets","position":[7520,5072],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/edit?usp=drivesdk","cachedResultName":"Restaurant Orders"}},"typeVersion":4.5},{"id":"18387888-c225-4294-b150-b1f7fc5a296b","name":"Detect Changed Row","type":"n8n-nodes-base.code","position":[7712,5072],"parameters":{"mode":"runOnceForEachItem","jsCode":"\nconst row = $input.item.json;\nconst rowNum    = row['row_number'];\nconst queueNum  = String(row['Queue Number']      || '').trim();\nconst chatId    = String(row['Chat ID']           || '').trim();\nconst status    = String(row['Status']            || '').trim();\nconst lastSent  = String(row['Last Status Sent']  || '').trim();\nconst order     = String(row['Order']             || '').trim();\nconst name      = String(row['Name']              || '').trim();\n\n// Skip empty rows\nif (!queueNum || !chatId || chatId === '0') return null;\n\n// Skip Pending — only notify on staff-set statuses\nconst notifiable = ['Preparing', 'Ready', 'Completed', 'Cancelled'];\nif (!notifiable.includes(status)) return null;\n\n// THE KEY CHECK: only notify if status is different from last time we sent\nif (status === lastSent) return null;\n\nconsole.log(`Row ${rowNum} | Queue #${queueNum} | ${lastSent||'(none)'} → ${status} ✅ SEND`);\n\nreturn { json: { row_number: rowNum, queue_number: queueNum, chat_id: chatId, status, order, name } };\n"},"typeVersion":2},{"id":"9a0f7416-4e20-432c-aada-f32e197c73cb","name":"Build Message","type":"n8n-nodes-base.code","position":[8048,5072],"parameters":{"mode":"runOnceForEachItem","jsCode":"\nconst d = $input.item.json;\nconst msgs = {\n  'Preparing': `👨‍🍳 Your order is being *Prepared*!\\n\\n📋 Order: ${d.order}\\n🔢 Queue: #${d.queue_number}\\n\\nWe'll notify you when it's ready!`,\n  'Ready':     `🍕 Your order is *READY*!\\n\\n📋 Order: ${d.order}\\n🔢 Queue: #${d.queue_number}\\n\\nPlease collect from the counter 😊`,\n  'Completed': `✅ Order #${d.queue_number} *Completed*.\\n\\nThank you! 🙏`,\n  'Cancelled': `❌ Order #${d.queue_number} *Cancelled*.\\n\\n📋 Order: ${d.order}\\n\\nSorry for the inconvenience.`\n};\nreturn { json: { ...d, msg: msgs[d.status] } };\n"},"typeVersion":2},{"id":"d76b83de-7bfb-4826-a0ea-f15e70c90e32","name":"Send to Customer","type":"n8n-nodes-base.telegram","position":[8320,5072],"webhookId":"staff-tg-final-01","parameters":{"text":"={{ $json.msg }}","chatId":"={{ $json.chat_id }}","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.2},{"id":"7103c954-2c79-4f25-b504-ada9c87b5cbd","name":"Prep Sheet Update","type":"n8n-nodes-base.code","position":[8624,5072],"parameters":{"mode":"runOnceForEachItem","jsCode":"\nconst d = $('Build Message').item.json;\nconst rowNum = d.row_number;\nconst status = d.status;\n// Column H = Last Status Sent (8th column = H)\nconst range = `Sheet1!H${rowNum}`;\nconst url   = `https://sheets.googleapis.com/v4/spreadsheets/1_XaI7z844arJWhzMN2MbD6kFzHoK6yUvsY1OyE10ebM/values/${encodeURIComponent(range)}?valueInputOption=RAW`;\nconsole.log(`Writing H${rowNum} = \"${status}\"`);\nreturn { json: { ...d, _url: url, _body: { range, majorDimension:'ROWS', values:[[status]] } } };\n"},"typeVersion":2},{"id":"f77ce233-ea53-4ac2-8996-7f99007fb981","name":"Save Last Status Sent","type":"n8n-nodes-base.httpRequest","position":[8880,5072],"parameters":{"url":"={{ $json._url }}","method":"PUT","options":{},"jsonBody":"={{ JSON.stringify($json._body) }}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"googleSheetsOAuth2Api"},"typeVersion":4.2},{"id":"e054be03-1337-432d-bd9e-bd2c846efd1c","name":"W1 Title","type":"n8n-nodes-base.stickyNote","position":[6496,3120],"parameters":{"width":804,"height":300,"content":"## 🍕 WORKFLOW 1 — Customer Bot\n**Telegram bot for customers to place and manage orders**\n\n**Bot:** @new_nirav_restaurant_bot\n**Sheet:** Restaurant Orders (1_XaI7z844...)\n\n**How it works:**\nCustomer texts the bot → Route Message detects what they want → routes to correct handler"},"typeVersion":1},{"id":"a5449eb9-3145-420e-8bb2-b2e0797ab403","name":"Entry Note","type":"n8n-nodes-base.stickyNote","position":[6496,3520],"parameters":{"color":5,"width":972,"height":228,"content":"## 📥 Entry Point\nListens to ALL messages from the customer bot.\n\nExtracts: chat_id, text, first_name\nDetects commands: /start, /help, /menu, /myorders, STATUS, CANCEL\nDefault route = **order** (food order)"},"typeVersion":1},{"id":"b38ffb11-4d73-4bb8-905e-b590eceb7a8a","name":"Switch Note","type":"n8n-nodes-base.stickyNote","position":[7504,3184],"parameters":{"color":5,"width":260,"height":620,"content":"## 🔀 Message Router\nRoutes to one of 8 paths:\n0. /start → Welcome message\n1. /help → Help message\n2. order → AI Parse Order\n3. cancel → Cancel flow\n4. status → Status check\n5. /menu → Menu\n6. /myorders → Order history\n7. blocked → Staff cmd blocked"},"typeVersion":1},{"id":"f5f89365-aeab-4733-9a8c-a9d810d482a1","name":"AI Note","type":"n8n-nodes-base.stickyNote","position":[7824,3440],"parameters":{"color":6,"width":580,"height":328,"content":"## 🤖 AI Order Parsing\nUses **Claude Haiku** to parse natural language orders.\n\nInput: \"2 pizza + 1 coke\"\nOutput: \n`{\n\"items\": \"2 Margherita Pizza + 1 Coke\", \n\"valid\": true\n}`\n\nIf not a food order → returns valid:\nfalse → sends error message to customer"},"typeVersion":1},{"id":"98c8c7aa-2136-40b3-ab1d-ce7615191312","name":"Save Note","type":"n8n-nodes-base.stickyNote","position":[8592,3264],"parameters":{"color":6,"width":476,"height":388,"content":"## 💾 Save Order\nAppends new order to Google Sheet with:\n- Queue Number (auto-generated)\n- Chat ID (for later notifications)\n- Name, Order, Status=Pending\n- Order Time, Order Date\n\n⚠️ Column H (Last Status Sent) stays empty — filled by W2"},"typeVersion":1},{"id":"a40ee7cf-998d-4e1a-883a-8896b6cfd8c7","name":"Cancel Note","type":"n8n-nodes-base.stickyNote","position":[9040,3664],"parameters":{"color":3,"width":300,"height":396,"content":"## ❌ Cancel Flow\nValidation rules:\n✅ Pending → can cancel\n🚫 Preparing → cannot cancel\n🚫 Ready → cannot cancel\n🚫 Completed → cannot cancel\n🚫 Cancelled → already cancelled\n🚫 Other person's order → blocked\n\nIf valid → updates sheet Status to Cancelled"},"typeVersion":1},{"id":"af8df331-4b48-4e85-a69e-19ab93bd7258","name":"Status Note","type":"n8n-nodes-base.stickyNote","position":[7584,3984],"parameters":{"color":5,"width":1208,"height":176,"content":"## 📊 Order Status Check\nCustomer types: STATUS 6771\n→ Looks up Queue Number in sheet\n→ Returns current status with emoji:\n⏳ Pending  👨‍🍳 Preparing\n🍕 Ready   ✅ Completed  ❌ Cancelled"},"typeVersion":1},{"id":"ec51a4e6-05d4-46c7-916a-bfa2ed0472d6","name":"MyOrders Note","type":"n8n-nodes-base.stickyNote","position":[7584,4384],"parameters":{"color":5,"width":1220,"height":178,"content":"## 📋 My Orders\nShows last 5 orders for this customer.\nFilters all sheet rows by Chat ID.\nDisplays: queue number, order, status, date"},"typeVersion":1},{"id":"d9f18bfc-369e-47d8-9729-64a4aae7dec3","name":"W2 Title","type":"n8n-nodes-base.stickyNote","position":[6512,4752],"parameters":{"width":800,"height":220,"content":"## 👨‍🍳 WORKFLOW 2 — Staff Status Notifier\n**Auto-notifies customers when staff changes order status in Google Sheet**\n\n**How it works:**\nRuns every minute → reads all rows → compares Status vs Last Status Sent (col H)\n\n → sends Telegram message for changed rows only → updates col H"},"typeVersion":1},{"id":"4935ce86-66b7-49b9-8bf5-6251c640adec","name":"Schedule Note","type":"n8n-nodes-base.stickyNote","position":[6512,5024],"parameters":{"color":5,"width":804,"height":236,"content":"## ⏱️ Schedule Trigger\nRuns **every 1 minute**.\n\nCannot use Google Sheets trigger\n\nbecause it cannot detect which specific row changed — it always returns row 1."},"typeVersion":1},{"id":"091c7f32-fada-488c-9d5e-b61ce334e276","name":"Detect Note","type":"n8n-nodes-base.stickyNote","position":[7392,4832],"parameters":{"color":6,"width":540,"height":492,"content":"## 🔍 Detect Changed Row\n**runOnceForEachItem** — processes every row independently.\n\nLogic per row:\n1. Skip if no Queue Number or Chat ID\n2. Skip if Status = Pending (not notifiable)\n3. Skip if Status = Last Status Sent (already notified)\n4. ✅ Pass through if Status changed\n\nOnly changed rows flow forward."},"typeVersion":1},{"id":"a7cda7e8-8935-4796-8179-c83e77944c66","name":"MsgBuild Note","type":"n8n-nodes-base.stickyNote","position":[7984,4832],"parameters":{"color":6,"width":532,"height":496,"content":"## 💬 Message Templates\nBuilds message based on new status:\n👨‍🍳 Preparing → \"Being prepared!\"\n🍕 Ready → \"READY for collection!\"\n✅ Completed → \"Thank you!\"\n❌ Cancelled → \"Order cancelled\""},"typeVersion":1},{"id":"5344c139-6ee8-40d7-83fe-5a53b17fd82d","name":"UpdateH Note","type":"n8n-nodes-base.stickyNote","position":[8560,4832],"parameters":{"color":3,"width":540,"height":488,"content":"## 📝 Update Last Status Sent\nWrites current Status into **column H** (Last Status Sent) of the exact row using Google Sheets HTTP API.\n\nThis prevents duplicate notifications — next minute this row will be skipped because Status = Last Status Sent.\n\n⚠️ Column H must exist in your sheet!"},"typeVersion":1}],"pinData":{},"connections":{"Save Order":{"main":[[{"node":"Send Confirmation","type":"main","index":0}]]},"Can Cancel?":{"main":[[{"node":"Mark as Cancelled","type":"main","index":0}],[{"node":"Send Cancel Reply","type":"main","index":0}]]},"Claude Haiku":{"ai_languageModel":[[{"node":"AI Parse Order","type":"ai_languageModel","index":0}]]},"Build Message":{"main":[[{"node":"Send to Customer","type":"main","index":0}]]},"Read All Rows":{"main":[[{"node":"Detect Changed Row","type":"main","index":0}]]},"Route Message":{"main":[[{"node":"Message Switch","type":"main","index":0}]]},"AI Parse Order":{"main":[[{"node":"Build Order Response","type":"main","index":0}]]},"Every 1 Minute":{"main":[[{"node":"Read All Rows","type":"main","index":0}]]},"Message Switch":{"main":[[{"node":"Send Welcome","type":"main","index":0}],[{"node":"Send Help","type":"main","index":0}],[{"node":"AI Parse Order","type":"main","index":0}],[{"node":"Find Order to Cancel","type":"main","index":0}],[{"node":"Find Order Status","type":"main","index":0}],[{"node":"Send Menu","type":"main","index":0}],[{"node":"Read All Orders","type":"main","index":0}],[{"node":"Send Blocked Message","type":"main","index":0}]]},"Build My Orders":{"main":[[{"node":"Send My Orders","type":"main","index":0}]]},"Read All Orders":{"main":[[{"node":"Build My Orders","type":"main","index":0}]]},"Validate Cancel":{"main":[[{"node":"Can Cancel?","type":"main","index":0}]]},"Send to Customer":{"main":[[{"node":"Prep Sheet Update","type":"main","index":0}]]},"Find Order Status":{"main":[[{"node":"Build Status Reply","type":"main","index":0}]]},"Mark as Cancelled":{"main":[[{"node":"Send Cancel Reply","type":"main","index":0}]]},"Prep Sheet Update":{"main":[[{"node":"Save Last Status Sent","type":"main","index":0}]]},"Build Status Reply":{"main":[[{"node":"Send Status","type":"main","index":0}]]},"Detect Changed Row":{"main":[[{"node":"Build Message","type":"main","index":0}]]},"Build Order Response":{"main":[[{"node":"Save Order","type":"main","index":0}]]},"Find Order to Cancel":{"main":[[{"node":"Validate Cancel","type":"main","index":0}]]},"Customer Bot Listener":{"main":[[{"node":"Route Message","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":43,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.code":{"count":8},"n8n-nodes-base.switch":{"count":1},"n8n-nodes-base.telegram":{"count":9},"n8n-nodes-base.stickyNote":{"count":13},"n8n-nodes-base.httpRequest":{"count":1},"n8n-nodes-base.googleSheets":{"count":6},"@n8n/n8n-nodes-langchain.agent":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"n8n-nodes-base.telegramTrigger":{"count":1},"@n8n/n8n-nodes-langchain.lmChatAnthropic":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Nirav Gajera","username":"niravgajera","bio":"Full-stack Developer | PHP | Laravel | Vue.js | CodeIgniter | Nova | AWS | AI Automation ","verified":true,"links":["https://www.linkedin.com/in/nirav-gajera1/"],"avatar":"https://gravatar.com/avatar/7157fd8f0a74088248a6780d0536d9062ebdfb7cf7ed879b5ccee0b23403095d?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":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":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":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":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":1145,"icon":"file:anthropic.svg","name":"@n8n/n8n-nodes-langchain.lmChatAnthropic","codex":{"data":{"alias":["claude","sonnet","opus"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatanthropic/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"Anthropic Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzdEN0Q4NyIgZD0iTTMyLjczIDBoLTYuOTQ1TDM4LjQ1IDMyaDYuOTQ1ek0xMi42NjUgMCAwIDMyaDcuMDgybDIuNTktNi43MmgxMy4yNWwyLjU5IDYuNzJoNy4wODJMMTkuOTI5IDB6bS0uNzAyIDE5LjMzNyA0LjMzNC0xMS4yNDYgNC4zMzQgMTEuMjQ2eiIvPjwvc3ZnPg=="},"displayName":"Anthropic Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":40,"name":"Support Chatbot"},{"id":47,"name":"AI Chatbot"}],"image":[]}}