Connect Retool to Monday.com using Retool's GraphQL Resource type pointed at Monday's GraphQL API endpoint. Authenticate with a Monday.com API token, write GraphQL queries to fetch boards, items, and updates, then build cross-board reporting dashboards that Monday's native views cannot provide for operations teams.
| Fact | Value |
|---|---|
| Tool | Monday.com |
| Category | Productivity |
| Method | REST API Resource |
| Difficulty | Intermediate |
| Time required | 25 minutes |
| Last updated | April 2026 |
Build Monday.com Operations Dashboards in Retool
Monday.com's native views are powerful for day-to-day project management, but they fall short for operations teams that need cross-board visibility, custom aggregations, or data combined with external sources. Retool solves this by connecting directly to Monday's GraphQL API, letting you query any board, item, or column value and display the results in fully customizable tables, charts, and forms.
Monday.com uses GraphQL as its only API protocol — there is no REST alternative. This makes Retool's native GraphQL Resource type the right tool: it introspects the Monday schema automatically, provides type-aware autocomplete in the query editor, and handles pagination through cursor-based variables. You can query multiple boards in a single request, filter items by column values, and build dashboards that aggregate status counts, owner workloads, or due date distributions across an entire organization.
Common Retool apps built on Monday.com include: executive dashboards showing project health across all boards, team workload panels displaying item counts per assignee, escalation tools that surface overdue items filtered by priority, and write-back panels that update item statuses or add updates directly from Retool without requiring users to navigate Monday.
Integration method
Monday.com exposes all its data through a single GraphQL API endpoint at api.monday.com/v2. Retool supports GraphQL Resources natively, which means you can point a resource at Monday's endpoint, configure your API token, and use Retool's schema-aware GraphQL editor to write queries and mutations. All requests are proxied server-side through Retool, so credentials never reach the browser.
Prerequisites
- A Monday.com account with API access (available on all paid plans and the free trial)
- A Retool account with permission to create new Resources
- A Monday.com personal API token (generated from your profile settings)
- At least one Monday.com board with items you want to display in Retool
- Basic familiarity with GraphQL query syntax (variables, nested fields)
Step-by-step guide
Generate your Monday.com API token
Before creating a Retool Resource, you need a Monday.com personal API token. Log into Monday.com and click on your avatar in the bottom-left corner, then select 'Developers' from the menu. This opens the Developer Center. Click 'My Access Tokens' in the left sidebar, then click 'Show' next to the API v2 Token field. Copy this token — it is a long alphanumeric string starting with 'eyJhbGciOiJIUzI1NiJ9' or similar. This token authenticates all API calls and has the same permissions as your Monday.com account. Treat it like a password: store it in Retool's configuration variables, not in query code directly. Note that Monday.com also supports OAuth for team-level credentials, but personal access tokens are simpler for internal Retool tools where a single service account can own the integration.
Pro tip: Use a dedicated Monday.com service account (not a personal account) for production Retool integrations so the token persists even if individual team members leave.
Expected result: You have a Monday.com API token copied to your clipboard, ready to configure in Retool.
Create a GraphQL Resource in Retool
In your Retool workspace, navigate to the Resources tab in the top navigation and click 'Create New' → 'Resource'. Scroll through the list or search for 'GraphQL' — Retool has a dedicated GraphQL resource type, distinct from the generic REST API resource. Select it. In the configuration panel, set the Base URL to 'https://api.monday.com/v2'. This is Monday's single GraphQL endpoint — all queries and mutations go to this same URL. Under 'Headers', click 'Add header' and add two headers: the first with key 'Authorization' and value 'Bearer YOUR_TOKEN_HERE' (replace with the token from Step 1), and the second with key 'Content-Type' and value 'application/json'. Optionally, add an 'API-Version' header with value '2024-01' to pin to a specific Monday.com API version and avoid unexpected breaking changes. Name the resource 'Monday.com GraphQL' or similar. Click 'Test connection' — Retool will send a test introspection query. If successful, you will see a green checkmark. Click 'Create resource' to save.
1{2 "Base URL": "https://api.monday.com/v2",3 "Headers": {4 "Authorization": "Bearer {{ retoolContext.configVars.MONDAY_API_TOKEN }}",5 "Content-Type": "application/json",6 "API-Version": "2024-01"7 }8}Pro tip: Store your API token in Retool's configuration variables (Settings → Configuration Variables) and reference it as {{ retoolContext.configVars.MONDAY_API_TOKEN }} in the Authorization header rather than pasting the token directly.
Expected result: A new GraphQL Resource named 'Monday.com GraphQL' appears in your Resources list with a successful test connection.
Query boards and items with GraphQL
Open or create a Retool app. In the Code panel, click 'New query' and select your 'Monday.com GraphQL' resource. Retool's GraphQL query editor loads and automatically introspects the Monday.com schema, so you will see the available types in a schema explorer on the right. Write a GraphQL query to fetch your boards and their items. The Monday.com API uses the 'boards' query type as the primary entry point — you specify board IDs in the 'ids' argument or omit them to fetch all accessible boards. Each board contains 'items_page' (paginated items) and each item contains 'column_values' for field data. Run the query to confirm it returns data. The response will be nested JSON that you will reshape in the next step using a transformer.
1query GetBoardItems($boardId: ID!, $cursor: String) {2 boards(ids: [$boardId]) {3 id4 name5 items_page(limit: 50, cursor: $cursor) {6 cursor7 items {8 id9 name10 state11 created_at12 updated_at13 group {14 id15 title16 }17 column_values {18 id19 text20 value21 column {22 title23 type24 }25 }26 }27 }28 }29}Pro tip: Use Retool's GraphQL schema explorer (click the book icon in the query editor) to browse Monday's available fields without reading the API docs. Start by exploring the 'boards' query type.
Expected result: The query runs and returns a JSON response with board data including item names, statuses, and column values. The response is nested under data.boards[0].items_page.items.
Transform the nested GraphQL response
Monday.com's GraphQL API returns deeply nested JSON — items contain a 'column_values' array where each element represents a board column. To use this data in a Retool Table or Chart, you need to flatten it into a simple array of objects. Open the query's Advanced tab and click 'Add transformer'. Write a JavaScript transformer that maps over the items array and converts column_values into named properties. This makes the data directly bindable to Retool Table columns. For status columns, the 'text' field contains the label. For date columns, parse the 'value' field which is a JSON string containing a 'date' key. For people columns, 'text' contains the assignee name. The transformer runs automatically whenever the query data changes, and the result replaces query.data throughout your app.
1// Transformer: flatten Monday.com GraphQL response2const boards = data.boards || [];3if (boards.length === 0) return [];45const items = boards[0].items_page.items || [];67return items.map(item => {8 // Convert column_values array to an object keyed by column title9 const cols = {};10 (item.column_values || []).forEach(cv => {11 cols[cv.column.title] = cv.text || '';12 });1314 return {15 id: item.id,16 name: item.name,17 state: item.state,18 group: item.group?.title || '',19 status: cols['Status'] || '',20 owner: cols['Person'] || cols['Owner'] || '',21 due_date: cols['Due Date'] || cols['Date'] || '',22 priority: cols['Priority'] || '',23 created_at: new Date(item.created_at).toLocaleDateString()24 };25});Pro tip: Column titles in Monday.com are case-sensitive and match what you see in the board UI. If your board uses 'Assignee' instead of 'Person', update the transformer to match.
Expected result: The transformer output is a clean, flat array of item objects. The Table component bound to {{ query1.data }} now displays columns for name, status, owner, due_date, and priority.
Build the dashboard UI with Tables and Charts
Now that your data is flowing, build the dashboard layout. Drag a Table component onto the canvas and set its 'Data source' to {{ getBoardItems.data }}. Enable column filtering so users can filter by status or owner. Add a Chart component above the table — set its type to 'Bar' and configure it to aggregate item counts by status. For the Chart data, create a new JavaScript query (no resource needed) that groups items by status field. Add a TextInput component at the top for board ID input so users can switch between boards without editing query variables — bind the GraphQL query's boardId variable to {{ boardIdInput.value }}. Add event handlers to automatically re-run the board query whenever boardIdInput changes. For the mutation flow (updating an item's status), add a Button and create a second GraphQL query that runs the change_column_value mutation on the selected table row.
1// JavaScript query for Chart data: group items by status2const items = getBoardItems.data || [];3const counts = {};45items.forEach(item => {6 const status = item.status || 'No Status';7 counts[status] = (counts[status] || 0) + 1;8});910return Object.entries(counts).map(([status, count]) => ({11 status,12 count13}));Pro tip: Use Retool's Event Handlers on the boardIdInput component: set 'On change' to trigger the getBoardItems query. This gives users a responsive, interactive board selector without any button clicks.
Expected result: The dashboard displays a bar chart of item status distribution and a filterable table of all board items. Selecting a row enables write-back actions via mutation queries.
Add write-back with GraphQL mutations
A read-only dashboard is useful, but the real productivity gain comes from enabling status updates directly in Retool. Create a new query using the Monday.com GraphQL resource and write a change_column_value mutation. This mutation requires the board ID, item ID, column ID, and the new value formatted as a JSON string. The column ID for a status column is typically 'status' or a custom identifier visible in Monday's board settings under 'Customize columns'. Bind the mutation's item_id argument to {{ table1.selectedRow.id }}, the board_id to the same boardId variable used in the read query, and the value to a JSON string with the label index. Wire this mutation to a Button component's click event, and on success, trigger the read query to refresh the table. Add a Select component to let users choose the new status value from a dropdown bound to the mutation's value input.
1mutation UpdateItemStatus($boardId: ID!, $itemId: ID!, $columnId: String!, $value: JSON!) {2 change_column_value(3 board_id: $boardId4 item_id: $itemId5 column_id: $columnId6 value: $value7 ) {8 id9 name10 column_values {11 id12 text13 }14 }15}Pro tip: Monday.com status column values are set using a JSON string like '{"label":"Done"}' or '{"index":1}'. Use index values for reliability since label text can change if someone renames a status option.
Expected result: Selecting a row in the table and clicking the 'Update Status' button runs the mutation and refreshes the table with the new status value — the change is immediately visible in Monday.com.
Common use cases
Build a cross-board project health dashboard
Query multiple Monday.com boards simultaneously to display item status distributions, overdue counts, and owner workloads in a single Retool dashboard. Use Retool Charts to visualize status breakdowns and a Table to list all items filtered by priority or due date.
Build a Retool dashboard that queries 3 Monday.com boards, shows a bar chart of item statuses per board, and lists all high-priority overdue items in a sortable table with a button to update their status to 'Blocked'.
Copy this prompt to try it in Retool
Create a team workload and capacity panel
Pull all items assigned to each team member across boards and display workload distribution. Build a Retool app where managers can reassign items, add updates, and see unassigned items that need owners — all without leaving the internal tool.
Build a Retool app that shows a table of all Monday.com items grouped by assignee, with a count of open items per person, and a form to add an update to any selected item.
Copy this prompt to try it in Retool
Build an escalation and SLA tracking panel
Query items that have exceeded their expected completion date or have been in a specific status column for too long. Surface these in a Retool table with one-click actions to notify assignees or escalate to management by changing the item's priority column.
Create a Retool escalation dashboard that lists all Monday.com items where the due date is in the past and status is not 'Done', sorted by days overdue, with a button that changes the item's priority column to 'Critical'.
Copy this prompt to try it in Retool
Troubleshooting
Query returns '403 Forbidden' or 'User unauthorized' error
Cause: The API token in the Authorization header is invalid, expired, or missing the 'Bearer ' prefix. Monday.com tokens can also become invalid if the user's account is deactivated.
Solution: Regenerate the API token in Monday.com Developer Center → My Access Tokens. Ensure the Authorization header value starts with 'Bearer ' (with a space before the token). Confirm the token is stored in Retool's configuration variables and not hard-coded with extra whitespace.
GraphQL query returns empty data array despite boards existing in Monday.com
Cause: The board IDs passed to the query do not match any boards accessible to the authenticated user, or the boards query argument format is incorrect. Monday.com board IDs are numeric integers, not strings, in most query contexts.
Solution: Run a discovery query first with no IDs argument to list all accessible boards: query { boards { id name } }. Copy the correct numeric ID from the response and use it in subsequent queries. Note that Monday.com's GraphQL treats board IDs as ID scalars — pass them as integers in the variables object, not as quoted strings.
1// Discovery query to find your board IDs2query {3 boards(limit: 50) {4 id5 name6 board_kind7 state8 }9}Transformer returns undefined for column values that should have data
Cause: Column titles in Monday.com are case-sensitive and may differ from what you expect. The 'text' field for some column types (checkbox, formula) may be empty while the actual value is in the 'value' field as a JSON string.
Solution: Log the raw column_values array in the transformer to inspect actual column titles: console.log(item.column_values). Update the transformer to match the exact column title casing used in your board. For complex column types, parse the 'value' field with JSON.parse() after checking it is not null.
1// Debug: list all column titles and values for first item2const items = data.boards?.[0]?.items_page?.items || [];3if (items.length === 0) return [];4return items[0].column_values.map(cv => ({5 column_title: cv.column.title,6 column_type: cv.column.type,7 text: cv.text,8 raw_value: cv.value9}));Mutation returns 'ComplexityBudgetExhausted' error
Cause: Monday.com's API enforces complexity budget limits per minute. Complex queries that retrieve many items with many column values, or rapid successive queries in a Retool app, can exhaust the budget (1,000,000 complexity per minute on standard plans).
Solution: Reduce query complexity by requesting fewer column_values fields — only fetch the specific column IDs you need rather than all column_values. Use pagination (the cursor-based items_page limit argument) to fetch items in smaller batches. Add a debounce or throttle setting to the Retool query's execution options to prevent rapid re-runs.
1# Only fetch specific columns by their ID to reduce complexity2query GetBoardItemsLite($boardId: ID!) {3 boards(ids: [$boardId]) {4 id5 name6 items_page(limit: 25) {7 items {8 id9 name10 column_values(ids: ["status", "person", "date4"]) {11 id12 text13 }14 }15 }16 }17}Best practices
- Store Monday.com API tokens in Retool configuration variables marked as 'secret' — never reference them directly in query code where they could be exposed in app exports
- Use a dedicated Monday.com service account for your Retool integration rather than a personal user account, ensuring the token remains valid even when team members leave
- Pin the API version using the 'API-Version' header (e.g., '2024-01') to prevent unexpected breaking changes when Monday.com releases new API versions
- Request only the column IDs you need in column_values queries — fetching all columns on large boards significantly increases complexity costs and response times
- Implement cursor-based pagination for boards with more than 50 items — store the cursor value and pass it to subsequent queries rather than increasing the limit beyond 500
- Use Retool Workflows instead of in-app queries for batch operations like updating many items at once — Workflows support retry logic and run server-side without timeout concerns
- Build a board selector component (Select or TextInput) rather than hard-coding board IDs in queries, making the Retool app reusable across different Monday.com boards
- Add confirmation modals before running mutations that update or delete items — Monday.com mutations are immediately applied and cannot be undone from Retool
Alternatives
ClickUp uses a REST API with a simpler endpoint structure, making it easier to get started if your team prefers REST over GraphQL for project management data.
Asana offers a REST API with a native Retool connector option and better-known task hierarchy model for teams already familiar with its project structure.
Trello's simple REST API with API key and token auth is easier to integrate for teams building lightweight Kanban-style dashboards without complex column types.
Frequently asked questions
Does Retool have a native Monday.com connector?
No, Retool does not have a dedicated Monday.com native connector. You connect using Retool's GraphQL Resource type, which supports Monday.com's GraphQL API natively. This approach works well because Retool's GraphQL editor introspects the Monday schema automatically, giving you autocomplete and type safety.
Can I query multiple Monday.com boards in a single Retool query?
Yes. Monday.com's GraphQL API accepts an array of board IDs in the 'ids' argument. You can query multiple boards in one request: boards(ids: [1234567, 7654321]) { ... }. The response includes data for each board. Use a JavaScript transformer to merge and flatten the results into a single table.
How do I handle Monday.com API rate limits in Retool?
Monday.com uses a complexity-based rate limit (1,000,000 units per minute on standard plans). To stay within limits, request only the column IDs you need, use pagination with small page sizes (25-50 items), and avoid running queries on every keystroke. Set Retool queries to run 'manually' or with a debounce rather than on every component change.
Can I create new Monday.com items from Retool?
Yes, use the create_item GraphQL mutation. The mutation accepts a board_id, group_id, item_name, and column_values as a JSON string. Build a Retool Form component and wire its submit event to run the mutation with form field values as variables. After a successful creation, trigger the read query to refresh the table.
Why do my Monday.com column values show as empty strings?
Some Monday.com column types (like formula columns, mirror columns, or empty date fields) return an empty 'text' field. The actual value is in the 'value' field as a JSON string. Parse it with JSON.parse(cv.value) in your transformer. Also check that column titles in your transformer match the exact case used in your Monday board settings.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation