Beginner~8 min setupCommunication & ProductivityVerified April 2026
Slack logo
Notion logo

How to Create Notion Tasks from Slack Messages with Zapier

When a specific emoji reaction or keyword appears in Slack, Zapier instantly creates a new task entry in a Notion database with the message text, sender, channel, and timestamp.

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

Best for

Teams that capture action items in Slack conversations and need them tracked in Notion without manually copying them over.

Not ideal for

Teams with more than 200 task-creation events per month — at that volume Make handles the same workflow on its free tier.

Sync type

real-time

Use case type

routing

Real-World Example

💡

A 12-person product team uses this to capture tasks that surface during #standup and #design-review conversations. Before this Zap, action items died in Slack threads — someone would say 'can you update the onboarding copy?' and it would get buried within an hour. Now any message reacted to with ✅ lands in their Notion sprint board within 90 seconds, assigned to the channel and sender automatically.

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

Before You Start

Make sure you have everything ready.

Slack account with permission to add emoji reactions in the target channel
Zapier account — free tier works up to 100 tasks/month; paid starts at $19.99/month for 750 tasks
Notion account with a database already created and configured with at minimum a Name (title), Status, and URL property
Notion integration permissions: your Notion account must be able to edit the target database, not just view it
Slack OAuth scope: Zapier needs 'reactions:read' and 'channels:history' — these are granted automatically during the Slack OAuth flow but require your Slack admin to allow third-party app connections

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Title (Name)
Source URL (Permalink)
Status
5 optional fields▸ show
Slack Channel
Reported By (User ID)
Reacted By (User ID)
Created Date
Reaction Used

Step-by-Step Setup

1

Zapier Dashboard > Create Zap > Trigger > Search Apps

Create a new Zap and connect Slack

Go to zapier.com and click the orange 'Create Zap' button in the top-left sidebar. The Zap editor opens to a blank canvas with a trigger block at the top. Click that trigger block, then type 'Slack' in the search box and select it from the results. You'll see a list of Slack trigger events — this is where you choose how a Slack message kicks off the workflow.

  1. 1Click 'Create Zap' in the left sidebar
  2. 2Click the empty trigger block labeled 'Trigger'
  3. 3Type 'Slack' in the app search field
  4. 4Select 'Slack' from the dropdown results
What you should see: You should see the Slack trigger panel open on the right side with a list of available trigger events.
Common mistake — If you have multiple Zapier accounts, confirm you're in the right workspace before building — the Zap saves to whichever account you're logged into and cannot be moved later.
2

Trigger > Event dropdown

Choose your trigger: New Reaction Added

In the trigger event dropdown, select 'New Reaction Added.' This fires every time anyone adds a specific emoji reaction to any message in a channel you specify. This approach works better than keyword-matching for capturing tasks because it's intentional — someone has to actively react, which cuts down on false positives from conversational messages. You'll pick the exact emoji and channel in the next step.

  1. 1Click the 'Event' dropdown in the Slack trigger panel
  2. 2Scroll to or search for 'New Reaction Added'
  3. 3Select 'New Reaction Added'
  4. 4Click 'Continue'
What you should see: The trigger panel updates to show configuration fields for Reaction and Channel.
Common mistake — Do not choose 'New Message Posted to Channel' as your trigger for this use case. It fires on every message in the channel — including bot messages — and will create hundreds of junk Notion tasks unless you add multiple filters downstream.
Zapier
+
click +
search apps
Slack
SL
Slack
Choose your trigger: New Rea…
Slack
SL
module added
3

Trigger > Account > Sign in to Slack

Connect your Slack account

Click 'Sign in to Slack' — Zapier redirects you to Slack's OAuth page. Select your workspace from the dropdown if prompted, then click 'Allow.' Zapier needs access to read message history and reaction events. You must sign in as a user who has access to the channels you want to monitor — Zapier acts on behalf of this user account, not as a bot.

  1. 1Click 'Sign in to Slack' in the Account section
  2. 2Select your Slack workspace in the OAuth popup
  3. 3Review the permissions and click 'Allow'
  4. 4Confirm the connected account appears under 'Account'
What you should see: Your Slack workspace name appears under the Account field with a green checkmark.
Common mistake — Zapier connects to Slack as a specific user, not a bot token. If that user leaves the company or is deactivated, the Zap stops working. Consider using a shared service account.
Zapier settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Zapier
popup window
Connected
green checkmark
4

