

How to Send Monday.com Status Alerts to Slack with n8n
Automatically posts a Slack message to a designated channel whenever a Monday.com item changes status, is created, or hits a deadline.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Engineering or ops teams on self-hosted n8n who want formatted, conditional Slack notifications without paying per-task Zapier costs.
Not ideal for
Teams without a server or cloud n8n instance — use Make's free tier instead, which handles this out of the box with no hosting overhead.
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person product team uses this to post into #product-updates whenever a Monday.com task moves to 'Blocked' or 'Done'. Before this, the PM pinged the team in Slack manually, often an hour or two after the status changed. Now the message hits Slack within 30 seconds of the status change, including the assignee name and due date pulled directly from the item.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into n8n
Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Item ID | event.pulseId | |
| Board ID | event.boardId | |
| Column ID | event.columnId | |
| New Status Label | event.value.label | |
| Item Name | name | |
| Event Type | event.type | |
4 optional fields▸ show
| Board Name | board.name |
| Assignee Name | column_values.person.text |
| Due Date | column_values.date.text |
| Item URL |
Step-by-Step Setup
n8n Dashboard > Workflows > + New Workflow
Create a new n8n workflow
Log into your n8n instance and click the orange '+ New Workflow' button in the top right of the Workflows dashboard. Give it a name like 'Monday → Slack Status Alerts' so it's easy to find later. You'll land on a blank canvas with a single grey 'Start' node. You won't use that node — you'll delete it and set up a webhook trigger instead.
- 1Click '+ New Workflow' in the top right
- 2Click the workflow title at the top and rename it to 'Monday → Slack Status Alerts'
- 3Click the grey Start node and press Delete to remove it
Canvas > + > Search 'Webhook' > Webhook Node > Parameters
Add a Webhook trigger node
Click the '+' button on the canvas to open the node picker. Search for 'Webhook' and select it. In the node settings panel, set the HTTP Method to POST and note the webhook URL shown in the 'Test URL' field — you'll paste this into Monday.com in the next step. Keep Authentication set to None for now; you can add header auth later in production.
- 1Click '+' on the blank canvas
- 2Type 'Webhook' in the search box and click the Webhook node
- 3Set HTTP Method to POST
- 4Copy the Test URL shown in the node panel
Monday.com Board > ••• Menu > Integrations > Webhooks > Add Webhook
Configure Monday.com webhook integration
Open your Monday.com board in a new tab. Click the three-dot menu in the top right of the board and select 'Integrations', then 'Webhooks'. Paste the n8n webhook Test URL into the URL field. Select the events you want to capture: 'change_column_value' for status changes, 'create_item' for new items, and 'item_date_arrived' for deadline triggers. Monday.com will send a confirmation POST to the URL immediately — you'll verify this in n8n next.
- 1Open your Monday.com board
- 2Click the three-dot '•••' menu in the top right
- 3Select 'Integrations' then 'Webhooks'
- 4Click 'Add Webhook' and paste your n8n Test URL
- 5Check the boxes for 'change_column_value', 'create_item', and 'item_date_arrived'
- 6Click 'Subscribe'
n8n Canvas > Webhook Node > Listen for Test Event
Capture a test event from Monday.com
Back in n8n, click your Webhook node and then click 'Listen for Test Event' at the bottom of the panel. Switch to Monday.com and manually change any item's status column on your board. Within a few seconds, n8n will show 'Webhook called' and the raw JSON payload from Monday.com will appear in the Output panel on the right. Inspect the data — you'll see fields like event.pulseId, event.columnId, event.value.label, and event.boardId.
- 1Click the Webhook node to open its settings
- 2Click 'Listen for Test Event' at the bottom
- 3Switch to Monday.com and change any item status
- 4Return to n8n and confirm the Output panel shows JSON data
Canvas > + after Webhook > Monday.com Node > Operation: Get Item
Add a Monday.com node to fetch full item details
The webhook payload from Monday.com is minimal — it gives you IDs but not the item name, assignee, or board name. Add a Monday.com node after the Webhook to fetch the full item. Click '+' after the Webhook node, search for 'Monday.com', and select the 'Get Item' operation. Set the Item ID field to the expression {{ $json.event.pulseId }} using the expression editor. You'll need to connect your Monday.com account via API token in the credentials panel.
- 1Click '+' to the right of the Webhook node
- 2Search for 'Monday.com' and select the node
- 3Set Operation to 'Get Item'
- 4Click the Item ID field and switch to Expression mode
- 5Type {{ $json.event.pulseId }}
- 6Click 'Create New Credential' and paste your Monday.com API token
Canvas > + after Monday Node > IF Node > Conditions
Filter for status column changes only
Add an IF node after the Monday.com node to route only genuine status changes forward. The webhook fires for all column edits, so you need to check that the column being changed is actually a status column. In the IF node, set Condition 1 to: {{ $('Webhook').item.json.event.columnId }} equals 'status' — replace 'status' with the exact column ID from your board (visible in the test payload you captured in Step 4). For deadline events, add a second condition checking event.type equals 'item_date_arrived'.
- 1Click '+' after the Monday.com node
- 2Search for 'IF' and select the IF node
- 3Set Condition Value 1 to expression: {{ $('Webhook').item.json.event.columnId }}
- 4Set the operator to 'Equals'
- 5Set Condition Value 2 to your status column ID (e.g. 'status' or 'status_1')
- 6Click 'Add Condition' and add event.type = 'create_item' as an OR condition if you also want new item alerts
Canvas > + after IF Node (true branch) > Code Node > JavaScript Mode
Add a Code node to build the Slack message
Add a Code node after the 'true' branch of your IF node. This is where you build the formatted Slack message using Block Kit. The Code node lets you pull fields from both the Webhook payload and the Monday.com item lookup, combine them, and format the output as a structured Slack message object. Paste the code from the Pro Tip section below into the 'JavaScript' editor. The node outputs a single object with a blocks array ready to send to Slack.
- 1Click '+' on the 'true' output of the IF node
- 2Search for 'Code' and select the Code node
- 3Confirm the mode is set to 'Run Once for Each Item'
- 4Paste the JavaScript from the Pro Tip section into the code editor
- 5Click 'Test Step' to verify output
Paste this into the Code node added in Step 7. It reads from both the Webhook node and the Monday.com Get Item node, picks an appropriate emoji based on the new status label, formats a Slack Block Kit message with a header, field grid, and a direct link button to the Monday.com item.
JavaScript — Code Node// Node: Code (runs after Monday.com Get Item node)▸ Show code
// Node: Code (runs after Monday.com Get Item node)
// Mode: Run Once for Each Item
const webhookData = $('Webhook').item.json.event;... expand to see full code
// Node: Code (runs after Monday.com Get Item node)
// Mode: Run Once for Each Item
const webhookData = $('Webhook').item.json.event;
const mondayItem = $('Monday.com').item.json;
// Resolve human-readable values
const itemName = mondayItem.name || 'Unnamed Item';
const boardName = mondayItem.board?.name || 'Unknown Board';
const newStatus = webhookData.value?.label?.text || webhookData.value?.label || 'Unknown';
const eventType = webhookData.type;
const boardId = webhookData.boardId;
const pulseId = webhookData.pulseId;
// Resolve assignee from column_values
const personColumn = mondayItem.column_values?.find(col => col.type === 'multiple-person');
const assignee = personColumn?.text || 'Unassigned';
// Resolve due date from column_values
const dateColumn = mondayItem.column_values?.find(col => col.type === 'date');
const dueDate = dateColumn?.text || 'No due date';
// Build direct item URL
const itemUrl = `https://monday.com/boards/${boardId}/pulses/${pulseId}`;
// Pick emoji based on status label
const statusEmojis = {
'done': '✅',
'blocked': '🔴',
'in progress': '🔄',
'stuck': '⚠️',
'working on it': '🔄',
'new item': '🆕'
};
const statusKey = newStatus.toLowerCase();
const emoji = statusEmojis[statusKey] || '📋';
// Choose header text based on event type
let headerText;
if (eventType === 'create_item') {
headerText = `🆕 New Item: ${itemName}`;
} else if (eventType === 'item_date_arrived') {
headerText = `⏰ Deadline Reached: ${itemName}`;
} else {
headerText = `${emoji} Status Changed: ${itemName}`;
}
// Build Slack Block Kit message
const blocks = [
{
type: 'header',
text: { type: 'plain_text', text: headerText, emoji: true }
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: `*Board:*\n${boardName}` },
{ type: 'mrkdwn', text: `*Status:*\n${newStatus}` },
{ type: 'mrkdwn', text: `*Assigned to:*\n${assignee}` },
{ type: 'mrkdwn', text: `*Due Date:*\n${dueDate}` }
]
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'View in Monday.com', emoji: true },
url: itemUrl,
style: 'primary'
}
]
},
{
type: 'divider'
}
];
return [{ json: { blocks, itemName, boardName, newStatus, assignee, dueDate, itemUrl } }];channel: {{channel}}
ts: {{ts}}
Canvas > + after Code Node > Slack Node > Resource: Message > Operation: Send Message
Add a Slack node to post the message
Add a Slack node after the Code node. Set the operation to 'Send Message' and the Resource to 'Message'. Set the Channel field to the Slack channel ID or name where notifications should appear (e.g. #project-updates). Set the Blocks field to the expression {{ $json.blocks }} to use the formatted message from the Code node. Connect your Slack app credentials — you'll need a Slack app with chat:write and chat:write.public scopes installed in your workspace.
- 1Click '+' after the Code node
- 2Search for 'Slack' and select the Slack node
- 3Set Resource to 'Message' and Operation to 'Send Message'
- 4Set Channel to your target channel (e.g. #project-updates or the channel ID C0123ABCDEF)
- 5Click the Blocks field and set it to Expression: {{ $json.blocks }}
- 6Click 'Create New Credential' and follow the OAuth2 flow to connect your Slack app
Canvas > + after IF Node (false branch) > No Operation Node
Handle the 'false' branch to avoid silent failures
Connect a NoOp node to the 'false' output of the IF node. Without this, n8n will show execution errors for every non-status column change because the branch has no destination. A NoOp node terminates the 'false' branch cleanly. This also makes it easy to add future logic — for example, routing item creation events to a different Slack channel — by replacing the NoOp with a new branch.
- 1Click '+' on the 'false' output of the IF node
- 2Search for 'No Operation' and select it
- 3Leave all settings default
n8n Canvas > Test Workflow button (top right)
Test the full workflow end-to-end
Click 'Test Workflow' in the top right of the n8n canvas. This activates all nodes in test mode simultaneously. Switch to Monday.com and change a real item's status column. Watch n8n — each node should highlight green as the data flows through. Check your Slack channel to confirm the message arrived. Verify the item name, new status, assignee, and board name all appear correctly in the message.
- 1Click 'Test Workflow' in the top right of the canvas
- 2Switch to Monday.com and change any item status
- 3Return to n8n and watch the node execution indicators
- 4Open Slack and confirm the message appears in your target channel
n8n Canvas > Active Toggle (top right) | Monday.com Board > Webhooks > Edit URL
Activate the workflow for production
Click the grey toggle switch in the top right of the canvas to activate the workflow. The toggle turns orange and the workflow status changes to 'Active'. Go back to Monday.com's Webhooks settings and update the webhook URL from the Test URL to the Production URL shown in your Webhook node (copy it from the node's settings panel — look for 'Production URL' tab). From this point, every qualifying Monday.com status change will trigger a Slack message automatically without any manual intervention.
- 1Click the grey toggle in the top right of the n8n canvas
- 2Confirm it turns orange and shows 'Active'
- 3Click the Webhook node and copy the Production URL from the 'Production URL' tab
- 4Open Monday.com > Board > Integrations > Webhooks
- 5Edit your webhook and replace the Test URL with the Production URL
- 6Click Save
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use n8n for this if you're self-hosting or already on n8n Cloud and want zero per-task costs, need a Code node to format conditional Slack messages with Block Kit, or want full execution history without paying per operation. n8n's webhook trigger handles Monday.com events in real time with no polling delay, and the Code node lets you write the exact message logic you want without working around a UI builder. The one scenario where you'd skip n8n: if your team has no one comfortable reading a JSON payload and you're not on a server, Make's Monday.com + Slack scenario does this with a cleaner visual interface and runs free up to 1,000 operations/month.
Cost math is straightforward. Each Monday.com status change costs 3 n8n executions: Webhook node, Monday.com Get Item node, Slack node. If your team changes 200 item statuses per month, that's 600 executions/month. n8n Cloud's Starter plan ($20/month) includes 2,500 executions. At 800 status changes/month you'd hit 2,400 executions and stay under the limit. Self-hosted n8n is free regardless of execution count — your only cost is server time. Make charges per operation and a comparable setup costs $9/month at 200 status changes. Zapier charges per task and 200 Zap runs/month sits on the $19.99/month Starter plan. n8n self-hosted beats both by a wide margin at any volume above zero.
Make's Monday.com trigger is more polished for this use case — it has named trigger events like 'When status changes' built into the UI, so you don't need the manual IF filter that Step 6 requires in n8n. Zapier has the same named trigger and takes 8 minutes to set up, but the free tier caps at 100 tasks/month, which won't survive a busy team. Power Automate has a Monday.com connector but it's a premium connector requiring a $15/user/month Power Apps license — prohibitively expensive for a notification workflow. Pipedream's Monday.com source handles the webhook cleanly and the code steps are more flexible than n8n's for complex transformations, but it has a 10k invocations/month cap on the free tier. n8n is still the right call here if you want self-hosted, unlimited execution volume, and a one-time setup investment rather than recurring per-task costs.
Three things you'll hit after setup. First, Monday.com's 'change_column_value' webhook fires for every column on the board — text fields, file uploads, all of it. Budget 20 minutes to get the IF filter exactly right using the actual column ID from a real test payload, not what you assume it should be. Second, the status value in the webhook payload is structured as an object with a nested label — event.value.label.text in some board configurations and event.value.label directly in others, depending on the Monday.com account type. Test against your actual payload before hardcoding the path. Third, Monday.com occasionally fires duplicate webhooks for a single status change when their internal automations are also triggered on the same item. Add the Deduplicate node or you'll see pairs of identical Slack messages within a few seconds of each other on busy boards.
Ideas for what to build next
- →Route by status to different Slack channels — Add a Switch node after the Code node to route 'Blocked' and 'Stuck' statuses to a #blockers channel and 'Done' statuses to a #wins channel. Takes about 10 minutes and makes the notifications much more actionable.
- →Send a daily digest instead of per-change messages — Replace the webhook trigger with a Schedule trigger set to run at 9am. Use the Monday.com 'Get Board Items' node filtered by 'Updated Yesterday' to batch all status changes into one Slack message per day — useful for high-volume boards where per-change pings become noise.
- →Write back to Monday.com when someone reacts in Slack — Add a second workflow that listens for Slack reaction events using the Slack trigger node — for example, when someone adds a ✅ emoji to a notification, update the Monday.com item status to 'Done' via the Monday.com node's 'Change Column Value' operation.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup