docs/agents/channels/telegram.mdx
Use Telegram as a messaging channel for your agent. Novu keeps conversation context, shows typing during the turn, can update a plan card in place, and uses inline keyboard buttons for choices and tool approval.
| Capability | Support |
|---|---|
| Full context history | Yes |
| Threaded replies | Yes |
| Live typing indicator (custom status text) | Yes |
| React with eyes on inbound messages | Yes |
| Plan card (markdown edit-in-place) | Yes |
| Rich text / markdown | Yes |
| Tap-to-respond buttons (inline keyboard) | Yes |
| Emoji reactions | Yes |
| Message edits in place | Yes |
| Action / MCP tool approval | Yes |
| MCP connect card | Yes |
| Resolve conversation | Yes |
| File sharing | Not yet |
| Streaming word-by-word | Not yet |
Full matrix: Channels overview.
A user messages the bot. Novu adds an eyes reaction, shows typing with optional custom status text, updates a plan card while tools run, then replies with inline keyboard buttons.
Gated tools post Approve once / Deny / Always allow. The handler resumes after the user selects an option.
| Framework / Platform | Guide |
|---|---|
| Custom code agent | Follow a connect guide, then add Telegram as another provider |
| Managed agent | Claude or AWS Claude, then link Telegram in the dashboard |
Use TelegramConnectButton from @novu/react so end users can link their Telegram chat to your agent. The button issues a t.me/<bot>?start=<code> deep link, opens it, and polls until the user presses Start in Telegram.
import { NovuProvider, TelegramConnectButton } from '@novu/react';
export function TelegramConnect() {
const subscriberId = 'subscriber-id';
const integrationIdentifier = 'telegram-integration-identifier';
return (
<NovuProvider
applicationIdentifier={process.env.NEXT_PUBLIC_NOVU_APPLICATION_IDENTIFIER!}
subscriberId={subscriberId}
>
<TelegramConnectButton
integrationIdentifier={integrationIdentifier}
connectLabel="Connect Telegram"
connectedLabel="Connected to Telegram"
onConnectSuccess={(endpointIdentifier) => {
console.log('Connected', endpointIdentifier);
}}
onConnectError={(error: unknown) => {
console.error(error);
}}
onDisconnectSuccess={() => {
// Chat unlinked
}}
/>
</NovuProvider>
);
}
Props and appearance options: Connect components.