Trigger > Configure > Reaction / Channel

Configure the reaction and channel

In the 'Reaction' field, type the emoji name without colons — for example, type 'white_check_mark' for the ✅ emoji. In the 'Channel' field, select the specific Slack channel you want to monitor from the dropdown. If you want to monitor multiple channels, you'll need separate Zaps for each one — Zapier doesn't support multi-channel selection in a single trigger. Stick to one high-signal channel like #general-tasks or #requests to start.

  1. 1Click the 'Reaction' field and type the emoji name (e.g., 'white_check_mark')
  2. 2Click the 'Channel' dropdown and select your target channel
  3. 3Leave 'Trigger for Bot Messages?' set to 'No'
  4. 4Click 'Continue'
What you should see: Both the Reaction and Channel fields show your selections, and you can proceed to test the trigger.
Common mistake — Emoji names are case-sensitive and must match Slack's internal name exactly. To find the right name, open Slack, hover over any reaction, and the tooltip shows the name in :colon: format — drop the colons when typing it into Zapier.
5

Trigger > Test Trigger

Test the Slack trigger

Click 'Test Trigger.' Zapier looks for the three most recent times that emoji was added in that channel. If no results come back, go to Slack, react to a message with your chosen emoji, then return to Zapier and click 'Test Trigger' again. You'll see a data payload with fields like message text, the user who reacted, the channel name, the original message timestamp, and a permalink. These are the fields you'll map to Notion in the next steps.

  1. 1Click 'Test Trigger'
  2. 2If no data returns, go to Slack and add your emoji to a real message
  3. 3Click 'Test Trigger' again
  4. 4Expand the returned record to confirm message text and user fields are visible
What you should see: You see a sample payload with at least one record showing fields: 'Text', 'User', 'Channel', 'Timestamp', and 'Permalink'.
Zapier
▶ Turn on & test
executed
Slack
Notion
Notion
🔔 notification
received
6

Action > Search Apps > Notion > Create Database Item

Add a Notion action and connect your account

Click the '+' button below the trigger to add an action. Search for 'Notion' and select it. In the Event dropdown, choose 'Create Database Item' — this adds a new row to your Notion database. Click 'Sign in to Notion' and follow the OAuth flow. Critically, Notion's OAuth page asks you to select which pages Zapier can access — you must explicitly share the specific database page here or Zapier won't see it.

  1. 1Click the '+' icon below the trigger block
  2. 2Search for and select 'Notion'
  3. 3Choose 'Create Database Item' from the Event dropdown
  4. 4Click 'Sign in to Notion' and complete the OAuth flow
  5. 5On the Notion permissions screen, select the specific database page to share with Zapier
What you should see: Your Notion account appears in the Account field, and the action panel shows a Database ID field ready to configure.
Common mistake — Notion's OAuth grants access only to pages you explicitly select during setup. If you skip selecting the database here, you'll get a 'Could not find database' error in step 7 with no obvious explanation.
7

Action > Configure > Database ID

Select your Notion database

In the 'Database ID' field, click the dropdown and search for your Notion database by name. If it doesn't appear, go back to Notion, open the database, click Share in the top-right, then re-authorize Zapier and share that page. Once the database loads, Zapier reads its schema and dynamically shows all the properties as fields below — Name, Status, Assignee, Priority, URL, and any custom fields you've added.

  1. 1Click the 'Database ID' dropdown
  2. 2Type the name of your Notion task database
  3. 3Select it from the results
  4. 4Wait for Zapier to load the database properties below
What you should see: The action panel populates with your Notion database's property fields — at minimum you should see a 'Name' field and any other columns you've configured.
8

Action > Configure > Field Mapping

Map Slack fields to Notion properties

Click into the 'Name' field (or whatever your Notion task title property is called) and use the data picker to insert the Slack 'Text' field from your trigger. This puts the message text as the task title. For other fields, map 'User' to an Assignee or Reporter text field, 'Channel' to a Channel property, 'Timestamp' to a Created Date property, and 'Permalink' to a URL property. If your database has a Status field with options like 'To Do / In Progress / Done,' type the static value 'To Do' directly — don't map it from Slack.

  1. 1Click the 'Name' field and select 'Text' from the Slack trigger data
  2. 2Click the Assignee or Reporter field and select 'User' from the Slack data
  3. 3Click the Channel field and select 'Channel Name' from the Slack data
  4. 4Click the URL field and select 'Permalink' from the Slack data
  5. 5Type 'To Do' directly into the Status field
