Collects as they arrive, acts daily
Schedule Telegram channel posts from your bot
Send your bot "/at 18:00" with a post, and ClickRuntime publishes it to your Telegram channel at that time.
- Runs
- Collects as they arrive, acts daily
- Apps
- Telegram
- AI
- Not needed
- Access
- bot token (bot admin in the channel)
Send this to your assistant
Create a ClickRuntime automation: when I send my Telegram bot "/at 2026-11-12 18:00" followed by text, post that text to my channel at that time in my time zone and confirm. "/queue" should list what is scheduled and "/cancel N" should remove one.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Telegram's app lets you schedule a message, but only from the device in front of you, one at a time, with no shared view of what is planned. Channel owners who post every day end up setting phone reminders to post by hand.
This automation turns your bot into a simple post queue. You send it the time and the text, it confirms, and at that time the post goes to your channel. /queue shows what is planned and /cancel removes a post.
It suits channel owners, small shops and community admins who plan posts ahead in batches.
What you get out of it
Plan a week in one sitting
Send several /at commands in a row and the posts go out on their own.
See what is coming
/queue lists every scheduled post with its time, which the app's scheduler does not show across devices.
Posts as the channel
The bot publishes as the channel, the same as a manual post.
Confirmation after each post
You get a short note once a post is out, so you know it went.
Easy to change
Cancel or re-add a post with one message instead of hunting through scheduled items.
How it works
What happens, step by step
You send your bot a command like "/at 2026-11-12 18:00" followed by the post.
ClickRuntime saves the post and replies with the time it will go out.
Every 5 minutes it checks for posts that are due and publishes them to your channel as the bot.
Send /queue to see what is waiting, or /cancel with a number to drop one.
Before it runs live
- Connect Telegram
- Paste your automation's link into the other app's webhook settings
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Telegram steps into one automation
Under the hood
The code that runs this automation
from datetime import datetime
from zoneinfo import ZoneInfo
from clickruntime import on_trigger, credentials, http, state
OWNER, CHANNEL, TZ = 123456789, "@yourchannel", ZoneInfo("Europe/London")
def tg(method, **params):
r = http.post(f"https://api.telegram.org/bot{credentials.secret('TELEGRAM_BOT_TOKEN')}/{method}", json=params)
r.raise_for_status()
return r.json()["result"]
@on_trigger
def run(event):
queue = state.get("queue") or []
msg = (event.get("json") or {}).get("message")
if msg: # a command from the owner
if msg["chat"]["id"] != OWNER:
return {"skipped": True}
text = msg.get("text", "")
if text.startswith("/at "):
parts = text.split(" ", 3)
when = datetime.strptime(f"{parts[1]} {parts[2]}", "%Y-%m-%d %H:%M").replace(tzinfo=TZ)
n = (state.get("n") or 0) + 1
queue.append({"n": n, "at": when.timestamp(), "text": parts[3]})
state.set("n", n)
reply = f"Scheduled #{n} for {when:%a %d %b %H:%M}"
elif text.startswith("/cancel "):
queue = [q for q in queue if str(q["n"]) != text.split()[1]]
reply = "Removed."
else:
reply = "\n".join(f"#{q['n']} {datetime.fromtimestamp(q['at'], TZ):%d %b %H:%M} {q['text'][:40]}" for q in queue) or "Nothing scheduled."
state.set("queue", queue)
tg("sendMessage", chat_id=OWNER, text=reply)
return {"queued": len(queue)}
now = datetime.now(TZ).timestamp() # schedule: post what is due
due = [q for q in queue if q["at"] <= now]
for q in due:
tg("sendMessage", chat_id=CHANNEL, text=q["text"])
tg("sendMessage", chat_id=OWNER, text=f"Posted #{q['n']} to {CHANNEL}")
state.set("queue", [q for q in queue if q["at"] > now])
return {"posted": len(due)}
FAQ
Common questions
How exact is the posting time?
Can I schedule photos?
Can several admins schedule posts?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Run a giveaway for your channel subscribers
Only real subscribers can enter, and a random winner is announced on the day you choose.
See how it worksGet a daily summary of your Telegram group
Each evening you get what the group talked about, without reading every message.
See how it worksRead receipts you photograph
Send your bot a photo of a receipt and get the merchant, date and total back.
See how it worksKeep exploring
Set up “Schedule Telegram channel posts from your bot” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.