Skip to main content
Tutorials

Create a Telegram Bot Without Code: Automation with n8n and Make.com

Step-by-step guide to creating a Telegram Bot with n8n.

15 min read
Updated: March 24, 2026

Telegram bots are powerful tools for business automation: customer notifications, team alerts, order status updates, or even complete chatbots. The best part: you don't need programming knowledge. In this guide, we show you how to create a working Telegram bot in 30 minutes. If your team uses Slack or Microsoft Teams, also see our Slack bot guide and Teams bot guide.

Why Telegram Bots?

Advantages over other channels:
ChannelDelivery RateCostInteractive
Email20-30% openedFreeLimited
SMS95%+$0.05-0.10/SMSNo
WhatsApp Business90%+Complex, expensiveYes
Telegram Bot90%+FreeYes

Telegram bots work seamlessly with automation platforms like n8n and Make.com.

Use Cases:
  • Server monitoring alerts
  • Order notifications
  • Team communication
  • Customer support bot
  • Daily reports
  • IoT notifications

Step 1: Create Bot on Telegram

Contact BotFather

  • Open Telegram
  • Search for @BotFather
  • Start the chat with /start
  • Create Bot

    You: /newbot
    

    BotFather: Alright, a new bot. How are we going to call it?

    You: My Business Bot

    BotFather: Good. Now let's choose a username for your bot...

    You: my_business_bot

    BotFather: Done! Congratulations on your new bot...

    Use this token to access the HTTP API:

    1234567890:ABCdefGHIjklMNOpqrsTUVwxyz

    Important: Store the API token securely - it's like a password!

    Configure Bot

    Additional BotFather commands:

    CommandFunction
    /setdescriptionBot description
    /setabouttextInfo text
    /setuserpicProfile picture
    /setcommandsDefine commands

    Step 2: Get Chat ID

    To send messages, you need the chat ID:

    For Individuals

  • Send a message to your bot
  • Visit: https://api.telegram.org/bot{TOKEN}/getUpdates
  • Look for "chat":{"id":123456789}
  • For Groups

  • Add the bot to the group
  • Write something in the group
  • Call getUpdates
  • Group IDs are negative: -987654321
  • Automatically with n8n

    // Node: Telegram Trigger
    

    // Waits for messages and extracts chat ID

    const chatId = $json.message.chat.id;

    const username = $json.message.from.username;

    const text = $json.message.text;

    // Save chat ID for later use

    Build it or have it built?
    We implement this workflow for you — fully tested in 1-4 weeks. Fixed-price quote within 24h.
    Get a Quote →

    Step 3: Create First Workflow

    Use Case: Server Alert Bot

    Notification for server problems:

    Uptime Monitor (Server down)
    

    |

    Telegram: Send alert

    "Warning: Server XYZ is unreachable!"

    |

    Wait for response

    |

    On "OK": Mark alarm as acknowledged

    n8n Workflow

    Node 1: HTTP Request (Webhook from uptime monitor)
    // Webhook receives alert
    

    {

    "server": "webserver-01",

    "status": "down",

    "timestamp": "2024-01-15T10:30:00Z"

    }

    Node 2: Telegram - Send Message
    // Configure Telegram Node
    

    {

    "chatId": "-987654321", // Group ID

    "text": "<em>Server Alert</em>\n\nServer: {{ $json.server }}\nStatus: {{ $json.status }}\nTime: {{ $json.timestamp }}\n\nReply with /ack to acknowledge.",

    "parseMode": "Markdown"

    }

    Step 4: Build Interactive Bot

    Define Commands

    With BotFather:

    /setcommands
    
    

    status - Current system status

    help - Show help

    subscribe - Enable notifications

    unsubscribe - Disable notifications

    React to Commands

    Telegram Trigger (new message)
    

    |

    Switch (by command)

    |

    /status -> Send system status

    /help -> Send help text

    /subscribe -> Register user

    /unsubscribe -> Remove user

    n8n: Command Handler

    // Node: Switch
    

    // Routing based on command

    const text = $json.message.text;

    if (text === '/status') return { route: 'status' };

    if (text === '/help') return { route: 'help' };

    if (text.startsWith('/subscribe')) return { route: 'subscribe' };

    if (text.startsWith('/unsubscribe')) return { route: 'unsubscribe' };

    return { route: 'unknown' };

    Implement Status Command

    // Node: HTTP Request -> Your API
    

    // Node: Format Response

    const status = {

    webserver: $json.webserver.status,

    database: $json.database.status,

    queue: $json.queue.jobs_pending

    };

    const message =

    <em>System Status</em>

    Web Server: ${status.webserver === 'ok' ? 'OK' : 'ERROR'}

    Database: ${status.database === 'ok' ? 'OK' : 'ERROR'}

    Queue: ${status.queue} jobs pending

    _Updated: ${new Date().toLocaleString('en-US')}_

    ;

    return { message };

    Step 5: Inline Keyboards

    Interactive buttons for better UX:

    Send Button Message

    // Node: Telegram - Send Message
    

    {

    "chatId": "{{ $json.chatId }}",

    "text": "Which action would you like to perform?",

    "replyMarkup": {

    "inline_keyboard": [

    [

    { "text": "Confirm", "callback_data": "confirm" },

    { "text": "Cancel", "callback_data": "cancel" }

    ],

    [

    { "text": "Status", "callback_data": "status" }

    ]

    ]

    }

    }

    React to Button Clicks

    // Node: Telegram Trigger
    

    // callback_query contains button data

    if ($json.callback_query) {

    const action = $json.callback_query.data;

    const chatId = $json.callback_query.message.chat.id;

    const messageId = $json.callback_query.message.message_id;

    // Acknowledge button click (removes loading animation)

    await answerCallbackQuery($json.callback_query.id);

    // Update original message

    await editMessage(chatId, messageId, "Action performed: " + action);

    }

    Training or implementation?
    Whether you want to learn it yourself or have us build it — we offer both. Custom workshops from 2h or turnkey solutions.
    See Options →

    Practical Examples

    1. E-Commerce Order Bot

    Shopify (New Order)
    

    |

    Telegram to customer:

    "Thank you for your order #1234!

    Products:

    - Product A (2x)

    - Product B (1x)

    Total: $149.00

    We'll notify you about shipping."

    2. Team Standup Bot

    Schedule (Mon-Fri 9:00 AM)
    

    |

    Telegram to team group:

    "Good morning! Time for the daily standup.

    Please reply with:

    1. What did I do yesterday?

    2. What am I doing today?

    3. Are there any blockers?"

    |

    Collect responses (30 min)

    |

    Save summary to Notion

    3. Lead Notification Bot

    Website Form (new lead)
    

    |

    Telegram to sales team:

    "New Lead!

    Max Smith

    max@example.com

    Company Inc.

    'Interested in Enterprise Plan'

    [Open CRM] [Call]"

    4. Monitoring & Alerts

    Various sources:
    
    • Server Down -> Alert
    • High CPU -> Warning
    • Backup complete -> Info
    • Error in logs -> Bug Report
    |

    Telegram with severity indicator

    Make.com: Telegram Bot Scenario

    Modules

  • Telegram Bot - Watch Updates (Trigger)
  • Router (by message type)
  • Text Parser (extract commands)
  • HTTP (call your API)
  • Telegram Bot - Send Message
  • Example Scenario: FAQ Bot

    Telegram Watch Updates
    

    |

    Router:

    +- /faq -> Send FAQ menu (Inline Keyboard)

    +- callback "faq_*" -> Send FAQ answer

    +- Free text -> AI search in FAQ database

    Advanced: AI Chatbot

    Connect with OpenAI/Claude

    // Node: OpenAI
    

    // Conversation with context

    const systemPrompt =

    You are a friendly support bot for Company XYZ.

    You answer questions about our products and services.

    For complex inquiries, refer to human support.

    ;

    const messages = [

    { role: 'system', content: systemPrompt },

    { role: 'user', content: $json.message.text }

    ];

    // Include conversation history

    const history = await getConversationHistory($json.message.chat.id);

    messages.splice(1, 0, ...history);

    Save Conversation

    // Node: Redis/Database
    

    // Store context for 24h

    await saveMessage({

    chatId: $json.message.chat.id,

    role: 'user',

    content: $json.message.text,

    timestamp: Date.now()

    });

    await saveMessage({

    chatId: $json.message.chat.id,

    role: 'assistant',

    content: aiResponse,

    timestamp: Date.now()

    });

    Best Practices

    1. Respect Rate Limits

    ActionLimit
    Messages to user30/second
    Messages in group20/minute
    Bulk messages30 users/second
    // Add delay for bulk sending
    

    for (const user of users) {

    await sendMessage(user.chatId, message);

    await sleep(100); // 100ms pause

    }

    2. Error Handling

    // Catch Telegram API errors
    

    try {

    await sendMessage(chatId, text);

    } catch (error) {

    if (error.code === 403) {

    // User has blocked bot

    await removeSubscriber(chatId);

    } else if (error.code === 429) {

    // Rate limit - wait and retry

    await sleep(error.parameters.retry_after * 1000);

    await sendMessage(chatId, text);

    }

    }

    3. Format Messages

    // Markdown V2 syntax
    

    const text =

    <em>Bold</em>

    _Italic_

    ~Strikethrough~

    \Code\

    \\\

    Code Block

    \\\

    Link

    ;

    // Escape special characters

    const escaped = text.replace(/[_*[\]()~`>#+=|{}.!-]/g, '\\$&');

    4. Send Media

    // Send image
    

    {

    "method": "sendPhoto",

    "chatId": "123456",

    "photo": "https://example.com/image.jpg",

    "caption": "Description"

    }

    // Send document

    {

    "method": "sendDocument",

    "chatId": "123456",

    "document": "{{ $binary.data }}",

    "filename": "report.pdf"

    }

    Security

    Protect Token

    • Never commit in code
    • Use environment variables
    • If leaked: Revoke token with BotFather

    Restrict Access

    // Only allow certain users
    

    const allowedUsers = [123456, 789012];

    if (!allowedUsers.includes($json.message.from.id)) {

    await sendMessage(chatId, "Access denied.");

    return;

    }

    Secure Webhook

    // Verify secret token
    

    const secretToken = $headers['x-telegram-bot-api-secret-token'];

    if (secretToken !== process.env.TELEGRAM_SECRET) {

    return { status: 403 };

    }

    Costs

    ComponentCost
    Telegram Bot APIFree
    n8n CloudFrom 20 EUR/month
    Make.comFrom 9 EUR/month
    Server (Self-Hosted)From 5 EUR/month
    Total costs: 5-30 EUR/month for a fully functional bot

    Conclusion

    Telegram bots are a cost-effective and efficient solution for business automation:

    • Free API
    • High delivery rates
    • Interactive features
    • Easy integration with n8n/Make.com

    Next Steps

  • Create bot with BotFather
  • Set up first workflow (e.g., simple alert)
  • Add interactivity (buttons, commands)
  • Scale (AI integration, more use cases)
  • We support you with Telegram automation - from setup to production use. Contact us for a free consultation. For more automation ideas, browse our workflow automation examples.

    Want this built for you?

    Our team implements production-ready workflows in 1-4 weeks. Fixed-price quote within 24 hours.

    Stay Updated

    Get Automation Insights That Matter

    New tool comparisons, workflow tips, and pricing updates — directly in your inbox. No spam, unsubscribe anytime.

    We respect your privacy. Unsubscribe at any time.