What you should see: Each mapped field shows a purple token with the Slack data label inside it, and static fields show plain text.
Common mistake — Slack's 'User' field returns a user ID like 'U04BNKQ82,' not a display name. If you want a readable name in Notion, add a Zapier 'Lookup Table' or 'Looping' step to resolve it — or accept the ID and handle display logic in a Notion formula property.
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

Between Trigger and Action > + > Formatter by Zapier > Text > Replace

Add a Formatter step to clean the message text

Slack message text often contains user mention tokens like '<@U04BNKQ82>' and channel references like '<#C01234567|general>.' These look ugly as Notion task titles. Click '+' between the trigger and Notion action to insert a Zapier 'Formatter by Zapier' step. Choose 'Text' as the transform type, then 'Replace' as the action. In the 'Find' field enter '<[^>]+>' and check the 'Use Regex' box — this strips all angle-bracket tokens from the message. Use the cleaned output in your Notion Name field instead of the raw Slack text.

  1. 1Click '+' between the Slack trigger and Notion action
  2. 2Search for and select 'Formatter by Zapier'
  3. 3Choose 'Text' then 'Replace'
  4. 4In 'Input' select the Slack 'Text' field
  5. 5In 'Find' type '<[^>]+>' and enable the 'Use Regex?' toggle
  6. 6Leave 'Replace' blank to remove the matches
  7. 7Click 'Continue' and run a test
What you should see: The Formatter output shows the message text with all mention tokens stripped — 'Hey <@U04BNKQ82> can you update the docs?' becomes 'Hey can you update the docs?'
Common mistake — Regex in Zapier Formatter replaces only the first match by default unless you enable 'Replace All.' Turn on 'Replace All?' to strip every mention token in messages with multiple @-mentions.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}

This Code by Zapier step resolves the Slack user ID to a display name and strips mention tokens from the message text in one pass — paste it as a 'Run Python' Code step inserted between the Slack trigger and the Notion action. Set the input data fields 'message_text' and 'user_id' from your Slack trigger before running.

JavaScript — Code Stepimport re
▸ Show code
import re
import urllib.request
import json

... expand to see full code

import re
import urllib.request
import json
import os

# Input from Zapier
message_text = input_data.get('message_text', '')
user_id = input_data.get('user_id', '')
slack_token = input_data.get('slack_bot_token', '')

# Strip Slack mention tokens: <@U123>, <#C123|general>, <https://url|text>
def clean_slack_text(text):
    # Replace user mentions with placeholder
    text = re.sub(r'<@[A-Z0-9]+>', '[teammate]', text)
    # Replace channel references
    text = re.sub(r'<#[A-Z0-9]+\|([^>]+)>', r'#\1', text)
    # Replace hyperlinks — keep display text
    text = re.sub(r'<https?://[^|>]+\|([^>]+)>', r'\1', text)
    # Strip bare URLs left in angle brackets
    text = re.sub(r'<https?://[^>]+>', '', text)
    return text.strip()

cleaned_text = clean_slack_text(message_text)

# Resolve user ID to display name via Slack API
display_name = user_id  # fallback to ID if lookup fails
if slack_token and user_id:
    try:
        url = f'https://slack.com/api/users.info?user={user_id}'
        req = urllib.request.Request(url, headers={'Authorization': f'Bearer {slack_token}'})
        with urllib.request.urlopen(req, timeout=5) as response:
            data = json.loads(response.read())
            if data.get('ok'):
                profile = data['user']['profile']
                display_name = profile.get('display_name') or profile.get('real_name', user_id)
    except Exception:
        pass  # Keep fallback ID on any error

return {
    'cleaned_message': cleaned_text,
    'reporter_name': display_name
}
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
10

Action > Test Step

Test the full Zap

Click 'Test Step' on the Notion action. Zapier uses your sample Slack data to create a live record in Notion — this is a real write, not a preview. Open your Notion database in a new tab and confirm the row appears with the correct title, channel, and permalink. Check that the Status column shows 'To Do' and that the URL is clickable and leads back to the original Slack message. Delete the test row from Notion after confirming it looks right.

  1. 1Click 'Test Step' on the Notion action block
  2. 2Open your Notion database in a separate tab
  3. 3Find the new row created by the test
  4. 4Verify title, channel, permalink, and status fields
  5. 5Delete the test row from Notion
