How to add buttons to a Telegram post

Adding buttons to a Telegram post requires using a Telegram bot — native channel posts do not support interactive buttons on their own. Through the Bot API's inline keyboards, you can attach clickable URL buttons, callback buttons, and other interactive elements directly beneath any message your bot sends to a channel.

Understanding Telegram Buttons

Telegram offers two distinct types of keyboards that bots can attach to messages, but only one is relevant for channel posts.

Inline Keyboard Buttons

Inline keyboards appear directly below a message and stay attached to it. These are the buttons you see on channel posts — "Read More," "Visit Website," "👍 Like," and similar. They are created through the Bot API's InlineKeyboardMarkup object.

Common inline button types include:

  • URL buttons — open a link in the browser or in-app
  • Callback buttons — send data back to the bot (used for reactions, voting, navigation)
  • Switch inline buttons — prompt the user to pick a chat and start an inline query
  • Login buttons — authenticate users via Telegram Login Widget
  • Web App buttons — open a Telegram Mini App

Reply Keyboard Buttons

Reply keyboards appear at the bottom of the chat screen, replacing the standard keyboard. These do not work in channels — they are designed for private or group chats only. Do not confuse them with inline buttons.

How to Add Buttons: Step-by-Step

Step 1: Create or Connect a Bot

If you don't already have a bot managing your channel:

  1. Open @BotFather in Telegram
  2. Send /newbot and follow the prompts to name it
  3. Copy the API token (e.g., 7123456789:AAH...)
  4. Add the bot as an administrator to your channel with permission to post messages

Step 2: Send a Message with Inline Buttons via the API

Use the sendMessage (or sendPhoto, sendVideo, etc.) method with the reply_markup parameter. Here is a basic example using curl:

curl -X POST "https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": "@yourchannel",
    "text": "Check out our latest article!",
    "reply_markup": {
      "inline_keyboard": [
        [
          {"text": "📖 Read Article", "url": "https://example.com/article"},
          {"text": "🌐 Website", "url": "https://example.com"}
        ],
        [
          {"text": "👍 Like", "callback_data": "like_post_42"}
        ]
      ]
    }
  }'

Each inner array represents one row of buttons. In the example above, the first row has two buttons side by side, and the second row has one centered button.

Step 3: Edit Existing Posts to Add Buttons

Already published a post without buttons? Use editMessageReplyMarkup to attach buttons after the fact:

curl -X POST "https://api.telegram.org/bot<YOUR_TOKEN>/editMessageReplyMarkup" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": "@yourchannel",
    "message_id": 1234,
    "reply_markup": {
      "inline_keyboard": [
        [{"text": "🔗 Visit Site", "url": "https://example.com"}]
      ]
    }
  }'

You need the message_id, which your bot receives when it originally sends the message.

Using No-Code Tools to Add Buttons

Not everyone wants to write API calls manually. Several popular tools and bots simplify the process:

ControllerBot (@ControllerBot)

  1. Connect your channel to @ControllerBot
  2. Create a new post inside the bot
  3. Use the "Add URL button" option in the post editor
  4. Enter the button text and URL
  5. Publish — the bot posts to your channel with buttons attached

Post Scheduling Bots

Bots like @LivegramBot, @Manybot, and @PostBot offer built-in button editors. The flow is generally the same: compose your message, tap "Add button," specify label and URL, then publish or schedule.

Markdown-Based Button Syntax

Some advanced posting tools support a shorthand syntax within the message text itself. For example, in ControllerBot and similar services:

