

How to Send Notion Database Alerts to Slack with Power Automate
Polls a Notion database on a schedule and posts a formatted Slack message whenever a new row is added or an existing entry is updated.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Microsoft 365 teams that already use Power Automate and need Slack alerts when Notion project tasks or content entries change.
Not ideal for
Teams needing sub-minute notification latency — Power Automate polls Notion every 1–15 minutes, not in real time.
Sync type
scheduledUse case type
notificationReal-World Example
A 20-person product team tracks feature requests in a Notion database and routes work updates to a #product-updates Slack channel. Before this flow, team leads refreshed Notion manually throughout the day and missed status changes by hours. After setup, any new row or status change in Notion fires a Slack message within 5 minutes, with the item name, assignee, and status visible directly in the channel.
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 Power Automate
Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. 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 | ||
| Page Title | properties.{Title Column Name}.title[0].plain_text | |
| Status | properties.Status.status.name | |
| Last Edited Time | last_edited_time | |
| Created Time | created_time | |
| Page ID | id | |
3 optional fields▸ show
| Assignee | properties.Assignee.people[0].name |
| Page URL | url |
| Priority | properties.Priority.select.name |
Step-by-Step Setup
make.powerautomate.com > My flows > + New flow > Scheduled cloud flow
Create a new Scheduled cloud flow
Go to make.powerautomate.com and sign in with your Microsoft account. In the left sidebar click 'My flows', then click '+ New flow' at the top left. Select 'Scheduled cloud flow' from the dropdown — this is the right choice because the Notion connector does not support instant event-based triggers in Power Automate. Give the flow a name like 'Notion DB → Slack Notifications', set the recurrence to every 5 minutes, and click 'Create'.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' in the top left
- 3Select 'Scheduled cloud flow'
- 4Enter a flow name and set recurrence interval to 5 minutes
- 5Click 'Create'
Flow designer > + New step > Search 'Notion' > Query a database > Create connection
Connect your Notion account
Click '+ New step' below the Recurrence trigger. In the action search bar type 'Notion' and select the Notion connector. Choose the action 'Query a database'. A connection panel will slide in asking for your Notion Integration Token. Paste your internal integration token (from notion.so/my-integrations) and click 'Create'. Power Automate saves this as a named Connection you can reuse across flows.
- 1Click '+ New step'
- 2Type 'Notion' in the connector search bar
- 3Select the 'Notion' connector
- 4Choose 'Query a database' action
- 5Paste your Notion Integration Token and click 'Create'
Flow designer > Query a database > Database ID field > Show advanced options
Configure the Query a database action
Inside the 'Query a database' action, click the 'Database ID' field. Paste your Notion database ID — this is the 32-character string in the database URL between the last slash and the question mark (e.g. notion.so/workspace/THIS-PART?v=...). To filter for only recent changes, click 'Show advanced options' and add a filter: set 'last_edited_time' is on or after an expression. You will set that expression in the next step.
- 1Paste the Notion database ID into the 'Database ID' field
- 2Click 'Show advanced options'
- 3Click 'Add filter' and select the 'last_edited_time' property
- 4Set the condition to 'on or after' and leave the value field open for now
Flow designer > Query a database > Filter value field > Expression tab
Add a dynamic timestamp filter using an expression
In the last_edited_time filter value field, click the expression tab (the 'fx' icon in the dynamic content panel). Enter the expression: addMinutes(utcNow(), -5). This tells the query to return only rows edited in the last 5 minutes, matching your recurrence interval. Click 'OK' to confirm. This prevents the flow from re-notifying for rows that haven't changed since the last run.
- 1Click inside the filter value field
- 2Click the 'Expression' tab in the dynamic content panel
- 3Type: addMinutes(utcNow(), -5)
- 4Click 'OK'
Flow designer > + New step > Search 'Parse JSON' > Data Operation – Parse JSON
Parse the Notion API response with Parse JSON
Notion returns a nested JSON payload. To extract specific fields like page title, assignee, and status, you need a Parse JSON action. Click '+ New step', search for 'Parse JSON', and add the 'Data Operation – Parse JSON' action. In the 'Content' field, select the 'body' dynamic value from the 'Query a database' step. For the schema, paste a sample Notion API response or click 'Generate from sample' and paste output from a test run.
- 1Click '+ New step'
- 2Search 'Parse JSON' and select 'Data Operation – Parse JSON'
- 3In 'Content', select 'body' from the Notion 'Query a database' dynamic content
- 4Click 'Generate from sample' and paste a raw Notion API response
- 5Click 'Done' to generate the schema
Flow designer > + New step > Control > Apply to each
Loop through returned rows with Apply to each
Notion's query returns an array of pages. To handle each one individually, add a control action. Click '+ New step', search 'Apply to each', and select it. In the 'Select an output from previous steps' field, select 'results' from the Parse JSON dynamic content — this is the array of database pages. All subsequent actions will run once per matching row.
- 1Click '+ New step'
- 2Select 'Control' then 'Apply to each'
- 3In the output field, select 'results' from Parse JSON dynamic content
Apply to each loop > Add an action > Search 'Slack' > Post message (V2) > Sign in
Connect your Slack account
Inside the 'Apply to each' loop, click 'Add an action'. Search for 'Slack' and select the Slack connector. Choose the action 'Post message (V2)'. When the connection panel appears, click 'Sign in' and authorize Power Automate via OAuth using your Slack workspace credentials. Select the correct workspace from the dropdown if you belong to multiple.
- 1Click 'Add an action' inside the Apply to each loop
- 2Search 'Slack' in the action search bar
- 3Select 'Post message (V2)'
- 4Click 'Sign in' and complete OAuth authorization
- 5Confirm the correct workspace is selected
Apply to each loop > Post message (V2) > Channel Name + Message Text
Map Notion fields to the Slack message
In the 'Post message (V2)' action, set the Channel Name to your target channel (e.g. #project-updates). In the Message Text field, compose your notification using dynamic tokens from Parse JSON. A practical message template: '📋 *[Page Title]* was updated. Status: [Status]. Assignee: [Assignee Name]. Last edited: [last_edited_time].' Click the dynamic content icon to insert each token from the parsed Notion results.
- 1Enter the Slack channel name in the 'Channel Name' field (e.g. project-updates)
- 2Click inside the 'Message Text' field
- 3Type your message template and insert dynamic tokens for Title, Status, Assignee, and last_edited_time from Parse JSON
- 4Use Slack markdown (*bold*, _italic_) directly in the message text field
Apply to each loop > Add an action > Control > Condition
Add a condition to separate new rows from updates
If you want different Slack messages for new rows vs. edited rows, add a Condition action inside the loop before the Post message step. Set the left value to the 'created_time' dynamic token and the right value to addMinutes(utcNow(), -5) using an expression. If created_time is greater than that threshold, the page is new — route to a 'New item added' message. Otherwise it's an update — route to a 'Status updated' message. This gives your team clearer context at a glance.
- 1Inside the loop, click 'Add an action' before the Post message step
- 2Select 'Control' then 'Condition'
- 3Set left value to 'created_time' from Parse JSON dynamic content
- 4Set operator to 'is greater than'
- 5Set right value to expression: addMinutes(utcNow(), -5)
- 6Move your existing Post message action into the 'Yes' branch and duplicate it in the 'No' branch with different text
Flow designer > Save > Test > Manually > Test
Save and test the flow
Click 'Save' in the top right of the flow designer. Then click 'Test' (also top right), select 'Manually' and click 'Test' again. Power Automate will execute the flow immediately regardless of the recurrence schedule. Watch the run detail panel — each action shows green checkmarks on success or a red X with error details on failure. Verify that a Slack message appears in your target channel with the correct Notion data.
- 1Click 'Save' in the top right
- 2Click 'Test'
- 3Select 'Manually' and click 'Test'
- 4Watch the run detail panel for green checkmarks on each action
- 5Check your Slack channel for the test notification
make.powerautomate.com > My flows > [Your flow] > 28 day run history
Enable the flow and monitor run history
After a successful test, click 'Turn on' if the flow is not already active. The flow will now poll Notion every 5 minutes automatically. Check the '28 day run history' tab under 'My flows' after 24 hours to confirm consistent successful runs. If you see throttling errors, increase the recurrence interval to 15 minutes — Notion's API rate limit is 3 requests per second per integration, which rarely causes issues at this polling cadence.
- 1Click 'Turn on' in the flow detail page if not already active
- 2Navigate to 'My flows' and click your flow name
- 3Click the '28 day run history' tab
- 4Review run statuses after 24 hours for consistent green results
This expression block belongs inside the 'Message Text' field of the Post message action and inside a 'Compose' action to pre-build your message string. Paste the convertTimeZone expression into the expression editor when building the time display token — it prevents raw UTC strings from confusing your team.
JavaScript — Code Step// Power Automate expressions for Notion → Slack message formatting▸ Show code
// Power Automate expressions for Notion → Slack message formatting // Paste each into the Expression tab of the relevant field // 1. Convert Notion's UTC last_edited_time to US Eastern for display
... expand to see full code
// Power Automate expressions for Notion → Slack message formatting
// Paste each into the Expression tab of the relevant field
// 1. Convert Notion's UTC last_edited_time to US Eastern for display
convertTimeZone(triggerBody()?['last_edited_time'], 'UTC', 'Eastern Standard Time', 'MMM d, yyyy h:mm tt')
// 2. Build a direct Notion page URL from the page ID
concat('https://notion.so/', replace(items('Apply_to_each')?['id'], '-', ''))
// 3. Conditional emoji prefix based on Status field value
if(equals(items('Apply_to_each')?['properties']?['Status']?['status']?['name'], 'Blocked'), '🔴', if(equals(items('Apply_to_each')?['properties']?['Status']?['status']?['name'], 'Done'), '✅', '📋'))
// 4. Safe extraction of assignee name with fallback if unassigned
coalesce(items('Apply_to_each')?['properties']?['Assignee']?['people']?[0]?['name'], 'Unassigned')
// 5. Full composed message string for the Slack Message Text field
concat(if(greater(items('Apply_to_each')?['created_time'], addMinutes(utcNow(), -5)), '🆕 New item: ', '✏️ Updated: '), '*', items('Apply_to_each')?['properties']?['Task Name']?['title']?[0]?['plain_text'], '*', '
Status: ', items('Apply_to_each')?['properties']?['Status']?['status']?['name'], ' | Assignee: ', coalesce(items('Apply_to_each')?['properties']?['Assignee']?['people']?[0]?['name'], 'Unassigned'), '
🔗 ', concat('https://notion.so/', replace(items('Apply_to_each')?['id'], '-', '')))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 Power Automate for this if your organization already pays for Microsoft 365 E3 or higher — the Notion connector is a premium connector, so it's included in plans that cover Power Automate premium. It also makes sense if your IT team manages connections centrally through the Power Platform admin center and needs governance over which apps connect to internal data. If your team is not in the Microsoft ecosystem and you're paying for Power Automate specifically for this workflow, switch to Make — the Notion and Slack modules are available on Make's free tier and the setup is faster.
The cost math is straightforward. This flow runs 288 times per day at 5-minute intervals. Each run executes roughly 4-6 actions on average (Recurrence, Query, Parse JSON, Apply to each, Post message, Condition). That's around 1,500–1,700 actions per day, or roughly 45,000–50,000 actions per month. Power Automate's per-user plan includes 5,000 actions/month — you will exceed that within three days. The Power Automate Premium per-user plan at $15/user/month includes 40,000 actions/month, which covers this workflow. Make's free tier handles 1,000 operations/month; the Core plan at $9/month covers 10,000 operations — enough for this exact workflow at lower total cost. If cost is the deciding factor, Make wins by $6/month minimum.
Make handles this workflow with a native Notion 'Watch Database Items' module that can poll every 1 minute on paid plans — no Parse JSON step needed, cleaner field access, and a simpler interface for non-technical builders. Zapier has a Notion 'New Database Item' trigger but does not natively detect updates to existing rows, only new rows — a real limitation for this use case. n8n's Notion polling node gives you full JSON control and runs on your own server with no action limits, which matters at high database volumes. Pipedream's Notion source can also poll for changes with custom filtering logic in Node.js. Power Automate is still the right call if you need enterprise SSO, DLP policies, or your IT department requires all integrations to live in the Power Platform tenant — those are hard constraints that override cost comparisons.
Three things will catch you after setup. First, Notion's last_edited_time updates even when system-level changes happen — like a connected integration reading a page — which can cause phantom notifications for rows that nobody actually edited. Add a check for whether specific tracked properties changed if this becomes noisy. Second, the Notion API returns people fields as an array of objects with 'id' and 'name' — but if a user has never logged into Notion, their name may be null while their email is populated instead, breaking your Slack message template. Always use the coalesce() expression to provide a fallback. Third, Power Automate's Apply to each loop is sequential by default. If your Notion query returns 20 updated rows in one run, all 20 Slack messages post one after another, potentially flooding the channel. Enable concurrency control on the Apply to each loop (set to 1) to throttle the posting rate and avoid looking like a spam bot.
Ideas for what to build next
- →Add a daily digest instead of per-change alerts — Change the recurrence to once per day, remove the last_edited_time filter, and post a summary Slack message listing all items updated in the last 24 hours. Reduces notification noise for lower-urgency databases.
- →Write Slack reactions back to Notion — Add a second flow triggered by a Slack slash command or button that updates the Notion row's Status field via the 'Update a page' Notion action — closing the loop so team responses in Slack are reflected in Notion.
- →Route notifications to different Slack channels by Status — Add a Switch control action inside the loop that checks the Status field value and routes to #design-updates, #dev-updates, or #qa-updates depending on which team owns that status. Prevents irrelevant notifications from cluttering shared channels.
Related guides
How to Send Notion Database Alerts to Slack with Pipedream
~15 min setup
How to Send Notion Database Updates to Slack with n8n
~20 min setup
How to Send Notion Database Updates to Slack with Zapier
~8 min setup
How to Send Notion Database Alerts to Slack with Make
~12 min setup
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