The moment it happens
Email clients from Gmail when monday.com work is Done
When an item on a monday.com board is set to Done, the address in its Email column gets a completion email sent from your Gmail.
- Runs
- The moment it happens
- Apps
- Gmail, monday.com
- AI
- Not needed
- Access
- boards:read, boards:write, webhooks:write; Gmail (gmail.send)
Send this to your assistant
Create a ClickRuntime automation: when an item on my Client Requests board in monday.com changes to Done, send an email from my Gmail to the address in the item's Email column saying the request is complete, then add an update on the item noting the email was sent. Send once per item.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Clients who send a request want to know when it is finished. Closing the item on the board does nothing for them, and a follow-up email is easy to forget.
Sending the email when the status changes to Done means every client hears back, the same minute the work is marked finished.
Because it is sent from your own Gmail, the message looks like normal correspondence and replies land in your inbox.
What you get out of it
Every client hears back
No finished request is left without a reply.
Sent from your address
Replies come straight to your inbox, and the email sits in your Sent folder.
Noted on the item
An update records when and to whom the email was sent.
Once per item
Reopening and closing an item does not send a second email.
Skips items without an email
Internal items with no client address are ignored.
How it works
What happens, step by step
A monday.com webhook tells ClickRuntime when an item's status changes.
When it changes to Done, ClickRuntime reads the client's email address from the item.
A short email goes out from your Gmail account, so replies come back to you.
An update is added to the item noting when the email was sent, and each item is emailed only once.
Before it runs live
- Connect Google through your own Google app (a one-time, 10-minute setup), so it works with your own Gmail
- 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 Gmail and monday.com steps into one automation
Under the hood
The code that runs this automation
import base64
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_event, credentials, http, state
SIGNATURE = "Thanks,\nSam\nAcme Web Services"
ITEM = """query ($id: [ID!]) { items(ids: $id) { name column_values(ids: ["email"]) { text } } }"""
NOTE = """mutation ($item: ID!, $body: String!) { create_update(item_id: $item, body: $body) { 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", {})
if ((ev.get("value") or {}).get("label") or {}).get("text") != "Done":
return {"skipped": "not Done"}
item_id = str(ev["pulseId"])
sent = state.get("sent") or []
if item_id in sent:
return {"skipped": "already emailed"}
item = monday(ITEM, id=[item_id])["items"][0]
to = (item["column_values"][0]["text"] or "").split(" ")[0]
if "@" not in to:
return {"skipped": "no client email"}
msg = EmailMessage()
msg["To"], msg["Subject"] = to, f"Your request is complete: {item['name']}"
msg.set_content(f"Hi,\n\nYour request \"{item['name']}\" is now complete.\n\n"
f"If anything doesn't look right, just reply to this email.\n\n{SIGNATURE}")
gmail = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
gmail.users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}).execute()
monday(NOTE, item=item_id, body=f"Completion email sent to {to}")
state.set("sent", (sent + [item_id])[-5000:])
return {"emailed": to}FAQ
Common questions
Will the email come from my address?
Can the email include more detail, like what was done?
What if I mark something Done by mistake?
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
Start onboarding in monday.com and send a welcome email
When a client or new hire fills in your form, an onboarding item with all its steps is created in monday.com and they get a welcome email.
See how it worksTurn labelled Gmail emails into monday.com items
Emails you label in Gmail become items on a monday.com board with the sender and full text, and the label is cleared once logged.
See how it worksGet a monthly lead report from your monday.com board
On the 1st of each month you get an email summarising your leads by status and source, with short AI commentary.
See how it worksKeep exploring
Set up “Email clients from Gmail when monday.com work is Done” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.