AutomationFlowsAI & RAG › Run a Restaurant Concierge Chatbot on Telegram with Openai and Google Sheets

Run a Restaurant Concierge Chatbot on Telegram with Openai and Google Sheets

ByDr. Firas @drfiras on n8n.io

This workflow runs a Telegram-based restaurant concierge that answers menu questions, takes text or voice orders with an OpenAI agent, and saves confirmed orders to Google Sheets, then follows up with an automated review request and sends a daily marketing broadcast to active…

Event trigger★★★★☆ complexityAI-powered29 nodesTelegram TriggerGoogle SheetsTelegramAgentOpenAI ChatMemory Buffer WindowGoogle Sheets ToolOpenAI
AI & RAG Trigger: Event Nodes: 29 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #17768 — we link there as the canonical source.

This workflow follows the Agent → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "RZhJqhVS7PZWw6MW",
  "meta": {
    "builderVariant": "mcp",
    "aiBuilderAssisted": true
  },
  "name": "Run a restaurant AI concierge on Telegram with order taking and upsells",
  "tags": [],
  "nodes": [
    {
      "id": "f589744c-916b-4396-83bc-b3433973ca4f",
      "name": "Receive Telegram Message",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -1200,
        208
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "645ea173-e63b-4eb0-94eb-55289bbbc527",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        -944,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cfg-1",
              "name": "restaurant_name",
              "type": "string",
              "value": "Your Restaurant"
            },
            {
              "id": "cfg-2",
              "name": "menu_link",
              "type": "string",
              "value": "https://go.forkmenu.com/demo"
            },
            {
              "id": "cfg-3",
              "name": "review_link",
              "type": "string",
              "value": "https://search.google.com/local/writereview?placeid=xxx"
            },
            {
              "id": "cfg-4",
              "name": "openai_model",
              "type": "string",
              "value": "gpt-5-mini"
            },
            {
              "id": "cfg-5",
              "name": "upsell_instruction",
              "type": "string",
              "value": "Always propose exactly one relevant add-on (a drink, side, or dessert) that pairs well with the current order before confirming it, unless the customer already added one or clearly declines."
            },
            {
              "id": "cfg-6",
              "name": "review_wait_hours",
              "type": "number",
              "value": 2
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "b46c9833-7e52-4dd1-98b6-ef00901022a6",
      "name": "Log New Client",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -624,
        656
      ],
      "parameters": {
        "columns": {
          "value": {
            "DATE": "={{ $now.format(\"yyyy-LL-dd\") }}",
            "NAME": "={{ $json.message.from.first_name }}",
            "CLIENT": "={{ $json.message.from.id }}"
          },
          "schema": [
            {
              "id": "CLIENT",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "CLIENT",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "NAME",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "NAME",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "DATE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "DATE",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "UNSUBSCRIBE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "UNSUBSCRIBE",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "CLIENT"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Clients"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Restaurant AI Concierge Data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "71e52eab-928b-47c9-83df-2400c094dffe",
      "name": "Wait Before Review Request",
      "type": "n8n-nodes-base.wait",
      "position": [
        -352,
        672
      ],
      "parameters": {
        "unit": "hours",
        "amount": "={{ $('Configuration').item.json.review_wait_hours }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "922f1242-0b42-4583-9a07-04cfeae58960",
      "name": "Send Review Request",
      "type": "n8n-nodes-base.telegram",
      "position": [
        160,
        672
      ],
      "parameters": {
        "text": "={{ 'We hope you enjoyed your experience at ' + $('Configuration').item.json.restaurant_name + '! Please consider leaving us a review: ' + $('Configuration').item.json.review_link }}",
        "chatId": "={{ $('Receive Telegram Message').item.json.message.chat.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f183c76b-2b7b-4be5-8719-d82b3d679e27",
      "name": "Prepare Chat Context",
      "type": "n8n-nodes-base.set",
      "position": [
        -640,
        464
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ctx-1",
              "name": "chat_id",
              "type": "string",
              "value": "={{ $json.message.chat.id }}"
            },
            {
              "id": "ctx-2",
              "name": "customer_name",
              "type": "string",
              "value": "={{ $json.message.from.first_name }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "e8d7053a-3153-4b29-9613-6860907a2ea6",
      "name": "Route By Message Type",
      "type": "n8n-nodes-base.switch",
      "position": [
        -368,
        320
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Text",
              "conditions": {
                "options": {
                  "version": 1,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.text }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Voice",
              "conditions": {
                "options": {
                  "version": 1,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.voice.file_id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra",
          "renameFallbackOutput": "Unsupported"
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "07041948-7bbe-451c-9038-e101dfcb4303",
      "name": "Format Text Input",
      "type": "n8n-nodes-base.set",
      "position": [
        -16,
        304
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "fmt-1",
              "name": "user_message",
              "type": "string",
              "value": "={{ $json.message.text }}"
            },
            {
              "id": "fmt-2",
              "name": "input_channel",
              "type": "string",
              "value": "text"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "ee434c02-6f69-4772-bd36-d97d14232d1d",
      "name": "Restaurant AI Concierge",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        704,
        304
      ],
      "parameters": {
        "text": "={{ $json.user_message }}",
        "options": {
          "maxIterations": 10,
          "systemMessage": "=You are the friendly AI concierge for {{ $json.restaurant_name }}, chatting with customers on Telegram.\nCustomer name: {{ $json.customer_name }}\nDigital menu link (share only if asked for a link, otherwise use the Look Up Menu tool for items/prices): {{ $json.menu_link }}\n\nYour job:\n1. Answer questions about the menu using the \"Look Up Menu And Prices\" tool, never invent dishes or prices.\n2. Help the customer build an order conversationally, confirming items and quantities as you go.\n3. Upsell instruction: {{ $json.upsell_instruction }}\n4. Once the customer confirms the full order (including the upsell decision), call \"Save Customer Order\" exactly once, then send a short friendly confirmation with the total.\n5. Keep replies short, warm, and in the same language the customer is writing in.",
          "passthroughBinaryImages": false
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "308aac49-6ecf-4969-84fd-826d19657478",
      "name": "OpenAI Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        640,
        592
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Configuration').item.json.openai_model }}"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "66b771f9-ee0e-46b5-92d7-16983b0d102b",
      "name": "Conversation Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        784,
        576
      ],
      "parameters": {
        "sessionKey": "={{ $('Receive Telegram Message').item.json.message.chat.id }}",
        "sessionIdType": "customKey",
        "contextWindowLength": 10
      },
      "typeVersion": 1.4
    },
    {
      "id": "a61583cb-7d24-4bcc-bddf-5628ba389001",
      "name": "Look Up Menu And Prices",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        928,
        560
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Menu"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Restaurant AI Concierge Data"
        },
        "descriptionType": "manual",
        "toolDescription": "Look up the restaurant's current menu items, descriptions, and prices. Call this before answering any menu question and before helping the customer build an order, so item names, availability, and prices stay accurate."
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "0140257e-78f7-48d1-be3d-e5573ffec7b2",
      "name": "Save Customer Order",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        1088,
        576
      ],
      "parameters": {
        "columns": {
          "value": {
            "CHAT_ID": "={{ $('Receive Telegram Message').item.json.message.chat.id }}",
            "ORDER_DATE": "={{ $now.toISO() }}",
            "ORDER_ITEMS": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('order_items', 'A short human-readable summary of every confirmed item and quantity, e.g. \"2x Margherita Pizza, 1x Tiramisu, 1x Coke\". Include the accepted upsell item if any.') }}",
            "ORDER_TOTAL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('order_total', 'Total price of the order as a plain number string (e.g. \"24.50\"), summing the menu prices of every confirmed item including any accepted upsell.') }}",
            "CUSTOMER_NAME": "={{ $('Receive Telegram Message').item.json.message.from.first_name }}",
            "UPSELL_OFFERED": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('upsell_offered', 'The upsell item you suggested during this order and whether the customer accepted it (e.g. \"Tiramisu - accepted\"), or \"none\" if no upsell was offered.') }}"
          },
          "schema": [
            {
              "id": "CHAT_ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "CHAT_ID",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "CUSTOMER_NAME",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "CUSTOMER_NAME",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "ORDER_ITEMS",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ORDER_ITEMS",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "UPSELL_OFFERED",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "UPSELL_OFFERED",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "ORDER_TOTAL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ORDER_TOTAL",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "ORDER_DATE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ORDER_DATE",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Orders"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Restaurant AI Concierge Data"
        },
        "descriptionType": "manual",
        "toolDescription": "Records a finalized customer order in the restaurant Orders spreadsheet. Call this only once the customer has confirmed their complete order, including your upsell suggestion (accepted or declined). Do not call this while the order is still being discussed or changed."
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "bfe46b83-f664-4a95-80e9-d92ec679c291",
      "name": "Send Agent Reply",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1072,
        304
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "chatId": "={{ $('Receive Telegram Message').item.json.message.chat.id }}",
        "additionalFields": {
          "parse_mode": "Markdown",
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3b9a28d5-a67e-4c55-84f4-b1f69c83c1fe",
      "name": "Get Voice File",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -96,
        464
      ],
      "parameters": {
        "fileId": "={{ $('Receive Telegram Message').item.json.message.voice.file_id }}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9a3c0bf5-87f4-4af8-afa9-87a740aef187",
      "name": "Transcribe Voice Message",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        160,
        464
      ],
      "parameters": {
        "options": {},
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "332511f5-9c06-44e1-a306-febb8be67205",
      "name": "Format Voice Input",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        464
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "fmtv-1",
              "name": "user_message",
              "type": "string",
              "value": "={{ $json.text }}"
            },
            {
              "id": "fmtv-2",
              "name": "input_channel",
              "type": "string",
              "value": "voice"
            },
            {
              "id": "fmtv-3",
              "name": "restaurant_name",
              "type": "string",
              "value": "={{ $('Prepare Chat Context').item.json.restaurant_name }}"
            },
            {
              "id": "fmtv-4",
              "name": "menu_link",
              "type": "string",
              "value": "={{ $('Prepare Chat Context').item.json.menu_link }}"
            },
            {
              "id": "fmtv-5",
              "name": "upsell_instruction",
              "type": "string",
              "value": "={{ $('Prepare Chat Context').item.json.upsell_instruction }}"
            },
            {
              "id": "fmtv-6",
              "name": "customer_name",
              "type": "string",
              "value": "={{ $('Prepare Chat Context').item.json.customer_name }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "3b788f4b-d760-4560-a7d9-7717f1a29144",
      "name": "Send Unsupported Message Reply",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -96,
        656
      ],
      "parameters": {
        "text": "Sorry, I can only understand text or voice messages for now. Please type your question or send a voice note.",
        "chatId": "={{ $json.message.chat.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b87e4e27-3894-4413-9a59-ce500aec526a",
      "name": "Daily Marketing Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1184,
        1040
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "8fc0be04-6ed1-4cf0-a073-baebc0ac7df5",
      "name": "Get Todays Marketing Campaign",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -928,
        1040
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "DONE"
            },
            {
              "lookupValue": "={{ $now.format(\"yyyy-LL-dd\") }}",
              "lookupColumn": "DATE"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Marketing"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Restaurant AI Concierge Data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "44f38d12-f416-4a2e-a10c-c28394059ff0",
      "name": "Get Active Clients",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -688,
        1040
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "UNSUBSCRIBE"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Clients"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Restaurant AI Concierge Data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.7
    },
    {
      "id": "7a92f062-788c-4982-a717-20deb430b8e0",
      "name": "Mark Campaign As Done",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -160,
        1008
      ],
      "parameters": {
        "columns": {
          "value": {
            "DONE": "x",
            "row_number": "={{ $('Get Todays Marketing Campaign').first().json.row_number }}"
          },
          "schema": [
            {
              "id": "DONE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "DONE",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Marketing"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Restaurant AI Concierge Data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "de54c72e-9699-46a9-a364-f0486238df2c",
      "name": "Send Marketing Message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        48,
        1056
      ],
      "parameters": {
        "text": "={{ $('Get Todays Marketing Campaign').first().json.MESSAGE }}",
        "chatId": "={{ $json.CLIENT }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1f0f47a4-0f02-4c64-b029-f5894984242c",
      "name": "Loop Over Clients",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -432,
        1040
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "83ca9b17-4bd7-464a-9fd5-4a26e3c2c29c",
      "name": "Sticky Note 583d557f",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2336,
        176
      ],
      "parameters": {
        "color": 4,
        "width": 932,
        "height": 1812,
        "content": "# Run a restaurant AI concierge on Telegram with order taking and upsells\n# \ud83d\udce5  [Open full documentation on Notion](https://automatisation.notion.site/Course-Run-a-restaurant-AI-concierge-on-Telegram-with-order-taking-and-upsells-39f3d6550fd98183a4bed525186ed945)\n\n## How it works\nA Telegram bot answers customer questions, reads text or voice messages, looks up your live menu, takes orders conversationally, always proposes one relevant upsell, and saves confirmed orders to Google Sheets. New chats are logged as clients and get an automatic review request 2 hours later. A separate daily schedule sends your Marketing sheet campaigns to active (non-unsubscribed) clients.\n\n## Setup\n1. Create a Telegram bot via @BotFather, connect the API token to a Telegram credential and select it on every Telegram node.\n2. Create a Google Sheet with 4 tabs: Clients (CLIENT, NAME, DATE, UNSUBSCRIBE), Marketing (DATE, MESSAGE, DONE), Menu (ITEM, DESCRIPTION, PRICE), Orders (CHAT_ID, CUSTOMER_NAME, ORDER_ITEMS, UPSELL_OFFERED, ORDER_TOTAL, ORDER_DATE). Select this same spreadsheet on every Google Sheets node.\n3. Connect your OpenAI credential on the OpenAI Model and Transcribe Voice Message nodes.\n4. Edit the \"Configuration\" node: restaurant name, menu link, review link, OpenAI model, upsell instruction, review wait delay.\n5. Activate the workflow.\n\n## Requirements\n- A Telegram bot token\n- An OpenAI API key (for the concierge agent and voice transcription)\n- A Google account with Sheets access\n\n## Customization\nAdd columns to the Menu tab (allergens, categories) and mention them in the system prompt. Adjust the upsell_instruction in Configuration to match your house specials. Add a \"last review sent\" column to the Clients tab if you want to stop repeat review requests.\n\nNeed help customizing?\nContact me for consulting and support : [Linkedin](https://www.linkedin.com/in/doctor-firass/)\n\n# MY NEW YOUTUBE CHANNEL\n\ud83d\udc49 [Subscribe to my new YouTube channel](https://www.youtube.com/@DrFiras_AI). Here I will share videos and Shorts with practical tutorials and FREE templates for n8n.\n\n[![The AI Doctor](https://www.dr-firas.com/the-ai-doctor.png)](https://www.youtube.com/@DrFiras_AI)"
      },
      "typeVersion": 1
    },
    {
      "id": "b16448db-310f-417e-910b-ba161a377618",
      "name": "Sticky Note d8688444",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 500,
        "height": 260,
        "content": "## STEP 1 - Configuration\nAll editable settings live here: restaurant name, menu/review links, OpenAI model, upsell instruction, review delay. Used by both the Telegram bot and the daily marketing schedule."
      },
      "typeVersion": 1
    },
    {
      "id": "2bab9f80-a3f2-439a-b417-ebeb828a5a4b",
      "name": "Sticky Note 80fd6b38",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 1772,
        "height": 348,
        "content": "## STEP 2 - AI Concierge Chat\nRoutes text and voice messages to the same conversational agent. Voice is transcribed with OpenAI Whisper first. The agent looks up the menu, takes the order, always proposes one upsell, then saves the order to Google Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "01339266-6536-4d9c-8c02-dd0fe3292376",
      "name": "Sticky Note 056d79ce",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        928
      ],
      "parameters": {
        "color": 7,
        "width": 500,
        "height": 172,
        "content": "## STEP 3 - Client Logging and Review Request\nEvery message logs the customer to the Clients tab, then waits (default 2h) before sending a review request link."
      },
      "typeVersion": 1
    },
    {
      "id": "2b99b755-8c03-4748-83f7-2360170f5b54",
      "name": "Sticky Note b625c6a2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 1180,
        "height": 320,
        "content": "## STEP 4 - Daily Marketing Broadcast\nEach day, reads today's campaign row from the Marketing tab and sends it to every active (non-unsubscribed) client, then marks the campaign done."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": true,
    "executionOrder": "v1"
  },
  "versionId": "46fdd5ec-6e5e-48f2-afaf-055f80db758e",
  "nodeGroups": [],
  "connections": {
    "OpenAI Model": {
      "ai_languageModel": [
        [
          {
            "node": "Restaurant AI Concierge",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Configuration": {
      "main": [
        [
          {
            "node": "Log New Client",
            "type": "main",
            "index": 0
          },
          {
            "node": "Prepare Chat Context",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Todays Marketing Campaign",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Voice File": {
      "main": [
        [
          {
            "node": "Transcribe Voice Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log New Client": {
      "main": [
        [
          {
            "node": "Wait Before Review Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Text Input": {
      "main": [
        [
          {
            "node": "Restaurant AI Concierge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Clients": {
      "main": [
        [
          {
            "node": "Mark Campaign As Done",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Marketing Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Voice Input": {
      "main": [
        [
          {
            "node": "Restaurant AI Concierge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Active Clients": {
      "main": [
        [
          {
            "node": "Loop Over Clients",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Conversation Memory": {
      "ai_memory": [
        [
          {
            "node": "Restaurant AI Concierge",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Save Customer Order": {
      "ai_tool": [
        [
          {
            "node": "Restaurant AI Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Chat Context": {
      "main": [
        [
          {
            "node": "Route By Message Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route By Message Type": {
      "main": [
        [
          {
            "node": "Format Text Input",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Voice File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Unsupported Message Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Marketing Message": {
      "main": [
        [
          {
            "node": "Loop Over Clients",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Look Up Menu And Prices": {
      "ai_tool": [
        [
          {
            "node": "Restaurant AI Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Restaurant AI Concierge": {
      "main": [
        [
          {
            "node": "Send Agent Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Marketing Schedule": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Telegram Message": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe Voice Message": {
      "main": [
        [
          {
            "node": "Format Voice Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Before Review Request": {
      "main": [
        [
          {
            "node": "Send Review Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Todays Marketing Campaign": {
      "main": [
        [
          {
            "node": "Get Active Clients",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow runs a Telegram-based restaurant concierge that answers menu questions, takes text or voice orders with an OpenAI agent, and saves confirmed orders to Google Sheets, then follows up with an automated review request and sends a daily marketing broadcast to active…

Source: https://n8n.io/workflows/17768/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

BoomerBobBot.TP. Uses agent, telegramTrigger, telegram, memoryBufferWindow. Event-driven trigger; 95 nodes.

Agent, Telegram Trigger, Telegram +10
AI & RAG

Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

Personal Assistant. Uses memoryBufferWindow, agent, agentTool, httpRequestTool. Event-driven trigger; 77 nodes.

Memory Buffer Window, Agent, Agent Tool +15
AI & RAG

Digital marketers, content creators, social media managers, and businesses who want to use AI marketing automation for YouTube Shorts without spending hours on production. This AI workflow helps anyon

OpenAI, HTTP Request, OpenAI Chat +7
AI & RAG

Jarvis is a powerful multi-agent productivity assistant built in n8n. It works directly from Telegram and can understand both text messages and voice notes.

Telegram Trigger, Telegram, OpenAI +10