How to Reconcile Deputy Timesheets Against Monday Project Tasks
Build a Spojit workflow that runs on a schedule, compares approved Deputy timesheet hours against the hours logged on Monday.com project items, and flags any mismatch for review.
What This Integration Does
When your team records worked hours in Deputy and also logs effort against project tasks in Monday.com, the two numbers drift apart: someone forgets to log a task, fat-fingers an hours field, or splits a shift across the wrong board. This workflow closes that gap. On a fixed schedule it pulls the approved timesheets from Deputy for a period, reads the hours captured on your Monday.com project items, lines them up per employee, and surfaces every row where the totals do not match so a coordinator can correct one side or the other before payroll or billing runs.
It runs unattended on a Schedule trigger (for example every weekday morning), so nobody has to remember to reconcile by hand. Each run reads from both systems, computes the difference, and writes a flag back to Monday.com only where a mismatch exists. The workflow is read-mostly: it never edits Deputy, and on the Monday.com side it only posts an update (a comment) or sets a status on the items that fail the check, so re-running it is safe and simply refreshes the flags rather than duplicating data.
Prerequisites
- A Deputy connection in Spojit (added under Connections → Add connection), with permission to read timesheets and employees.
- A Monday.com connection in Spojit, with access to the board that holds your project tasks.
- The Monday.com board ID for the project board you want to reconcile, plus the column IDs for the hours column and (optionally) a status/flag column. You can find both with the
list-boardsandget-boardtools on the Monday.com connector. - A shared key that ties a Deputy employee to their Monday.com items, such as the employee name or an employee ID stored in a Monday.com column.
- An IANA timezone for the schedule (for example
Australia/Sydney) so the run lands at a sensible local hour.
Step 1: Add a Schedule trigger
Start a new workflow and set the Trigger node type to Schedule. Add a 5-field Unix cron expression and a timezone. To run at 7am on weekdays, use:
cron: 0 7 * * 1-5
timezone: Australia/Sydney
A single Schedule trigger can hold multiple schedules if you want both a morning and an afternoon pass. The trigger output is {{ scheduledAt }}, which you can carry through as the reconciliation timestamp.
Step 2: Pull approved timesheets from Deputy
Add a Connector node in Direct mode, choose the Deputy connector, and select the list-timesheets tool to return the timesheet records for the period you are reconciling. Name the output so later steps can read it, for example deputy_timesheets.
If you only want approved hours, follow this with a Transform node that keeps records whose approval state is set, and that reduces each record to the fields you care about: the employee, the hours worked, and the date. A trimmed shape per row looks like:
{
"employee": "Jordan Lee",
"hours": 7.5,
"date": "2026-06-19"
}
Group these rows by employee so you end up with one total per person. If you prefer to reconcile a single person or a specific record, the get-timesheet tool accepts an id and returns that one timesheet.
Step 3: Read logged hours from Monday.com
Add another Connector node in Direct mode, choose the Monday.com connector, and select the list-items tool. Set boardId to your project board, set limit (default 25), and capture the output as monday_items. Each item returns its name and an array of column_values with id, text, and value for every column.
Use a Transform node to pull the hours figure out of the column whose ID matches your hours column, and the employee key out of the column that holds the assignee or employee ID. Produce the same per-employee shape you built for Deputy:
{
"employee": "Jordan Lee",
"logged_hours": 6.0,
"item_id": "987654321"
}
If the board holds more rows than one page returns, the list-items tool also returns a cursor; pass it back into a follow-up call (or a Loop node) to page through the rest.
Step 4: Compare the two sides
Add a Transform node that joins {{ deputy_timesheets }} and {{ monday_items }} on the shared employee key and computes the difference between approved Deputy hours and logged Monday.com hours. Output a list of comparison rows, marking each as matched or mismatched:
[
{
"employee": "Jordan Lee",
"approved_hours": 7.5,
"logged_hours": 6.0,
"delta": 1.5,
"item_id": "987654321",
"mismatch": true
}
]
Apply a small tolerance (for example treat a delta under 0.25 hours as a match) so rounding does not raise false flags. Keep the item_id on every row so the next step can write back to the exact Monday.com item.
Step 5: Loop the mismatches and decide whether to flag
Add a Loop node in ForEach mode over your comparison rows. Inside the loop, add a Condition node that checks whether {{ row.mismatch }} is true. Route the true branch into the flagging step and leave the false branch empty so matched rows are skipped. This keeps the workflow writing only to the items that genuinely disagree, which is what makes re-runs idempotent.
Step 6: Flag the mismatched item in Monday.com
On the true branch, add a Connector node in Direct mode for the Monday.com connector and use the create-update tool to post a comment on the offending item. Set the item to {{ row.item_id }} and write a body that spells out the discrepancy:
Timesheet reconciliation ({{ scheduledAt }}):
Deputy approved {{ row.approved_hours }}h vs Monday logged {{ row.logged_hours }}h
Delta: {{ row.delta }}h - please review.
If your board has a dedicated status or flag column, you can instead (or also) use the update-item tool with boardId, itemId set to {{ row.item_id }}, and a columnValues object keyed by your status column ID to set it to a "Needs review" label.
Step 7: Send a summary to the coordinator
After the loop, add a Send Email node so a person gets a single digest rather than watching the board. Set Recipients to your scheduling coordinator, a templated Subject such as Timesheet reconciliation: {{ mismatch_count }} flagged, and a Body that lists each flagged employee and delta. The built-in mail service needs no connection; external recipients must be on the org allowlist under Settings → General → Email recipients. If you would rather not email when everything matched, wrap this node in a Condition that only fires when the mismatch count is above zero.
Tips
- Reconcile a clearly bounded period (yesterday, or the current week) rather than all-time, so each run reads a predictable amount of data and the deltas stay meaningful.
- Store your hours and status column IDs in workflow variables at the top of the run; column IDs are stable but easy to mistype, and centralising them makes the workflow easy to repoint at another board.
- If you need judgement (for example matching "J. Lee" in Deputy to "Jordan Lee" in Monday.com), switch the comparison step to a Connector node in Agent mode with a Response Schema so the intelligent layer returns clean, structured comparison rows. Reserve this for the fuzzy cases since Agent mode costs AI credits.
- Ask Miraxa, the intelligent layer across your automation, to scaffold the skeleton for you: "Build a workflow on a weekday Schedule trigger that lists Deputy timesheets, lists Monday.com items, and loops mismatches into a create-update call." Then fine-tune each node in the properties panel.
Common Pitfalls
- Timezone drift. The cron field runs in the IANA timezone you set, not the viewer's. If a 7am run lands at midnight for the team, the period you read will be a day off; pick the timezone of the workforce you are reconciling.
- Unit mismatches. Deputy may express worked time differently from the hours number stored in a Monday.com column. Normalise both sides to the same unit (decimal hours) in the Transform step before subtracting, or every row will look like a mismatch.
- Pagination gaps. The Monday.com
list-itemstool returns a page plus acursor. If your board has more items than thelimit, follow the cursor; otherwise you silently reconcile only the first page. - Brittle name joins. Joining purely on display name breaks the moment a name is spelled differently in the two systems. Where you can, key the join on a stable employee ID stored in a Monday.com column.
Testing
Before scheduling it, point the workflow at a single test board and one or two employees, then use the Run button on the Schedule trigger to fire it on demand. Walk the execution log node by node: confirm the Deputy and Monday.com reads return the rows you expect, that the comparison Transform produces correct deltas, and that only mismatched items receive a create-update comment. Deliberately set one Monday.com item's hours to a wrong value and verify it gets flagged while the matching rows do not. Once a manual run behaves correctly end to end, enable the Schedule trigger so it runs unattended.