Skip to content

On a schedule

Get a Telegram warning about tomorrow's calendar clashes

Each evening at 19:00, ClickRuntime checks tomorrow on your Google Calendars and sends a Telegram warning if any events overlap or run back to back.

Runs
On a schedule
Apps
Google Calendar, Telegram
AI
Not needed
Access
Calendar read-only (calendar.readonly); bot token

Send this to your assistant

Create a ClickRuntime automation: every day at 19:00, check tomorrow on my work and personal Google Calendars and send me a Telegram message if any events overlap or leave less than 10 minutes between them. Ignore all-day events and ones I declined.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

Double bookings happen when invites come from several people and booking pages, or when work and personal calendars live apart. You notice the clash the next morning when it is too late to move anything politely.

This automation checks tomorrow's schedule at 19:00 and sends a short Telegram warning only when two events overlap or sit too close together. You have the evening to reschedule or send an apology.

It suits managers, consultants and parents juggling a work calendar with a family one.

What you get out of it

  • Time to fix it

    An evening warning leaves time to move a meeting before anyone is waiting.

  • Across calendars

    Work and personal events are checked together, which Google Calendar does not do for you.

  • Catches tight gaps

    Meetings with no time to travel or prepare are flagged along with true overlaps.

  • Ignores what does not count

    Declined invites, free blocks and all-day events are left out.

  • Silent on good days

    No message means tomorrow is clear.

How it works

What happens, step by step

  1. At 19:00 each day, ClickRuntime reads tomorrow's events from the calendars you chose.

  2. It leaves out all-day events, events marked free and invites you declined.

  3. It looks for events that overlap and pairs with less than 10 minutes between them.

  4. If it finds any, your bot sends a list so you can move something tonight. On clear days nothing is sent.

Before it runs live

  • Connect Google Calendar
  • Connect Telegram

What you get

RunsOn a schedule
Get a Telegram warning about tomorrow's calendar clashestoday, 9:00Succeeded
Telegram · your bot⚠️ Tomorrow has 2 clashes • 10:00 Design review overlaps 10:30 Dentist (personal) • 15:00 Client call ends 15:00, 15:05 Board prep starts (5 min gap)

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • 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

  • Run it at a different time, more or less often, or only on weekdays
  • 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 Google Calendar and Telegram steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
get_a_telegram_warning_about_tomorrow_s_calendar_clashes.pyexample
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http

CALENDARS = {"primary": "work", "you.personal@gmail.com": "personal"}
TZ, CHAT_ID, MIN_GAP = ZoneInfo("Europe/Berlin"), "123456789", 10

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):
    cal = build("calendar", "v3", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
    start = datetime.now(TZ).replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1)
    events = []
    for cid, label in CALENDARS.items():
        for e in cal.events().list(calendarId=cid, timeMin=start.isoformat(), timeMax=(start + timedelta(days=1)).isoformat(),
                                   singleEvents=True, orderBy="startTime").execute().get("items", []):
            me = next((a for a in e.get("attendees", []) if a.get("self")), {})
            if "dateTime" not in e["start"] or e.get("transparency") == "transparent" or me.get("responseStatus") == "declined":
                continue
            events.append((datetime.fromisoformat(e["start"]["dateTime"]).astimezone(TZ),
                           datetime.fromisoformat(e["end"]["dateTime"]).astimezone(TZ), e.get("summary", "(no title)"), label))
    events.sort()
    issues = []
    for i, (s1, e1, t1, l1) in enumerate(events):
        for s2, e2, t2, l2 in events[i + 1:]:
            if s2 < e1:
                issues.append(f"• {s1:%H:%M} {t1} overlaps {s2:%H:%M} {t2} ({l2})")
            elif (s2 - e1) < timedelta(minutes=MIN_GAP):
                issues.append(f"• {t1} ends {e1:%H:%M}, {s2:%H:%M} {t2} starts ({int((s2 - e1).total_seconds() // 60)} min gap)")
            else:
                break
    if issues:
        tg("sendMessage", chat_id=CHAT_ID, text=f"⚠️ Tomorrow has {len(issues)} clashes\n" + "\n".join(issues))
    return {"clashes": len(issues)}

FAQ

Common questions

Can it compare a work and a personal calendar?
Yes, if both calendars are visible to the Google account you connect, for example by sharing your personal calendar with your work account.
Why warn about short gaps?
Back-to-back meetings in different places are clashes in practice. The 10-minute gap is a setting you can change or turn off.
Will it message me every evening?
Only when there is something to fix. Days without clashes send nothing.
What permissions does it need?
Calendar read-only (calendar.readonly); bot token. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it runs (on a schedule). Checks that find nothing to do and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Get a Telegram warning about tomorrow's calendar clashes” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.