What you should see: A new row appears in Notion with the message text as the title, the Slack channel name, a working permalink URL, and 'To Do' in the Status field.
11

Zap Editor > Name field > Publish button

Name and publish the Zap

Click the pencil icon at the top of the editor and give the Zap a clear name like 'Slack ✅ Reaction → Notion Task Board.' Click 'Publish.' The toggle at the top switches to On and turns blue. Zapier will now listen for new ✅ reactions in your chosen channel 24/7. The first real-world trigger should fire and create a Notion task within 1-2 minutes of someone reacting.

  1. 1Click the pencil icon next to the default Zap name
  2. 2Type a descriptive name for the Zap
  3. 3Click 'Publish'
  4. 4Confirm the toggle shows 'On' in blue
What you should see: The Zap status shows 'On' and you see it listed in your Zap dashboard with a green active indicator.

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 Zapier for this workflow

Use Zapier for this if your team is non-technical and needs this running today, not next week. The guided Zap builder handles the Slack OAuth, the Notion database schema detection, and the field mapping UI without anyone writing a line of code. Setup realistically takes 15-20 minutes including testing. The trigger is webhook-based, so tasks land in Notion within 1-2 minutes of the reaction — fast enough for any team workflow. The one scenario where you'd skip Zapier: if you're already using Make for other automations and have a free plan there, the identical workflow costs nothing on Make versus $19.99/month on Zapier's paid tier.

Cost

On Zapier's free plan you get 100 tasks/month. This Zap consumes 2 tasks per trigger if you include the Formatter step (1 for the formatter, 1 for the Notion action). At 2 tasks per trigger, the free tier caps out at 50 task-creation events per month — about 12 per week. A busy 10-person team can hit that in 2 days during sprint planning. The Starter plan at $19.99/month gives you 750 tasks — enough for 375 events/month. Make's free tier gives you 1,000 operations/month, and this workflow uses 2-3 operations per run, so you'd cover roughly 333-500 events for free. If you're creating more than 200 Slack-to-Notion tasks per month, Make is cheaper by $19.99/month.

Tradeoffs

Make does one thing better here: its Slack module can watch multiple channels simultaneously in a single scenario, and its text parsing tools (using the built-in replace() function with regex) are more visual than Zapier's Formatter step. n8n gives you full control over the Slack API payload — you can pull thread replies, resolve user IDs server-side, and write to multiple Notion databases conditionally, all in one workflow node using JavaScript. Power Automate has a native Slack connector but it's unreliable for reaction-based triggers — Microsoft's connector lags behind Slack's API changes. Pipedream lets you write the whole thing in Node.js with direct access to Slack's Web API, which means cleaner user resolution and zero per-task pricing. Zapier is still the right pick when the person setting this up is not a developer and doesn't want to maintain code or debug JSON schemas — the guided builder removes that entirely.

Three things you'll hit after going live. First: Slack user IDs in the message text. Any @-mention in the original message comes through as '<@U04BNKQ82>' and that's what lands in your Notion task title unless you add the Formatter regex step described in step 9. Second: Notion's Select and Status properties are strict — if you type 'todo' and the property option is 'To Do,' the field silently fails and saves blank. Check your exact option names before publishing. Third: if your Slack workspace uses any bots or automation tools that auto-react to messages (common in support channels), those bot reactions fire the Zap too. You'll end up with Notion tasks created by Zapier reacting to its own confirmation messages. Add a filter to exclude reactions from known bot user IDs on day one, before it creates noise in your task board.

Ideas for what to build next

  • Assign tasks based on channelAdd a Zapier Paths step to route tasks from different Slack channels to different Notion databases or assign them to specific team members automatically — tasks from #engineering go to the eng board, #marketing tasks go to the content board.
  • Send a Slack confirmation back to the threadAdd a second Notion action that posts a reply in the original Slack message thread confirming the task was created, with a direct link to the Notion entry — so the person who reacted knows it was captured.
  • Sync Notion task status back to SlackBuild a second Zap that triggers when a Notion task's Status changes to 'Done' and posts a message to the original Slack channel — closing the loop so the team knows when action items are resolved without checking Notion manually.

Related guides

Was this guide helpful?
Slack + Notion overviewZapier profile →