We need dynamic replay keyboadrds

We have a Telegram bot that creates an array in each request, and the number of array members is different in each request
We want to have replay keyboard as many members as possible
We cannot apply an inner loop
what is the solution

It looks like your topic is missing some important information. Could you provide the following if applicable.

  • n8n version:
  • Database (default: SQLite):
  • n8n EXECUTIONS_PROCESS setting (default: own, main):
  • Running n8n via (Docker, npm, n8n cloud, desktop app):
  • Operating system:

version : 1.31.2
database: google sheets


If you’re unable to use an inner loop to dynamically create the reply keyboard with as many members as possible, you can consider the following approach:

  1. Dynamically Generate Keyboard Layout: Instead of using a loop to generate the keyboard, you can dynamically generate the layout of the reply keyboard based on the number of array members. You’ll need to calculate the number of rows and columns needed to accommodate all the array members.

  2. Telegram’s inline keyboards allow for more flexibility compared to reply keyboards. You can dynamically generate inline keyboard buttons based on the array members without needing a loop. Each button can correspond to an array member.

  3. Use External Libraries or APIs: Depending on the programming language you’re using for your Telegram bot, there may be libraries or APIs available that can assist in dynamically generating keyboards without loops. Explore available options and see if any fit your requirements.

how can we dynamically generate inline keyboard buttons when the number of array members is different in each request?

Hi, you can use this:

  1. Retrieve the array containing the data for the inline keyboard buttons.
  2. Iterate over the array to create InlineKeyboardButton objects for each element.
  3. Group the buttons into rows, as Telegram inline keyboards are organized in rows.
  4. Add each row of buttons to the InlineKeyboardMarkup object.
  5. Send the message with the inline keyboard markup to the user.

Here’s a Python example using the python-telegram-bot library:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
import logging

logging.basicConfig(format=‘%(asctime)s - %(name)s - %(levelname)s - %(message)s’, level=logging.INFO)

def start(update, context):
array = [‘Button 1’, ‘Button 2’, ‘Button 3’] # Replace this with your dynamic array data
keyboard =
for item in array:
keyboard.append([InlineKeyboardButton(item, callback_data=item)])
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(‘Please choose:’, reply_markup=reply_markup)

def button(update, context):
query = update.callback_query
query.edit_message_text(text=“Selected option: {}”.format(query.data))

def main():
updater = Updater(“YOUR_TELEGRAM_BOT_TOKEN”, use_context=True)
dp = updater.dispatcher

dp.add_handler(CommandHandler("start", start))


if name == ‘main’:

In this example, the start function dynamically generates inline keyboard buttons based on the contents of the array. Each button corresponds to an element in the array, and when clicked, the button function is called to handle the user’s selection. Adjust the array variable to contain your dynamic data, and the bot will generate inline keyboard buttons accordingly for each request.