AutomationFlowsAI & RAG › Run a Voice-enabled AI Assistant on Telegram with Openai, Gmail and Notion

Run a Voice-enabled AI Assistant on Telegram with Openai, Gmail and Notion

ByDr. Firas @drfiras on n8n.io

This workflow turns a Telegram bot into a personal assistant that handles text and voice messages using OpenAI, can read Gmail and Google Calendar, looks up tasks and contacts in Notion, and can draft and send emails with a required approval step in Telegram. Triggers when a new…

Event trigger★★★★☆ complexityAI-powered22 nodesTelegram TriggerTelegramOpenAIAgentOpenAI ChatMemory Buffer WindowGmail ToolGoogle Calendar Tool
AI & RAG Trigger: Event Nodes: 22 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Gmail Tool 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": "cAnnq47P2I9a2zu5",
  "meta": {
    "builderVariant": "mcp",
    "aiBuilderAssisted": true
  },
  "name": "Nova, your personal AI assistant on Telegram (voice, email and calendar)",
  "tags": [],
  "nodes": [
    {
      "id": "ef44b53a-f8d5-452f-a48f-8d76fd2f7995",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -48,
        48
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "55386d64-4edc-49b2-b021-212beb568051",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        192,
        48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "assistant_name",
              "type": "string",
              "value": "Nova"
            },
            {
              "id": "a2",
              "name": "chat_model",
              "type": "string",
              "value": "gpt-5.4"
            },
            {
              "id": "a3",
              "name": "output_language",
              "type": "string",
              "value": "auto"
            },
            {
              "id": "a4",
              "name": "voice_language",
              "type": "string",
              "value": "fr"
            },
            {
              "id": "a5",
              "name": "memory_window",
              "type": "number",
              "value": 15
            },
            {
              "id": "a6",
              "name": "approver_chat_id",
              "type": "string",
              "value": "={{ $('Telegram Trigger').item.json.message.chat.id }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "5e23a4a3-a221-4348-9381-16a8633a3e1f",
      "name": "Is voice message?",
      "type": "n8n-nodes-base.if",
      "position": [
        432,
        48
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c1",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $('Telegram Trigger').item.json.message.voice.file_id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b40ace66-02cb-492e-985c-ef2b2af9be25",
      "name": "Get voice file",
      "type": "n8n-nodes-base.telegram",
      "position": [
        672,
        -128
      ],
      "parameters": {
        "fileId": "={{ $('Telegram Trigger').item.json.message.voice.file_id }}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "375d3066-0a88-4c7b-9fbe-e3b127967837",
      "name": "Transcribe voice",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        912,
        -128
      ],
      "parameters": {
        "options": {
          "language": "={{ $('Configuration').item.json.voice_language }}"
        },
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "ede37e49-3a5b-4c93-aa63-6a51490737bc",
      "name": "Prepare voice input",
      "type": "n8n-nodes-base.set",
      "position": [
        1152,
        -128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "v1",
              "name": "user_input",
              "type": "string",
              "value": "={{ $('Transcribe voice').item.json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a1afcf35-d03c-4d2c-89db-72eead89f1fa",
      "name": "Nova",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1376,
        -48
      ],
      "parameters": {
        "text": "={{ $json.user_input }}",
        "options": {
          "systemMessage": "=You are {{ $('Configuration').item.json.assistant_name }}, a warm, sharp and concise personal assistant that lives inside Telegram. Today is {{ $now.toFormat('cccc, dd LLLL yyyy') }}.\n\nLanguage: always reply in the SAME language the user wrote in.\n\nYou can use these tools:\n- \"Get recent emails\": read and summarize the inbox.\n- \"Get calendar events\": check the upcoming schedule.\n- \"Get Notion tasks\": read the to-do list.\n- \"Get Notion contacts\": look up a person before emailing them.\n- \"Send email\": compose and send an email. It is gated by a human approval on Telegram, so use it freely and do NOT ask the user to confirm yourself. If the user gives only a name, first look up the email with \"Get Notion contacts\".\n\nStyle: keep answers short and easy to read on a phone. Use plain text, avoid HTML tags and heavy markdown. Be proactive and helpful."
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "0ffdc4cc-3e0f-453c-91b2-27c613091b4a",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1200,
        160
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Configuration').item.json.chat_model }}"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "1cd0aeaa-9145-465c-a1fd-3e06fed62f78",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        1344,
        160
      ],
      "parameters": {
        "sessionKey": "={{ $('Configuration').item.json.approver_chat_id }}",
        "sessionIdType": "customKey",
        "contextWindowLength": "={{ $('Configuration').item.json.memory_window }}"
      },
      "typeVersion": 1.4
    },
    {
      "id": "702c1f4c-16c4-41a9-bf24-5a716af4e5e4",
      "name": "Get recent emails",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1504,
        160
      ],
      "parameters": {
        "limit": 10,
        "filters": {
          "q": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('gmail_query', 'Optional Gmail search query. Leave empty for the latest emails.') }}"
        },
        "operation": "getAll",
        "descriptionType": "manual",
        "toolDescription": "Read and summarize the most recent emails from the user Gmail inbox. Optionally pass a Gmail search query (e.g. is:unread, newer_than:2d, from:user@example.com)."
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9f7c3ae9-d104-446e-9e9f-9e388561bcf3",
      "name": "Get calendar events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1664,
        160
      ],
      "parameters": {
        "limit": 20,
        "options": {},
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Calendar', ``, 'string') }}",
          "cachedResultName": "Primary"
        },
        "operation": "getAll",
        "descriptionType": "manual",
        "toolDescription": "List the user upcoming Google Calendar events (about the next 7 days)."
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "0717d187-cca0-48fd-82d8-cc9e00f16ae6",
      "name": "Get Notion tasks",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        1824,
        160
      ],
      "parameters": {
        "limit": 25,
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1ac3d655-0fd9-80d3-bee6-c47e78f067f6",
          "cachedResultUrl": "https://app.notion.com/p/1ac3d6550fd980d3bee6c47e78f067f6",
          "cachedResultName": "Contacts n8n"
        },
        "descriptionType": "manual",
        "toolDescription": "Read the user to-do / tasks from their Notion tasks database."
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "da406a3e-7727-488a-9794-275a55190039",
      "name": "Get Notion contacts",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        2000,
        160
      ],
      "parameters": {
        "limit": 25,
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1ac3d655-0fd9-80d3-bee6-c47e78f067f6",
          "cachedResultUrl": "https://app.notion.com/p/1ac3d6550fd980d3bee6c47e78f067f6",
          "cachedResultName": "Contacts n8n"
        },
        "descriptionType": "manual",
        "toolDescription": "Look up people in the user Notion contacts database, for example to find an email address before sending an email."
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d930d838-8d2f-4c6a-a438-16eaf6968732",
      "name": "Ask my approval on Telegram",
      "type": "n8n-nodes-base.telegramHitlTool",
      "position": [
        1520,
        368
      ],
      "parameters": {
        "chatId": "={{ $('Configuration').item.json.approver_chat_id }}",
        "message": "=Nova wants to send an email:\n\nTo: {{ $tool.parameters.to }}\nSubject: {{ $tool.parameters.subject }}\n\n{{ $tool.parameters.body }}\n\nApprove sending?",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeUnit": "minutes",
              "resumeAmount": 30
            }
          },
          "appendAttribution": false
        },
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "\u2705 Send it",
            "disapproveLabel": "\u274c Cancel"
          }
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5f5a5e69-c188-4982-afe3-75a7a87fc0b3",
      "name": "Send email",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1472,
        592
      ],
      "parameters": {
        "sendTo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('to', 'Recipient email address') }}",
        "message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('body', 'Full email body text') }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('subject', 'Email subject line') }}",
        "emailType": "text",
        "descriptionType": "manual",
        "toolDescription": "Send an email from the user Gmail. This tool is gated by a human approval step on Telegram: use it freely, the user approves the exact content before it is sent, so do not ask the user for confirmation yourself."
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "ce4e3a30-e921-4293-aa45-6cfad6d6986d",
      "name": "Prepare text input",
      "type": "n8n-nodes-base.set",
      "position": [
        672,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "t1",
              "name": "user_input",
              "type": "string",
              "value": "={{ $('Telegram Trigger').item.json.message.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "295e8f5a-c7ae-4521-a8a6-0ffdc867a88b",
      "name": "Send reply on Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2240,
        -48
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "chatId": "={{ $('Configuration').item.json.approver_chat_id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d4a70017-4629-4f36-a5d3-4e3d4b605885",
      "name": "Sticky Note ffc59511",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -512
      ],
      "parameters": {
        "width": 520,
        "height": 1656,
        "content": "# Nova, your personal AI assistant on Telegram (voice, email and calendar)\n\n# \ud83d\udce5  [Open full documentation on Notion](https://automatisation.notion.site/Course-Build-Nova-a-personal-AI-assistant-on-Telegram-39a3d6550fd981af9a71e5e18feefe7b)\n\n## How it works\nNova is a personal AI assistant that lives in Telegram. Send it a text or a voice message and it will transcribe voice with OpenAI, understand your request, then use its tools to read your recent emails, check your Google Calendar, read your Notion tasks and contacts, and draft and send an email for you \u2014 always after you approve it on Telegram. It keeps a short memory of the conversation so you can ask follow-up questions.\n\n## Setup\n1. Telegram: select your bot credential on the 3 Telegram nodes (Trigger, Approval, Reply).\n2. OpenAI: select the \"OpenAi account\" credential on the Chat model and the Transcribe node.\n3. Gmail: select your Gmail credential on the two email tools.\n4. Google Calendar: select your credential on the calendar tool.\n5. Notion: select your credential on the two Notion tools, then pick your Tasks database and your Contacts database in the dropdowns.\n6. Open the Configuration node to set the assistant name, model, languages and memory window.\n\n## Requirements\n- An n8n instance (cloud or self-hosted). All nodes are native, no community node required.\n- A Telegram bot token (via @BotFather).\n- OpenAI, Gmail, Google Calendar and Notion credentials.\n\n## Customization\n- Change the model in Configuration (e.g. gpt-5.4-mini for lower cost).\n- Add or remove tools on the Nova agent.\n- Edit Nova personality in the agent System Message.\n- The email tool is gated by a Telegram approval \u2014 you can switch it to a single button or a form.\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'll 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": "a8a88cdb-0707-4275-addf-a72e7d928d1e",
      "name": "Sticky Note 79736445",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -384
      ],
      "parameters": {
        "color": 7,
        "width": 396,
        "height": 214,
        "content": "## 1. Voice or text input\nThe Telegram Trigger receives the message. Configuration holds all the knobs. If it is a voice note, it is downloaded and transcribed by OpenAI; otherwise the text is used directly."
      },
      "typeVersion": 1
    },
    {
      "id": "14584133-c86a-4c9b-8676-1f5d40779bc2",
      "name": "Sticky Note 3b2af7ad",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 452,
        "height": 248,
        "content": "## 2. Nova \u2014 the AI brain\nThe agent reads the user message, remembers the conversation (Simple Memory keyed on the chat ID) and picks the right tool with the OpenAI chat model."
      },
      "typeVersion": 1
    },
    {
      "id": "f7aa7fa4-4e42-4e9d-8528-3997f4dc9d8f",
      "name": "Sticky Note e2a2af6e",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 476,
        "height": 242,
        "content": "## 3. Tools Nova can use\nRead emails, calendar, Notion tasks and contacts."
      },
      "typeVersion": 1
    },
    {
      "id": "d72fbeb0-2079-48c8-aae1-62afadfbf034",
      "name": "Sticky Note 081a214c",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2096,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 236,
        "content": "## 4. Send email (with your approval)\nWhen Nova wants to send an email, it must first pass the Telegram approval step. Nothing is sent until you tap \u2705."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": true,
    "executionOrder": "v1"
  },
  "versionId": "8b0c89f6-e78a-4d63-8471-58f33988646e",
  "nodeGroups": [],
  "connections": {
    "Nova": {
      "main": [
        [
          {
            "node": "Send reply on Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email": {
      "ai_tool": [
        [
          {
            "node": "Ask my approval on Telegram",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Configuration": {
      "main": [
        [
          {
            "node": "Is voice message?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Nova",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Get voice file": {
      "main": [
        [
          {
            "node": "Transcribe voice",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Notion tasks": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe voice": {
      "main": [
        [
          {
            "node": "Prepare voice input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get recent emails": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Is voice message?": {
      "main": [
        [
          {
            "node": "Get voice file",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare text input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Nova",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Prepare text input": {
      "main": [
        [
          {
            "node": "Nova",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Notion contacts": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get calendar events": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Prepare voice input": {
      "main": [
        [
          {
            "node": "Nova",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ask my approval on Telegram": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "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 turns a Telegram bot into a personal assistant that handles text and voice messages using OpenAI, can read Gmail and Google Calendar, looks up tasks and contacts in Notion, and can draft and send emails with a required approval step in Telegram. Triggers when a new…

Source: https://n8n.io/workflows/17061/ — 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

Telegram Trigger receives incoming messages (text, voice, photo, document). Switch routes by message type to appropriate processors: Text → forwarded as-is. Voice → downloaded and sent to Transcribe a

Memory Buffer Window, Telegram Trigger, Telegram +12
AI & RAG

Transform your Telegram messenger into a powerful, multi-modal personal or team assistant. This n8n workflow creates an intelligent agent that can understand text, voice, images, and documents, and ta

Memory Buffer Window, Telegram Trigger, Telegram +10
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