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

How to Send Notion Database Alerts to Slack with Pipedream

Polls a Notion database for new or updated rows and sends a formatted Slack message to a channel whenever a change is detected.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Dev teams or ops teams who live in Slack and need instant visibility into Notion database changes without checking Notion manually.

Not ideal for

Teams that need sub-minute latency — Pipedream's Notion polling fires every 1–15 minutes, not on true database events.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 12-person product team tracks sprint tasks in a Notion database. Before this workflow, the PM had to ping engineers in Slack manually whenever a task status changed to 'Blocked'. Now Pipedream polls every 5 minutes, catches the status change, and posts a formatted alert to #eng-sprint with the task name, assignee, and a direct link to the Notion page. Engineers respond in under 10 minutes instead of the previous 2-hour average.

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 Pipedream

Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 account with at least one existing database containing real rows you can test against
Notion integration has been granted access to the target database via Notion's OAuth page-selection screen
Slack account with permission to install apps and post to the target channel (Workspace Admin may need to approve the Pipedream Slack app)
Pipedream account — the free tier covers up to 10,000 credits/month, which is enough for moderate polling workflows

Optional

The Notion database must use standard property types (Title, Select, People, URL) — formula and rollup properties require extra extraction logic in the code step

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Page IDid
Task Nameproperties.Name.title[0].plain_text
Statusproperties.Status.select.name
Notion Page URLurl
4 optional fields▸ show
Assigneeproperties.Assignee.people[0].name
Last Edited Timelast_edited_time
Priorityproperties.Priority.select.name
Due Dateproperties.Due.date.start

Step-by-Step Setup

1

pipedream.com > Workflows > New Workflow

Create a new Pipedream Workflow

Go to pipedream.com and sign in. Click 'New Workflow' in the top-right corner of the dashboard. You'll land on a blank canvas with a trigger slot at the top. Give the workflow a name like 'Notion DB → Slack Alerts' in the name field at the top — this keeps your list readable when you have dozens of workflows.

  1. 1Click 'New Workflow' in the top-right of the Pipedream dashboard
  2. 2Click the workflow name field at the top and type 'Notion DB → Slack Alerts'
  3. 3Click 'Save' or press Enter to confirm the name
What you should see: You should see a blank workflow canvas with an empty trigger slot labeled 'Add Trigger' and your workflow name displayed at the top.
2

Workflow Canvas > Add Trigger > Notion > New or Updated Database Item

Add the Notion trigger

Click 'Add Trigger' in the trigger slot. Search for 'Notion' in the app search box. Select the 'New or Updated Database Item' trigger from the list — this is the correct trigger for catching both new rows and edits to existing ones. Pipedream will poll Notion on a schedule you set in the next step.

  1. 1Click the 'Add Trigger' slot at the top of the workflow canvas
  2. 2Type 'Notion' in the search box
  3. 3Click 'Notion' in the app results
  4. 4Select 'New or Updated Database Item' from the trigger list
What you should see: The trigger configuration panel opens on the right side of the screen showing Notion's trigger settings including account, database, and timer fields.
Common mistake — There is also a 'New Database Item' trigger that only catches newly created rows — not updates. If your team updates task statuses rather than creating new rows, you must use 'New or Updated Database Item' or you'll miss most of the events you care about.
Pipedream
+
click +
search apps
Slack
SL
Slack
Add the Notion trigger
Slack
SL
module added
3

Trigger Panel > Account > Connect Account > Notion OAuth

Connect your Notion account

In the trigger configuration panel, click 'Connect Account' under the Notion account field. A popup opens asking you to authorize Pipedream to access Notion. Notion's OAuth flow will ask you to select which pages or databases to share — you must explicitly grant access to the specific database you want to monitor. Do not skip the database selection step or the trigger will have nothing to poll.

  1. 1Click 'Connect Account' in the Notion trigger panel
  2. 2Click 'Connect Notion Account' in the popup
  3. 3In the Notion OAuth screen, click 'Select Pages'
  4. 4Check the box next to the specific database you want to monitor
  5. 5Click 'Allow Access'
What you should see: The account field in the trigger panel shows your Notion workspace name with a green connected indicator. The database dropdown should now be populated.
Common mistake — Notion OAuth uses page-level permissions, not workspace-level. If you connect the account but forget to grant access to the target database, the database dropdown will appear empty. Go back through the OAuth flow and select the correct database.
Pipedream settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Pipedream
popup window
Connected
green checkmark
4

