Intermediate~15 min setupCommunication & ProductivityVerified April 2026
Slack logo
Notion logo

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

scheduled

Use case type

notification

Real-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.

/mo
505005K50K

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

Skip the setup

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.

Notion internal integration token with read content permission — create one at notion.so/my-integrations and share it with your target database
Slack OAuth authorization with channels:write and chat:write scopes — granted during the Power Automate connection step
Power Automate account with a Microsoft 365 license that includes premium connectors (the Notion connector is premium tier)
Your Notion database ID — the 32-character string visible in the database URL
Editor or higher access on the Notion database so the integration can read page properties

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Page Titleproperties.{Title Column Name}.title[0].plain_text
Statusproperties.Status.status.name
Last Edited Timelast_edited_time
Created Timecreated_time
Page IDid
3 optional fields▸ show
Assigneeproperties.Assignee.people[0].name
Page URLurl
Priorityproperties.Priority.select.name

Step-by-Step Setup

1

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'.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' in the top left
  3. 3Select 'Scheduled cloud flow'
  4. 4Enter a flow name and set recurrence interval to 5 minutes
  5. 5Click 'Create'
What you should see: The flow designer canvas opens with a single 'Recurrence' trigger tile showing your 5-minute interval.
Common mistake — Do not pick 'Automated cloud flow' — the Notion connector has no event trigger in Power Automate. Using Scheduled is the only supported approach here.
2

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.

  1. 1Click '+ New step'
  2. 2Type 'Notion' in the connector search bar
  3. 3Select the 'Notion' connector
  4. 4Choose 'Query a database' action
  5. 5Paste your Notion Integration Token and click 'Create'
What you should see: The Notion connection appears as 'Connected' with your integration name shown inside the action tile.
Common mistake — The integration token must be added to your Notion workspace AND explicitly shared with the specific database — go to the database in Notion, click the three-dot menu, click 'Add connections', and select your integration. Skipping this step returns a 404 from Notion's API.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
3

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.

  1. 1Paste the Notion database ID into the 'Database ID' field
  2. 2Click 'Show advanced options'
  3. 3Click 'Add filter' and select the 'last_edited_time' property
  4. 4Set the condition to 'on or after' and leave the value field open for now
What you should see: The action tile shows your database ID and a filter row for last_edited_time.
Common mistake — Notion database IDs sometimes include hyphens in the URL but require the hyphen-free 32-character format in API calls. If your ID has hyphens, remove them before pasting.
4

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.

  1. 1Click inside the filter value field
  2. 2Click the 'Expression' tab in the dynamic content panel
  3. 3Type: addMinutes(utcNow(), -5)
  4. 4Click 'OK'
What you should see: The filter value field shows 'addMinutes(utcNow(), -5)' rendered as a blue expression token.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Notion
NO
notified
5

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.

  1. 1Click '+ New step'
  2. 2Search 'Parse JSON' and select 'Data Operation – Parse JSON'
  3. 3In 'Content', select 'body' from the Notion 'Query a database' dynamic content
  4. 4Click 'Generate from sample' and paste a raw Notion API response
  5. 5Click 'Done' to generate the schema
What you should see: The Parse JSON action shows a generated schema with Notion's results array, page IDs, and properties visible as tokens.
Common mistake — Notion property names in the API are case-sensitive and match exactly what you named the column in the database. If your database column is called 'Task Name', the API key is 'Task Name' — not 'task_name' or 'taskName'.
6

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.

  1. 1Click '+ New step'
  2. 2Select 'Control' then 'Apply to each'
  3. 3In the output field, select 'results' from Parse JSON dynamic content
What you should see: An 'Apply to each' loop container appears on the canvas with the 'results' array token shown in its input field.
Common mistake — If your Notion query returns more than 100 pages in one call, Notion paginates with a 'next_cursor' value. Power Automate's built-in Notion connector does not automatically paginate — flows covering large databases need a Do Until loop to handle this. For most teams tracking daily changes, 100 results per 5-minute window is not a real limit.
7

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.

  1. 1Click 'Add an action' inside the Apply to each loop
  2. 2Search 'Slack' in the action search bar
  3. 3Select 'Post message (V2)'
  4. 4Click 'Sign in' and complete OAuth authorization
  5. 5Confirm the correct workspace is selected
What you should see: The Slack action shows your workspace name under the connection and displays the Channel and Message Text fields.
Common mistake — Power Automate's Slack connector uses OAuth with user-level permissions, not a bot token. The messages will post as your personal Slack account unless you create a dedicated Slack app and use its bot token via a custom connector. For team-facing channels, a bot token looks cleaner.
8

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.

  1. 1Enter the Slack channel name in the 'Channel Name' field (e.g. project-updates)
  2. 2Click inside the 'Message Text' field
  3. 3Type your message template and insert dynamic tokens for Title, Status, Assignee, and last_edited_time from Parse JSON
  4. 4Use Slack markdown (*bold*, _italic_) directly in the message text field
What you should see: The Message Text field shows a mix of static text and blue dynamic content tokens representing Notion field values.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
9

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.

  1. 1Inside the loop, click 'Add an action' before the Post message step
  2. 2Select 'Control' then 'Condition'
  3. 3Set left value to 'created_time' from Parse JSON dynamic content
  4. 4Set operator to 'is greater than'
  5. 5Set right value to expression: addMinutes(utcNow(), -5)
  6. 6Move your existing Post message action into the 'Yes' branch and duplicate it in the 'No' branch with different text
What you should see: The condition shows two branches — 'Yes' for new rows and 'No' for updates — each containing a Post message action with distinct message text.
Common mistake — Notion's created_time and last_edited_time are in UTC ISO 8601 format. Power Automate's comparison expressions also use UTC by default, so timezone conversion is not needed here — but if you display these times in your Slack message for end users, wrap them with convertTimeZone() so they see their local time.
10

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.

  1. 1Click 'Save' in the top right
  2. 2Click 'Test'
  3. 3Select 'Manually' and click 'Test'
  4. 4Watch the run detail panel for green checkmarks on each action
  5. 5Check your Slack channel for the test notification
What you should see: All actions show green checkmarks in the run detail panel and a formatted Slack message appears in your chosen channel within 30 seconds.
Power Automate
▶ Test flow
executed
Slack
Notion
Notion
🔔 notification
received
11

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.

  1. 1Click 'Turn on' in the flow detail page if not already active
  2. 2Navigate to 'My flows' and click your flow name
  3. 3Click the '28 day run history' tab
  4. 4Review run statuses after 24 hours for consistent green results
What you should see: The flow shows as 'On' with a green status indicator, and run history entries appear every 5 minutes.

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 alertsChange 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 NotionAdd 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 StatusAdd 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

Was this guide helpful?
Slack + Notion overviewPower Automate profile →