The moment it happens
Keep an audit log of monday.com approvals in Sheets
Every approval or status change on your monday.com board is recorded in a Google Sheet, and rejections are flagged in Slack.
- Runs
- The moment it happens
- Apps
- Google Sheets, monday.com
- AI
- Not needed
- Access
- monday.com read; Sheets edit
Send this to your assistant
Create a ClickRuntime automation: whenever the status changes on my Approvals board in monday.com, add a row to my Audit Log sheet with the time, item, old and new status, and who changed it. Post to #finance if something is rejected.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Finance, legal and operations teams use monday.com boards to approve spend, contracts and access requests. When an auditor or manager asks who approved something and when, the answer is buried in each item's activity log, if it is still there.
Writing every status change to a sheet as it happens gives you a simple, permanent audit trail. Flagging rejections in Slack makes sure the requester's team hears about them quickly.
What you get out of it
Answers for auditors
Who changed what and when is in one sheet, easy to filter and export.
A record outside the board
The log is kept even if items are archived or deleted on the board.
Rejections don't go unnoticed
A Slack message for each rejection means follow-up happens the same day.
Recorded as it happens
Changes are logged within seconds, so the record is complete.
How it works
What happens, step by step
monday.com tells ClickRuntime each time an item's status changes on your board.
ClickRuntime looks up the item name and the person who made the change.
A row is added to your audit sheet with the time, item, old and new status, and who changed it.
If the new status is Rejected, a message is also posted to your Slack channel.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- 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 Google Sheets and monday.com steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_event, credentials, http, notify
SHEET_ID = "your-spreadsheet-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"]
def sheets():
return build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False).spreadsheets().values()
@on_event
def handle(event):
body = event.json or {}
if "challenge" in body:
return {"challenge": body["challenge"]}
e = body.get("event") or {}
new = ((e.get("value") or {}).get("label") or {}).get("text", "")
old = ((e.get("previousValue") or {}).get("label") or {}).get("text", "")
who = monday("query ($u: [ID!]) { users(ids: $u) { name } }", u=[e.get("userId")])["users"]
row = [event.received_at, e.get("pulseName", ""), old, new, who[0]["name"] if who else str(e.get("userId"))]
sheets().append(spreadsheetId=SHEET_ID, range="Audit!A:E", valueInputOption="RAW", body={"values": [row]}).execute()
if new == "Rejected":
notify.slack(f"❌ Rejected: {row[1]} by {row[4]}", channel="#finance")
return {"logged": True}FAQ
Common questions
How does it know a status changed?
Does it record who made the change?
Can someone edit the log?
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
Log completed monday.com items to Google Sheets
Each time an item is set to Done on a monday.com board, a row with the owner, created date, finish time and days open is added to a Google Sheet.
See how it worksCreate monday.com items from new sheet rows
Tasks you add to a Google Sheet show up on your monday.com board within 15 minutes.
See how it worksLog a daily snapshot of your monday.com board
Every evening each item's status on your monday.com board is saved to a sheet, building a history for reporting.
See how it worksKeep exploring
Set up “Keep an audit log of monday.com approvals in Sheets” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.