Trigger Panel > Database > [Select DB] > Timer > Polling Interval

Select your Notion database and set polling interval

In the 'Database' dropdown, select the Notion database you want to monitor. Then scroll down to the timer/polling settings. Set the polling interval — Pipedream defaults to 15 minutes. For active sprint boards, 5 minutes is a reasonable balance between responsiveness and credit usage. For lower-urgency content databases, 15 minutes is fine.

  1. 1Click the 'Database' dropdown and select your target Notion database
  2. 2Scroll to the 'Timer' or 'Polling Interval' section in the trigger panel
  3. 3Set the interval to '5 minutes' or your preferred frequency
  4. 4Click 'Save and Continue'
What you should see: The trigger panel shows your selected database name and polling interval. Click 'Generate Test Event' to pull a recent row — you should see a JSON object with your Notion database fields.
Common mistake — The default polling interval is often 15 minutes. If you need faster delivery, check whether your plan supports shorter intervals before assuming it's a bug.
5

Workflow Canvas > Trigger Step > Output > JSON Preview

Inspect the Notion event payload

After generating a test event, click the trigger step in the workflow to expand its output. You'll see the raw JSON Notion returns for a database row. Notion wraps field values in type objects — for example, a text field appears as properties.Task.title[0].plain_text, not just properties.Task. Take 2 minutes to locate the exact paths for the fields you want in your Slack message: task name, status, assignee, and URL. You'll reference these paths in the code step.

  1. 1Click the trigger step in the workflow canvas to expand its output
  2. 2Click the 'Results' or 'Output' tab in the right panel
  3. 3Expand the 'properties' object to find your database fields
  4. 4Note the full path to each field you want: e.g., steps.trigger.event.properties.Status.select.name
What you should see: You can see a nested JSON tree with your Notion database row data. Each property shows its type (select, title, people, url, etc.) and its current value.
Common mistake — Notion's 'people' property type returns an array of user objects with an `id` field, not a display name. You'll need to extract the `name` field from `people[0].name` — or make a separate Notion Users API call if your assignee field sometimes has multiple people.
6

Workflow Canvas > + > Run Node.js Code

Add a Node.js code step to build the Slack payload

Click the '+' button below the trigger step and choose 'Run Node.js code'. This is where you extract the relevant fields from the Notion event and format them into a clean Slack Block Kit message. Write the extraction logic here rather than relying on Pipedream's built-in field picker — Notion's nested property structure makes manual field wiring error-prone. Paste the code from the pro tip section below into this step.

  1. 1Click the '+' button below the trigger step
  2. 2Click 'Run Node.js code' from the step type list
  3. 3Paste your message-building code into the code editor
  4. 4Click 'Test' to run the step against the test event
What you should see: The code step runs without errors and its output shows a formatted object containing channel, text, and blocks fields ready to send to Slack.
Common mistake — Pipedream's code steps time out at 30 seconds on free plans. Your code step here will finish in well under 1 second, but if you later add API lookups inside this step (e.g., resolving a Notion user ID to a name), keep that limit in mind.

This code goes in the Node.js code step (Step 6). It extracts Notion fields safely using optional chaining, formats the due date, and builds a Slack Block Kit payload so your message has bold headers, labeled fields, and a clickable Notion link instead of a wall of plain text.

JavaScript — Code Step// Pipedream Node.js code step
▸ Show code
// Pipedream Node.js code step
// Place this in the 'Run Node.js code' step between your Notion trigger and Slack step
export default defineComponent({

... expand to see full code

// Pipedream Node.js code step
// Place this in the 'Run Node.js code' step between your Notion trigger and Slack step

export default defineComponent({
  async run({ steps, $ }) {
    const page = steps.trigger.event;
    const props = page.properties;

    // Extract fields safely — Notion's nested structure breaks without optional chaining
    const taskName = props?.Name?.title?.[0]?.plain_text ?? 'Untitled Task';
    const status = props?.Status?.select?.name ?? 'No Status';
    const assignee = props?.Assignee?.people?.[0]?.name ?? 'Unassigned';
    const priority = props?.Priority?.select?.name ?? 'None';
    const notionUrl = page.url;
    const lastEdited = page.last_edited_time;

    // Format due date from ISO string to readable label
    let dueLabel = 'Not set';
    const rawDue = props?.Due?.date?.start;
    if (rawDue) {
      const due = new Date(rawDue);
      dueLabel = due.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
    }

    // Format last edited time
    const editedAt = new Date(lastEdited).toLocaleString('en-US', {
      month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'
    });

    // Pick an emoji based on status
    const statusEmoji = {
      'Blocked': '🔴',
      'In Progress': '🟡',
      'Done': '✅',
      'In Review': '🔵',
    }[status] ?? '⚪';

    // Build Slack Block Kit payload
    const blocks = [
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: `${statusEmoji} ${taskName}`,
          emoji: true
        }
      },
      {
        type: 'section',
        fields: [
          { type: 'mrkdwn', text: `*Status:*\n${status}` },
          { type: 'mrkdwn', text: `*Assignee:*\n${assignee}` },
          { type: 'mrkdwn', text: `*Priority:*\n${priority}` },
          { type: 'mrkdwn', text: `*Due:*\n${dueLabel}` }
        ]
      },
      {
        type: 'section',
        text: {
          type: 'mrkdwn',
          text: `<${notionUrl}|Open in Notion>  •  Updated ${editedAt}`
        }
      },
      { type: 'divider' }
    ];

    // Return the payload — reference this in the Slack step as steps.nodejs.$return_value
    return {
      text: `${statusEmoji} *${taskName}* is now ${status} — assigned to ${assignee}`,
      blocks
    };
  }
});
7

