How dynamic create inline-menu on Telegram + JSON

Hi n8n community,

I’m struggling to get Telegram inline keyboards working through the native Telegram node. Despite trying all suggested approaches, the buttons only appear when sending a raw HTTP POST request to the Telegram API - which isn’t an ideal workflow.

What I’ve Tried:
Function Node returning proper inline_keyboard structure

javascript
return [{
  json: {
    inline_keyboard: [[{text: "Test", callback_data: "test"}]]
  }

}];
→ Buttons don’t appear, though Debug shows correct output

Direct JSON input in Reply Markup field:

json
{{ { "inline_keyboard": [[{"text":"Test","callback_data":"test"}]] } }}

→ Same result

Multiple syntax variations (.first(), stringify, different bracket styles)

What DOES Work:
Manual HTTP POST request to api.telegram.org with:

json
{
  "chat_id": 123,
  "text": "Test",
  "reply_markup": {
    "inline_keyboard": [[{"text":"Test","callback_data":"test"}]]
  }
}

Environment:
n8n v1.18.2 (self-hosted)

Telegram Bot API

Debug Node confirms correct JSON structure

Has anyone encountered this? The HTTP workaround proves the bot has permissions and the API works - something in the Telegram node’s reply_markup handling seems to interfere. Any insight would be greatly appreciated!

If you need to make progress, use a Function Node to structure the message JSON with inline_keyboard.

Then use an HTTP Request Node pointing to https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage, with the JSON in the body.

Continue monitoring Telegram node updates for improvements in dynamic support and secure token handling.

You can comment or vote in the feature request threads (turn0search3 and 4) to raise awareness of this need.