Employee onboarding buddy AI agent on Telegram

New hires ask the agent anything about their first weeks, see their checklist, and tick tasks off as they go.

AI agentAdvanced Saves ~8 hours/month AI AgentsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Telegram — a new hire messages the bot
  1. A new hire asks a question or "what's next?".
  2. The agent answers from your onboarding guide.
  3. It shows their own checklist and marks tasks done when they finish them.
  4. It alerts HR when someone is blocked.

What it can do

Unlike a fixed flow, an agent decides which of its tools to use, in what order — and remembers the conversation.

  • Answers first-week questions from your guide
  • Shows each person's open onboarding tasks
  • Marks tasks done
  • Flags blockers like missing laptops or accounts

System prompt

The instructions that shape the agent. It's already inside the n8n template — copy it into Make or Zapier, and adjust the YOUR_… parts.

System prompt
You are the onboarding buddy for new employees at YOUR_COMPANY on Telegram. Reply in their language (Arabic or English), friendly and short. Today is {{ $now.toFormat('cccc d LLLL yyyy') }}.

The employee's Telegram ID is {{ $('Get message').item.json.userId }}.

Tools:
- "Onboarding guide": answers for new hires: tools and accounts, who to ask for what, office info, payroll dates, first-week schedule. Answer only from it.
- "My checklist": this employee's onboarding tasks (task_id, task, due, done). It only returns the person who is asking.
- "Mark task done": marks one task as done by its task_id. Use only after the employee says they finished it.
- "Notify HR": alerts HR when someone is blocked (no laptop, no account access), has a sensitive question, or asks something you can't answer.

Rules:
- If "My checklist" returns nothing, tell them they're not set up yet and use "Notify HR".
- When they ask "what's next?", show their open tasks, earliest due date first.
- Never share other employees' information or discuss salaries.

Safety rules

Built into the prompt and the tools:

  • Only shows a person their own checklist
  • Never discusses salaries or other employees

Uses your own AI key (Claude, OpenAI or another model). Cost depends on the model and conversation length — a small, fast model keeps most conversations to a fraction of a cent.

Diagram

TIncoming messageTelegram Trigger{ }Get messageCodeOnboarding agentAI AgentClaude modelAnthropic Chat Mo…◷MemorySimple MemoryGOnboarding gui…Google Sheets ToolGMy checklistGoogle Sheets ToolGMark task doneGoogle Sheets ToolTNotify HRTelegram ToolTReply on TelegramTelegram
Trigger App Code AI Agent tool

Code

JavaScript used in the Code step — already included in the template below.

Get message · Code node
// Keeps only text messages and pulls out who sent it and what they asked.
const msg = $input.first().json.message;
if (!msg?.text) return [];

return [{
  json: {
    chatId: msg.chat.id,
    userId: msg.from.id,
    name: [msg.from.first_name, msg.from.last_name].filter(Boolean).join(" "),
    question: msg.text,
  },
}];

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (341 lines)
{
  "name": "Employee onboarding buddy AI agent on Telegram (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Employee onboarding buddy AI agent on Telegram\nNew hires ask the agent anything about their first weeks, see their checklist, and tick tasks off as they go.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Incoming message",
      "type": "n8n-nodes-base.telegramTrigger",
      "typeVersion": 1.1,
      "position": [
        0,
        0
      ],
      "webhookId": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3"
    },
    {
      "parameters": {
        "jsCode": "// Keeps only text messages and pulls out who sent it and what they asked.\nconst msg = $input.first().json.message;\nif (!msg?.text) return [];\n\nreturn [{\n  json: {\n    chatId: msg.chat.id,\n    userId: msg.from.id,\n    name: [msg.from.first_name, msg.from.last_name].filter(Boolean).join(\" \"),\n    question: msg.text,\n  },\n}];"
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Get message",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('Get message').item.json.question }}",
        "options": {
          "systemMessage": "=You are the onboarding buddy for new employees at YOUR_COMPANY on Telegram. Reply in their language (Arabic or English), friendly and short. Today is {{ $now.toFormat('cccc d LLLL yyyy') }}.\n\nThe employee's Telegram ID is {{ $('Get message').item.json.userId }}.\n\nTools:\n- \"Onboarding guide\": answers for new hires: tools and accounts, who to ask for what, office info, payroll dates, first-week schedule. Answer only from it.\n- \"My checklist\": this employee's onboarding tasks (task_id, task, due, done). It only returns the person who is asking.\n- \"Mark task done\": marks one task as done by its task_id. Use only after the employee says they finished it.\n- \"Notify HR\": alerts HR when someone is blocked (no laptop, no account access), has a sensitive question, or asks something you can't answer.\n\nRules:\n- If \"My checklist\" returns nothing, tell them they're not set up yet and use \"Notify HR\".\n- When they ask \"what's next?\", show their open tasks, earliest due date first.\n- Never share other employees' information or discuss salaries."
        }
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Onboarding agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.9,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        175,
        220
      ]
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Get message').item.json.chatId }}",
        "contextWindowLength": 10
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        345,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns the onboarding guide: topic and answer.",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Onboarding guide",
          "mode": "name"
        },
        "options": {}
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Onboarding guide",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        515,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns the onboarding tasks of the employee who is asking.",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Checklist",
          "mode": "name"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "telegram_id",
              "lookupValue": "={{ $('Get message').item.json.userId }}"
            }
          ]
        },
        "options": {}
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "My checklist",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        685,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Marks one onboarding task as done.",
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Checklist",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "task_id": "={{ $fromAI('task_id', \"The task_id from My checklist\", 'string') }}",
            "done": "={{ $now.toISODate() }}"
          },
          "matchingColumns": [
            "task_id"
          ]
        },
        "options": {}
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Mark task done",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        855,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Alerts HR when a new hire is blocked or asks something you can't answer.",
        "chatId": "YOUR_HR_CHAT_ID",
        "text": "={{ $fromAI('message', \"What HR needs to know, including the employee's name\", 'string') }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Notify HR",
      "type": "n8n-nodes-base.telegramTool",
      "typeVersion": 1.2,
      "position": [
        1025,
        220
      ]
    },
    {
      "parameters": {
        "chatId": "={{ $('Get message').item.json.chatId }}",
        "text": "={{ $json.output }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "id": "22e0658a-8568-4a05-a7c2-dcf44e4dfdf3",
      "name": "Reply on Telegram",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        900,
        0
      ]
    }
  ],
  "connections": {
    "Incoming message": {
      "main": [
        [
          {
            "node": "Get message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get message": {
      "main": [
        [
          {
            "node": "Onboarding agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Onboarding agent": {
      "main": [
        [
          {
            "node": "Reply on Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Onboarding agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memory": {
      "ai_memory": [
        [
          {
            "node": "Onboarding agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Onboarding guide": {
      "ai_tool": [
        [
          {
            "node": "Onboarding agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "My checklist": {
      "ai_tool": [
        [
          {
            "node": "Onboarding agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Mark task done": {
      "ai_tool": [
        [
          {
            "node": "Onboarding agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Notify HR": {
      "ai_tool": [
        [
          {
            "node": "Onboarding agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Give each checklist row a unique task_id, such as the Telegram ID plus a short task name.

Related flows