Workflow Canvas > + > Slack > Send Message to a Channel > Connect Account

Connect your Slack account

Click the '+' button below the code step and search for 'Slack'. Select the 'Send Message to a Channel' action. Click 'Connect Account' and go through Slack's OAuth flow. You'll be asked to choose a Slack workspace and approve the bot permissions. Pipedream's Slack app needs chat:write and chat:write.public scopes to post to channels it hasn't been invited to.

  1. 1Click '+' below the code step
  2. 2Search for 'Slack' and click it
  3. 3Select 'Send Message to a Channel'
  4. 4Click 'Connect Account' and authorize Pipedream in your Slack workspace
  5. 5Confirm the workspace and click 'Allow'
What you should see: The Slack step panel shows your workspace name with a green connected indicator and a channel selection dropdown.
8

Slack Step Panel > Channel > Message Text > Blocks

Configure the Slack message fields

In the Slack step configuration, set the Channel field to your target channel (e.g., #project-updates). For the Message Text field, reference the output from your Node.js code step using the expression {{steps.nodejs.$return_value.text}}. For the Blocks field (which enables rich formatting), reference {{steps.nodejs.$return_value.blocks}}. If you skip the Blocks field, Slack will display only plain text — no bold, no links, no emojis.

  1. 1Click the 'Channel' field and type or select your target Slack channel
  2. 2Click the 'Message Text' field and enter {{steps.nodejs.$return_value.text}}
  3. 3Scroll to the 'Blocks' field and enter {{steps.nodejs.$return_value.blocks}}
  4. 4Leave other fields at their defaults unless you need username or icon overrides
What you should see: The Slack step preview shows the channel name selected and the expression references populated in the message fields.
Common mistake — If you reference `blocks` but the array is malformed JSON, Slack silently falls back to the plain `text` field with no error. Always test with Slack's Block Kit Builder at app.slack.com/block-kit-builder before finalizing your blocks structure.
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

Workflow Canvas > Test Workflow > Check Each Step Output

Test the full workflow end to end

Click 'Test Workflow' at the top of the canvas. Pipedream will run all steps sequentially using the test event you captured earlier. Watch for green checkmarks on each step. Then open your Slack channel and confirm the message arrived with the correct content: task name, status, assignee name, and the Notion page URL as a clickable link. If the message looks right, you're ready to deploy.

  1. 1Click 'Test Workflow' at the top of the workflow canvas
  2. 2Watch each step for a green checkmark or red error indicator
  3. 3Open your target Slack channel and verify the notification message
  4. 4Check that the Notion page link opens the correct record
What you should see: All three steps show green checkmarks. Your Slack channel shows a formatted message with the task name, current status, assignee, and a working link back to the Notion page.
Pipedream
▶ Deploy & test
executed
Slack
Notion
Notion
🔔 notification
received
10

Workflow Canvas > Deploy (top right)

Deploy the workflow

Click the 'Deploy' button in the top-right of the workflow canvas. Pipedream activates the polling schedule immediately. The workflow will now check your Notion database at your configured interval and fire the Slack step for any new or changed rows it hasn't seen before. Pipedream tracks seen records internally using the page ID — you don't need to build deduplication logic yourself.

  1. 1Click the 'Deploy' button in the top-right corner
  2. 2Confirm the deployment in the dialog that appears
  3. 3Click 'View Workflow' to see the live run history panel
What you should see: The workflow status changes from 'Development' to 'Active'. The run history panel shows the next scheduled poll time.
11

Workflow > Runs Tab | Settings > Notifications

Monitor runs and set up error alerts

Go to the workflow's 'Runs' tab in the left sidebar. Each poll that produces an event shows as a successful run with step-by-step logs. Runs where Notion returns no new rows are not logged as errors — they simply produce no events. To get notified if something breaks, go to Settings > Notifications and enable 'Email on workflow error'. This fires an email if any step throws an uncaught exception.

  1. 1Click the 'Runs' tab in the left sidebar of your workflow
  2. 2Review recent run logs to confirm step outputs look correct
  3. 3Click 'Settings' in the left sidebar
  4. 4Toggle on 'Email me when this workflow throws an error'
What you should see: The Runs tab shows a history of triggered events with green status indicators. The Settings page confirms error email notifications are enabled.

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 Pipedream for this if your team includes at least one person comfortable reading JavaScript — even just enough to tweak field paths and add a conditional. The Node.js code step is the core value here: Notion's property structure is deeply nested and varies by field type, and Pipedream lets you handle that cleanly in code rather than wrestling with a visual field mapper that breaks when a property returns null. The other reason to pick Pipedream: its data store feature lets you persist the last-seen status per page ID, so you can build actual change detection instead of firing on every last_edited_time bump. If your team doesn't code at all, use Zapier — the Notion + Slack Zap is configured in clicks and takes 8 minutes to set up.

Cost

Cost math: Pipedream charges 1 credit per compute unit. This 3-step workflow (trigger, code, Slack) costs roughly 3 credits per triggered event. At 5-minute polling with 100 status changes per month, you're at approximately 300 credits. The free tier gives 10,000 credits/month. You'd need about 3,300 Notion events per month before you hit the ceiling — that's a very active database. The $19/month Basic plan gives 100,000 credits, enough for around 33,000 events monthly. Zapier's equivalent workflow costs 1 task per run and hits its 1,000-task free tier at the same 1,000 events. Pipedream is cheaper at any volume above about 500 events/month.

Tradeoffs

Here's how the alternatives compare on this specific workflow. Zapier has a pre-built 'New Database Item' trigger and a Slack step that takes 8 minutes to configure — no code required, but it cannot catch row updates, only new rows, without a paid plan workaround. Make has better conditional branching in its visual router, which is useful if you want to send different message formats based on status — but its Notion module has the same polling limitation and the Block Kit message formatting requires a Make HTTP module call rather than a native action. n8n gives you full Node.js and a Notion node, and you can self-host it for free, but setup takes 30–60 minutes including Docker configuration. Power Automate has no native Notion connector — you'd need a third-party connector or HTTP requests, which adds significant complexity. Pipedream wins here on the combination of fast setup, real code for Notion's messy API response, and generous free credits.

Three things you'll run into post-launch. First: Notion formula and rollup properties update last_edited_time on every API poll in some configurations, which means a row that hasn't actually changed will repeatedly trigger your workflow. Check whether any formula columns reference dynamic functions like now(). Second: Slack's Block Kit silently falls back to plain text if your blocks array has a structural error — wrong type string, missing required field — with no error in Pipedream's logs. Validate your blocks at app.slack.com/block-kit-builder before deploying. Third: the Notion API rate limit is 3 requests per second per integration token. If you ever extend this workflow to look up related database entries or user details inside the code step, you can hit that limit on databases with burst activity. Add a 400ms delay between sequential Notion API calls using await new Promise(r => setTimeout(r, 400)) to stay safe.

Ideas for what to build next

  • Filter by Status Change OnlyAdd a filter step in Pipedream between the trigger and code step that compares the current status to the previous one using a Pipedream data store. This prevents repeat notifications when unrelated fields like comments or formatting change on the same row.
  • Route Alerts to Different Channels by PriorityExtend the code step to return a dynamic channel value — P0 tasks go to #incidents, P1 to #eng-sprint, everything else to #project-updates. Update the Slack step's channel field to reference {{steps.code.$return_value.channel}}.
  • Add a Daily Digest VariantCreate a second workflow on a daily CRON trigger that queries your Notion database for all items updated in the last 24 hours and posts a single summary Slack message. This gives async teams a morning briefing without the per-change noise.

Related guides

Was this guide helpful?
Slack + Notion overviewPipedream profile →