monday.com Time Tracking to Billing
On a schedule, the flow reads logged time from a monday.com time-tracking column across client boards, aggregates billable hours by client/project, and creates draft invoices in Dataverse (or QuickBooks/Xero), then posts a billing summary to finance in Teams. Turns tracked time into invoices without manual compilation.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow turns monday.com tracked time into draft invoices. On a monthly schedule it reads logged time from a time-tracking column across one or more client boards (via the monday.com MCP connector running GraphQL), aggregates billable hours by client/project, applies a configurable rate map, creates a Draft Invoice record in Dataverse per client/project, and emails a consolidated billing summary to finance.
Why it matters: Compiling billable time by hand is slow and error-prone. Automating the aggregation and draft-invoice creation speeds the billing cycle and reduces revenue leakage, while keeping a human review gate (invoices land as Draft).
Status: Built and published in the default environment. Ships Off (demo) — going live requires only authorizing the three connections and setting the environment variable values.
Use Case
A services firm tracks billable time in monday.com client boards and wants periodic, automatically-compiled draft invoices for finance to review and finalize, rather than manually tallying hours each month.
Flow Architecture
Recurrence Monthly Billing Run
Recurrence (Month / 1)Runs the billing cycle monthly.
Initialize Correlation Id
InitializeVariableguid() stamped on every invoice + the email for traceability.
Initialize config variables
InitializeVariableLoad Client Board Ids, Time Column Id, Rate Map, Monday Tool Name, Finance Email; set Billing Period (yyyy-MM), Summary Rows accumulator, and Board Array.
Open Monday MCP Session
monday.com InvokeMondayMCP (initialize)Opens an MCP session, returns Mcp-Session-Id; captured into Session Id variable.
Apply to each Client Board
ForeachPer board: query time logs via GraphQL, parse, then per time entry compute billable hours, client, project, rate, and amount, create a Draft Invoice in Dataverse, and append an HTML row to the summary.
Send Billing Summary Email
Outlook SendEmailV2Emails the consolidated summary to finance.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_ClientBoardIds | String | 1234567890,1234567891 | Comma list of monday board IDs to read. |
| flowlibs_TimeColumnId | String | time_tracking | The time-tracking column id on each board. |
| flowlibs_RateMap | String | {"default":125} | JSON client->hourly-rate map with a 'default' key. |
| flowlibs_MondayMcpToolName | String | all_monday_api | monday MCP tool used to run GraphQL (reused existing var). |
| flowlibs_FinanceEmail | String | finance@your-tenant.onmicrosoft.com | Billing summary recipient. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| monday.com | shared_mondaycom | InvokeMondayMCP |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- QuickBooks / Xero
- Replace the Dataverse CreateRecord with the accounting connector to create invoices directly in the billing system.
- Approval gate
- Add an Approvals action before finalizing so finance approves draft invoices.
- Billable vs internal
- Add a status/billable column filter in the GraphQL query or a Filter array to exclude non-billable time.
- Rate by role
- Extend the Rate Map JSON to key on client+role and read a role column from monday.
- Time parsing
- Compose Billable Hours reads the column text as a number; adjust the expression if your time column stores a duration string (e.g. HH:MM:SS).
- Schedule
- Change the Recurrence frequency/interval for weekly or bi-weekly billing.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01monday GraphQL (per board)
Builds the per-board read query with an aliased time column.
EXPR.02Parse GraphQL response
Parses the first board from the GraphQL response.
EXPR.03Billable hours
Reads the time column text as hours with a 0 fallback.
EXPR.04Rate lookup
Looks up the hourly rate by client with a default fallback.
EXPR.05Invoice amount
Computes hours x rate.
EXPR.06Session id capture
Captures the MCP session id from the initialize response.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.