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.
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
Each weekday at 9am ClickRuntime reads your monday.com board.
It keeps items that are not Done and whose due date is today or earlier.
Items are grouped by owner, and each owner's monday.com email is matched to their Slack account so they get mentioned.
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
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
- 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
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?
Can each person get their list as a direct message instead?
Does it skip weekends?
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
Alert Slack when monday.com items get stuck
When an item on your monday.com board is marked Stuck, Slack gets a message with the owner and a link.
See how it worksPost a weekly progress report from monday.com to Slack
Each week, progress against targets on your monday.com board is posted to Slack, with at-risk items called out.
See how it worksPost finished monday.com items to Slack #wins
When an item on a monday.com board is set to Done, #wins gets a message with the item, its owner and a link.
See how it worksKeep exploring
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.