

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-timeUse case type
routingReal-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.
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.
Field Mapping
Map these fields between your apps.
| Field | API 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
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.
- 1Click 'Create Zap' in the left sidebar
- 2Click the empty trigger block labeled 'Trigger'
- 3Type 'Slack' in the app search field
- 4Select 'Slack' from the dropdown results
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.
- 1Click the 'Event' dropdown in the Slack trigger panel
- 2Scroll to or search for 'New Reaction Added'
- 3Select 'New Reaction Added'
- 4Click 'Continue'
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.
- 1Click 'Sign in to Slack' in the Account section
- 2Select your Slack workspace in the OAuth popup
- 3Review the permissions and click 'Allow'
- 4Confirm the connected account appears under 'Account'
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.
- 1Click the 'Reaction' field and type the emoji name (e.g., 'white_check_mark')
- 2Click the 'Channel' dropdown and select your target channel
- 3Leave 'Trigger for Bot Messages?' set to 'No'
- 4Click 'Continue'
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.
- 1Click 'Test Trigger'
- 2If no data returns, go to Slack and add your emoji to a real message
- 3Click 'Test Trigger' again
- 4Expand the returned record to confirm message text and user fields are visible
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.
- 1Click the '+' icon below the trigger block
- 2Search for and select 'Notion'
- 3Choose 'Create Database Item' from the Event dropdown
- 4Click 'Sign in to Notion' and complete the OAuth flow
- 5On the Notion permissions screen, select the specific database page to share with Zapier
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.
- 1Click the 'Database ID' dropdown
- 2Type the name of your Notion task database
- 3Select it from the results
- 4Wait for Zapier to load the database properties below
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.
- 1Click the 'Name' field and select 'Text' from the Slack trigger data
- 2Click the Assignee or Reporter field and select 'User' from the Slack data
- 3Click the Channel field and select 'Channel Name' from the Slack data
- 4Click the URL field and select 'Permalink' from the Slack data
- 5Type 'To Do' directly into the Status field
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.
- 1Click '+' between the Slack trigger and Notion action
- 2Search for and select 'Formatter by Zapier'
- 3Choose 'Text' then 'Replace'
- 4In 'Input' select the Slack 'Text' field
- 5In 'Find' type '<[^>]+>' and enable the 'Use Regex?' toggle
- 6Leave 'Replace' blank to remove the matches
- 7Click 'Continue' and run a test
📬 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
}channel: {{channel}}
ts: {{ts}}
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.
- 1Click 'Test Step' on the Notion action block
- 2Open your Notion database in a separate tab
- 3Find the new row created by the test
- 4Verify title, channel, permalink, and status fields
- 5Delete the test row from Notion
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.
- 1Click the pencil icon next to the default Zap name
- 2Type a descriptive name for the Zap
- 3Click 'Publish'
- 4Confirm the toggle shows 'On' in blue
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 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.
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.
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 channel — Add 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 thread — Add 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 Slack — Build 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
How to Create Notion Tasks from Slack with Pipedream
~15 min setup
How to Create Notion Tasks from Slack with Power Automate
~15 min setup
How to Create Notion Tasks from Slack with n8n
~20 min setup
How to Create Notion Tasks from Slack Messages 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