Case study · monday.com · monday code
Time in status on monday.com, saved as numbers
monday.com shows an item's status, but not how long it has been there. We built an app that writes the hours spent in each status into number columns, fires a trigger when an item is stuck too long, and can point out where a board slows down. It runs on monday code, monday.com's own hosting. It is our own product, built and shipped by our team.
| Item | Status | Time in Waiting (h) |
|---|---|---|
| Renewal, Aldridge | Waiting on client | 62.5 |
| Onboarding, Peak Fit | In progress | 18.0 |
| Migration, Northbay | Done | 9.25 |
The problem
How long has this been waiting?
Regular monday.com boards have no time-in-status column, and each workaround breaks somewhere. A date stamped by an automation holds one date, so when an item returns to a status the earlier stay is lost. Formula results can't trigger automations and aren't always recognised by charts. A Time Tracking column counts only once its timer stops, so nothing can act on "in Review for more than 24 hours". The activity log has every change, but as a list, and older changes drop off when the plan's retention window passes. The SLA column exists only in monday service.
Teams want one number per status that formulas, filters and dashboards can use, and an alert when something waits too long.
What we built
Blocks for monday's own automation builder
The app adds two actions, one trigger and a board view, so teams build the logic in monday's own automation builder. It writes only to columns it manages and never changes a status or moves an item on its own.
Track time in status
An automation action that writes the hours spent in each status into number columns, such as Time in Review (h), and the moment the current stay began into a Status since date column.
Item stuck in status
A workflow trigger. When an item has been in a status for more than N hours, run any monday action: notify, reassign or change the status. It fires once per stay.
Record cycle time
An action that writes the hours between entering one status and entering another, for lead time or time to first response.
Board view and AI check
A view with live durations per item and an account-wide summary. One click asks AI which statuses slow the board down and what to try.
Engineering
The hard parts, and how we solved them
- Numbers, not text. Hours go into number columns the app creates, or adopts when one with the same title exists. It writes to no other column, and if someone deletes a managed column, it refreshes the board's columns and tries again.
- History from before the install. The first time the app sees an item, it reads the board's activity log and rebuilds each stay in that status column from when the item was created, so totals are right from day one. If part of the history is already past the retention window, the current stay starts from when the status was last set. After that the app keeps its own record of every change, so totals survive once the log has dropped them.
- Late and duplicate events. A change can arrive from an automation and from a board webhook, sometimes twice or late. Repeats change nothing, older changes are ignored, and each item record carries a version number, so two updates at once can't overwrite each other.
- No stored monday tokens. monday sends a short-lived token, valid for about five minutes, with each request. The app does its reads and writes inside that request and never stores a long-lived token. Every request from monday is verified, by its signed token or a webhook id the app registered, before anything is read or written.
- A scheduled SLA scan. Turning on the trigger registers a board webhook on the status column and creates a timer for each item already in the watched status. A monday code scheduler job runs every five minutes and fires each due timer once, through monday's trigger webhook with a signed request. A failed call is retried up to five times with growing delays.
- AI that never sees item names. The analysis sends one board's column titles, status names, item counts and hours per status. No item names, ids, people, updates or files, and nothing until someone clicks the button. A board's result is reused for up to six hours, each account gets up to 25 analyses a day, and every reply is checked against a fixed format.
- Working inside monday code. monday code's document database supports only simple filters, so records are keyed for direct lookups by account, board, item and column. An uninstall event deletes every record for that account at once.
Result
Where it is now
Work started on 25 September 2026. The next day the app was running on monday code and passed a live test on a real board. Version 2, which added the AI analysis, went live the same day. We submitted the app to the monday.com marketplace on 29 September 2026. The listing is still in review, and the app can be installed now from a direct link.
On 25 October 2026 monday's security team asked for a patched Node.js release within 48 hours. We pinned the new version and redeployed the live app the next day, and monday's dependency scan for that deploy showed no findings. The code has 73 automated tests, including storage tests run against both an in-memory store and a real MongoDB database.