Skip to content

On a schedule

Post monday.com items due today to Slack by person

Every weekday morning, a Slack channel gets the monday.com items due today or overdue, grouped by owner and mentioning each one.

Runs
On a schedule
Apps
Slack, monday.com
AI
Not needed
Access
boards:read, users:read; users:read, users:read.email, chat:write

Send this to your assistant

Create a ClickRuntime automation: every weekday at 9am, read my Projects board in monday.com, find items that are not Done and are due today or overdue, group them by owner, and post one message to #team that mentions each owner in Slack.

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

Due dates on a monday.com board only help if people look at them. Most people check the board when they remember, which is often after the date has passed.

A morning message in the team channel puts today's deadlines in front of everyone, and the mention makes sure each owner gets a notification.

Grouping by person keeps it short to read: each owner finds their own name and sees only their items.

What you get out of it

  • Owners get pinged

    Each person is mentioned in Slack, so their deadlines show up in their notifications.

  • Overdue work is visible

    Items past their date stay in the list with how long they have been overdue.

  • Unassigned items surface

    Due items with no owner get their own group, so someone can pick them up.

  • One message, not dozens

    The whole team's list arrives as a single post each morning.

  • Links to every item

    Each line opens the item in monday.com, ready to update.

How it works

What happens, step by step

  1. Each weekday at 9am ClickRuntime reads your monday.com board.

  2. It keeps items that are not Done and whose due date is today or earlier.

  3. Items are grouped by owner, and each owner's monday.com email is matched to their Slack account so they get mentioned.

  4. One message goes to the channel, with overdue items marked and a link to each item.

Before it runs live

  • Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
  • Connect monday.com

What you get

RunsOn a schedule
Post monday.com items due today to Slack by persontoday, 9:00Succeeded
Slack · #team📅 Due today on Projects (5) @Maya Chen • Homepage copy review – due today • Partner deck – overdue since Nov 7 @Leo Park • Fix checkout tax bug – due today Unassigned • Order event swag – overdue since Nov 6

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 Google Sheets
  • Combine it with other Slack and monday.com 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.
post_a_daily_slack_digest_of_monday_com_items_due_today_by_person.pyexample
from collections import defaultdict
from datetime import date
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from clickruntime import on_trigger, credentials, http

BOARD, CHANNEL = 1234567890, "#team"
ITEMS = """query ($board: [ID!]) { boards(ids: $board) { name items_page(limit: 500) { items {
  name url column_values(ids: ["status", "date", "person"]) { id text
    ... on PeopleValue { persons_and_teams { id kind } } } } } } }"""
USERS = """query ($ids: [ID!]) { users(ids: $ids) { id email } }"""
def monday(query, **variables):
    resp = http.post("https://api.monday.com/v2", json={"query": query, "variables": variables},
                     headers={"Authorization": credentials.secret("MONDAY_API_TOKEN"), "API-Version": "2024-10"})
    resp.raise_for_status()
    return resp.json()["data"]

@on_trigger
def run(event):
    board = monday(ITEMS, board=[BOARD])["boards"][0]
    today = date.today().isoformat()
    groups, owner_ids = defaultdict(list), set()
    for i in board["items_page"]["items"]:
        c = {v["id"]: v for v in i["column_values"]}
        due = c["date"]["text"] or ""
        if not due or due > today or c["status"]["text"] == "Done":
            continue
        people = [p["id"] for p in c["person"].get("persons_and_teams") or [] if p["kind"] == "person"]
        owner = people[0] if people else None
        owner_ids.update(people[:1])
        note = "due today" if due == today else f"overdue since {due}"
        groups[owner].append(f"• <{i['url']}|{i['name']}> – {note}")
    if not groups:
        return {"due": 0}
    slack = WebClient(token=credentials.connection("slack", "work"))
    emails = {u["id"]: u["email"] for u in monday(USERS, ids=list(owner_ids))["users"]} if owner_ids else {}
    blocks, total = [], 0
    for owner, lines in groups.items():
        name = "Unassigned"
        if owner:
            try:
                name = "<@" + slack.users_lookupByEmail(email=emails[str(owner)])["user"]["id"] + ">"
            except (SlackApiError, KeyError):
                name = emails.get(str(owner), "Unknown owner")
        blocks.append(name + "\n" + "\n".join(lines))
        total += len(lines)
    slack.chat_postMessage(channel=CHANNEL, text=f"📅 Due today on {board['name']} ({total})\n\n" + "\n\n".join(blocks))
    return {"due": total, "owners": len(groups)}

FAQ

Common questions

What if someone's monday.com email is different from their Slack email?
They are listed by email instead of mentioned. Everyone still sees their items; only the notification is missed.
Can each person get their list as a direct message instead?
Yes. Ask your assistant to post each owner's list to their Slack user ID instead of the channel. The same chat:write scope covers it.
Does it skip weekends?
Yes. It runs Monday to Friday. Items that fall due on a weekend show as overdue on Monday.
What permissions does it need?
boards:read, users:read; users:read, users:read.email, chat:write. 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 “Post monday.com items due today to Slack by person” from your assistant

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