[Button Text](buttonurl://https://example.com)

This syntax varies by tool — always check the specific bot's documentation.

Button Layout and Design Principles

Telegram allows up to 8 buttons per row and up to 100 buttons total per message, though practical limits are much lower for usability.

Recommended layouts:

  • 1 button per row — best for primary calls to action; the button spans the full width
  • 2-3 buttons per row — good for related options (e.g., social media links)
  • Mixed rows — one prominent full-width button on top, smaller buttons grouped below

Character limits:

Button text should be concise. While Telegram doesn't enforce a strict character limit on button labels, overly long text will be truncated on smaller screens. Aim for 1-4 words per button.

Handling Callback Buttons

URL buttons are straightforward — they just open a link. Callback buttons require your bot to listen for and respond to callback_query updates.

When a user taps a callback button, Telegram sends your bot a payload containing the callback_data string you defined. Your bot must:

  1. Process the data (e.g., increment a like counter)
  2. Call answerCallbackQuery to dismiss the loading indicator
  3. Optionally update the message or buttons using editMessageText or editMessageReplyMarkup

This is how reaction buttons, polls, and navigation menus work on channel posts.

# Python example using python-telegram-bot
async def button_handler(update, context):
    query = update.callback_query
    await query.answer()  # Dismiss loading spinner

    if query.data.startswith("like_"):
        # Update like count, edit message, etc.
        await query.edit_message_reply_markup(reply_markup=updated_keyboard)

Tips & Best Practices

  • Keep it minimal. One or two buttons per post is usually enough. Posts with five or more buttons look cluttered and reduce click-through rates.
  • Use clear action verbs. "Read Article," "Join Chat," "Download PDF" outperform vague labels like "Click Here" or "More."
  • Put the most important button first. The top-left position gets the most taps. Place your primary CTA there.
  • Use emoji sparingly in labels. A single relevant emoji (📖, 🔗, ▶️) can boost visibility, but multiple emoji per button decrease readability.
  • Test on mobile. Over 80% of Telegram users are on mobile devices. Check that your button rows don't overflow or truncate awkwardly on smaller screens.
  • Track clicks externally. Telegram does not provide click analytics for URL buttons. Use UTM parameters or a link shortener with analytics to measure performance.
  • Mirror buttons on your web version. If you publish your Telegram channel content to the web through services like tgchannel.space, make sure your key links are also present in the post text itself — inline keyboard buttons do not render on external platforms.

Common Mistakes

Mistake 1: Trying to add buttons without a bot
Why it's wrong: Native Telegram channel posts (sent as the channel itself) cannot include inline keyboards. Only messages sent via a bot support buttons.
How to avoid: Always use a bot as an administrator of your channel for posts that need buttons.

Mistake 2: Using callback buttons without a running bot server
Why it's wrong: When a user taps a callback button and your bot is offline, they see an endless loading spinner followed by an error. This creates a poor experience.
How to avoid: Use URL buttons for simple links — they work without a running server. Reserve callback buttons for features where your bot is actively maintained and hosted 24/7.

Mistake 3: Overloading a post with too many buttons
Why it's wrong: A wall of buttons overwhelms readers and dilutes each button's effectiveness. Posts with 6+ buttons see significantly lower engagement per button.
How to avoid: Limit yourself to 1-3 buttons per post. If you need more options, link to a dedicated page or use a follow-up message.

Mistake 4: Using identical callback_data for different actions
Why it's wrong: Your bot won't be able to distinguish which button was pressed, leading to incorrect behavior.
How to avoid: Always use unique callback data strings, typically including the action type and a post or item identifier (e.g., like_42, next_page_3).

Frequently Asked Questions

Can I add buttons to a message I sent as the channel (not via a bot)?
No. Only bot-sent messages support inline keyboards. If you've been posting as the channel itself, you'll need to switch to posting through a bot to add buttons.

Do buttons work in forwarded messages?
URL buttons are preserved when a message is forwarded. Callback buttons technically appear but will only work if the original bot is still running and can handle the callback.

Is there a limit to how many buttons I can add?
Telegram allows up to 100 buttons per message with a maximum of 8 per row. In practice, you should rarely exceed 2-3 rows with 1-3 buttons each for optimal user experience.

Can I add buttons to posts with photos or videos?
Yes. All media message types (sendPhoto, sendVideo, sendDocument, etc.) support the reply_markup parameter for inline keyboards. The buttons appear below the media, just as they do with text posts.

Can I change or remove buttons after publishing?
Yes. Use editMessageReplyMarkup to update the button layout at any time, or pass an empty inline_keyboard: [] to remove all buttons from a post.