The moment it happens
Mark monday.com parent items Done when subitems are
When the last subitem of a monday.com item is set to Done, the parent item is set to Done too, and reopened if a subitem is reopened.
- Runs
- The moment it happens
- Apps
- monday.com
- AI
- Not needed
- Access
- boards:read, boards:write, webhooks:write
Send this to your assistant
Create a ClickRuntime automation: when a subitem's status changes on my Projects board in monday.com, check all subitems of its parent. If they are all Done, set the parent's status to Done. If the parent is Done but a subitem is not, set the parent back to Working on it.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Subitems break a big item into steps, but the parent's status does not follow them. Teams finish every step and the parent still says Working on it until someone notices.
Setting the parent from its subitems keeps the main board, dashboards and reports honest without anyone checking each item by hand.
It works in both directions: if a step is reopened, the parent stops saying Done, so finished-looking work is really finished.
What you get out of it
Parents stay accurate
The main item shows Done as soon as the last step is finished.
Reopens are caught
If a subitem goes back to work, the parent is moved out of Done.
Dashboards add up
Charts and reports built on parent status match the real progress.
Instant
The change happens seconds after the subitem is updated.
Only changes when needed
If the parent already has the right status, nothing is written.
How it works
What happens, step by step
A monday.com webhook tells ClickRuntime whenever a subitem's column changes.
It reads the parent item and the status of every subitem under it.
If all subitems are Done, the parent is set to Done.
If the parent was Done and a subitem is reopened, the parent goes back to Working on it.
Before it runs live
- Connect monday.com
- 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 monday.com steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_event, credentials, http
DONE, REOPENED = "Done", "Working on it"
PARENT = """query ($id: [ID!]) { items(ids: $id) { name board { id }
column_values(ids: ["status"]) { text }
subitems { name column_values(ids: ["status"]) { text } } } }"""
SET = """mutation ($board: ID!, $item: ID!, $value: String!) {
change_simple_column_value(board_id: $board, item_id: $item, column_id: "status", value: $value) { id } }"""
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_event
def handle(event):
body = event.json or {}
if "challenge" in body:
return {"challenge": body["challenge"]}
ev = body.get("event", {})
parent_id = ev.get("parentItemId")
if not parent_id or ev.get("columnId") != "status":
return {"skipped": "not a subitem status change"}
parent = monday(PARENT, id=[parent_id])["items"][0]
subs = parent["subitems"] or []
done = sum(1 for s in subs if s["column_values"][0]["text"] == DONE)
current = parent["column_values"][0]["text"]
target = DONE if subs and done == len(subs) else (REOPENED if current == DONE else None)
if not target or target == current:
return {"parent": parent["name"], "done": f"{done}/{len(subs)}", "changed": False}
monday(SET, board=parent["board"]["id"], item=parent_id, value=target)
return {"parent": parent["name"], "done": f"{done}/{len(subs)}", "status": f"{current} → {target}"}FAQ
Common questions
Which board do I add the webhook to?
Can it show progress, like 3 of 4 done, on the parent?
Our status labels are different. Will it work?
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
Add form entries to a monday.com board
Each new form entry becomes an item on your board, with its fields filled into the right columns.
See how it worksLog app errors as monday.com items
Errors from your systems land on a board as items with the message, source and time, ready to assign.
See how it worksHear about new board items in Slack
Your channel gets a message with the item's name and key columns whenever something is added to the board.
See how it worksKeep exploring
Set up “Mark monday.com parent items Done when subitems are” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.