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

How to Archive Slack Messages to Notion with Make

Automatically saves a starred or emoji-reacted Slack message — including sender, timestamp, and thread content — as a new Notion database entry the moment it's flagged.

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

Best for

Teams that make decisions in Slack and need those decisions captured in a Notion knowledge base without copy-pasting.

Not ideal for

Teams needing full channel export or bulk historical archival — use Slack's native export or a dedicated backup tool instead.

Sync type

real-time

Use case type

backup

Real-World Example

💡

A 22-person product team uses this to capture every Slack message reacted with a 📌 pin emoji into a Notion database called 'Decision Log'. Before this, engineers would post decisions in #product-decisions and they'd get buried within 48 hours. Now every pinned message shows up in Notion within 90 seconds, tagged with the author and source 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 Make

Copy the pre-built Make blueprint and paste it straight into Make. 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.

Slack account with reactions:read and channels:history OAuth scopes available — these are standard for workspace-installed apps but require admin approval if your org restricts third-party installs
Notion account with a database already created that has at minimum these columns: Title (text), Author (text), Channel (text), Archived At (date), Permalink (URL)
Make account on any plan — the Free tier includes 1,000 operations/month, sufficient for up to ~250 message archives per month given 4 operations per run
Slack bot or app installed in the target workspace with permission to read message content from channels (not just public channel names) — requires channels:history for public channels or groups:history for private ones
Notion integration connected to the specific database page — Notion's OAuth requires you to explicitly grant page-level access during the connection flow, not just workspace-level access

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Message Text
Author Name
Channel Name
Archived At
Permalink
3 optional fields▸ show
Archived By
Thread Reply Count
Source Channel ID

Step-by-Step Setup

1

make.com > Scenarios > Create a new scenario

Create a new Make scenario

Log into Make at make.com and click the blue 'Create a new scenario' button in the top right of the Scenarios dashboard. You'll land on the visual scenario canvas — a dark grid where you'll drag and connect modules. The canvas starts empty with a single prompt circle in the center labeled 'Add a module'. This is your starting point for the trigger.

  1. 1Log into make.com
  2. 2Click 'Create a new scenario' in the top right
  3. 3Wait for the visual canvas to load
  4. 4Click the large circle with a question mark in the center of the canvas
What you should see: A module search panel slides in from the right side of the screen showing a search bar and app icons.
2

Canvas > Add module > Slack > Watch Reactions

Add the Slack trigger module

In the module search panel, type 'Slack' and select it from the results. Make will show you a list of Slack trigger options. Choose 'Watch Reactions' — this fires every time a specific emoji reaction is added to any message in your workspace. This approach is more reliable than watching starred messages because the Slack Stars API was deprecated in early 2023 for some plans.

  1. 1Type 'Slack' in the module search bar
  2. 2Click the Slack app icon
  3. 3Scroll to the 'Triggers' section
  4. 4Select 'Watch Reactions'
What you should see: A Slack module configuration panel opens, prompting you to connect a Slack account or select an existing connection.
Common mistake — Make's Slack 'Watch Reactions' trigger uses a webhook under the hood but requires the Slack app to be installed in your workspace with the reactions:read scope. If your Slack admin has restricted third-party app installs, you'll hit a 403 before the connection dialog even completes.
Make
+
click +
search apps
Slack
SL
Slack
Add the Slack trigger module
Slack
SL
module added
3

Slack module > Connection > Add > Slack OAuth

Connect your Slack account

Click 'Add' next to the Connection field to create a new Slack connection. Make will open a popup window that redirects to Slack's OAuth screen. Select the correct Slack workspace from the dropdown in the top right of that popup, then click 'Allow'. After authorization, Make returns you to the module config panel with your workspace name showing in the Connection field.

  1. 1Click the 'Add' button next to the Connection field
  2. 2In the Slack OAuth popup, confirm the correct workspace is selected in the top-right dropdown
  3. 3Click 'Allow' to grant Make the required permissions
  4. 4Wait for the popup to close and return to the Make canvas
What you should see: The Connection field now shows your Slack workspace name (e.g., 'Acme Corp') with a green checkmark.
Common mistake — If you have multiple Slack workspaces, the OAuth popup defaults to whichever workspace you last used in your browser. Double-check the workspace name before clicking Allow — connecting the wrong one means the trigger will never fire.
Make settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Make
popup window
Connected
green checkmark
4

Slack module > Watch Reactions > Reaction Name / Channel / Limit

Configure the Slack trigger settings

With the connection established, fill in the trigger configuration. Set 'Reaction Name' to the emoji you want to use as the archive trigger — type it without colons, e.g., 'pushpin' for 📌. Leave 'Channel' blank to watch all channels, or enter a specific channel ID to scope it. Set 'Limit' to 1. This module outputs one message bundle per reaction event, containing the message text, sender user ID, channel ID, timestamp, and permalink.

  1. 1In the 'Reaction Name' field, type your chosen emoji name without colons (e.g., pushpin)
  2. 2Leave 'Channel' blank to catch reactions across all channels, or paste a channel ID to restrict
  3. 3Set 'Limit' to 1
  4. 4Click 'OK' to save the module
What you should see: The Slack module on the canvas shows the emoji name beneath its icon, confirming the trigger configuration is saved.
Common mistake — The 'Reaction Name' field is case-sensitive and does not accept custom emoji aliases that include colons or spaces. If your team uses a custom emoji like :archive-this:, type archive-this with a hyphen — no colons.
5

Canvas > + after Slack trigger > Slack > Get a Message

Add a Slack 'Get a Message' module to fetch full content

The Watch Reactions trigger only gives you the message's timestamp and channel — not the full message text. Click the '+' icon to the right of the Slack trigger module to add a second module. Search for Slack again and select 'Get a Message'. This module takes the channel ID and message timestamp from the trigger and fetches the complete message object, including the text body, sender display name, and any thread replies count.

  1. 1Click the small '+' circle on the right edge of the Slack trigger module
  2. 2Search 'Slack' in the module panel
  3. 3Select 'Get a Message' under Actions
  4. 4Use the same Slack connection from Step 3
What you should see: A second Slack module labeled 'Get a Message' appears on the canvas connected to the trigger by a line.
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.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
6

Get a Message module > Channel ID / Message TS

Map fields in the 'Get a Message' module

In the 'Get a Message' configuration panel, click into the 'Channel ID' field and select the channel value from the Watch Reactions output — it appears in the dynamic variable picker as '1. Channel ID'. Do the same for 'Message TS', selecting '1. Item Timestamp' from the picker. These two values together uniquely identify any Slack message. Click 'OK' to save.

  1. 1Click into the 'Channel ID' field
  2. 2Click the variable picker icon (looks like a stack of coins)
  3. 3Select '1. Channel ID' from the Watch Reactions output
  4. 4Click into 'Message TS' and select '1. Item Timestamp'
  5. 5Click 'OK'
What you should see: Both fields show purple variable pills (e.g., '{{1.channel}}' and '{{1.item.ts}}') instead of typed text.
Common mistake — Do not manually type the timestamp. Slack timestamps are Unix epoch with microseconds (e.g., 1701234567.123456). Even a single digit off will return a 'message_not_found' error.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
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
7

Canvas > + after Get a Message > Slack > Get a User

Resolve sender name with 'Get a User' module

The message object returns a user ID like U04AB3XYZ, not a display name. Add a third module — Slack 'Get a User' — to convert that ID into a readable name before writing to Notion. Connect it after 'Get a Message'. In the User ID field, map '2. User' from the Get a Message output. This gives you fields like 'Real Name' and 'Display Name' to use in Notion.

  1. 1Click '+' after the 'Get a Message' module
  2. 2Search 'Slack' and select 'Get a User'
  3. 3Use the same Slack connection
  4. 4Map 'User ID' to '2. User' from the previous module's output
  5. 5Click 'OK'
What you should see: A third module 'Get a User' appears on the canvas. The User ID field shows the purple variable pill '{{2.user}}'.
Common mistake — Slack bot messages return a bot_id instead of a user ID. If your team has bots posting in channels you're watching, the Get a User module will error on those messages. Add a Router after Get a Message and filter for messages where the 'Bot ID' field is empty before hitting Get a User.

This formula goes in the 'Title' property field of Make's Notion module. It strips Slack's markdown link syntax (e.g., <https://example.com|label>) and user mention tags (e.g., <@U04AB3XYZ>) from the message text before writing to Notion, so your Notion entries don't contain raw Slack formatting tokens.

Copy this template{{replace(
▸ Show code
{{replace(
  replace(
    replace(

... expand to see full code

{{replace(
  replace(
    replace(
      replace(
        2.text;
        "/<@[A-Z0-9]+>/g";
        "[user]"
      );
      "/<#[A-Z0-9]+\\|([^>]+)>/g";
      "#$1"
    );
    "/<([^|>]+)\\|([^>]+)>/g";
    "$2"
  );
  "/<([^>]+)>/g";
  "$1"
)}}
8

Canvas > + after Get a User > Notion > Create a Database Item

Add the Notion 'Create a Database Item' module

Click '+' after 'Get a User' and search for Notion. Select 'Create a Database Item'. Connect your Notion account via OAuth — Make will open a Notion permission popup asking which pages to grant access. You must explicitly select the database you want to archive into, otherwise Make cannot see it. After connecting, use the 'Database ID' dropdown to select your archive database.

  1. 1Click '+' after the 'Get a User' module
  2. 2Search 'Notion' and select 'Create a Database Item'
  3. 3Click 'Add' to create a Notion connection
  4. 4In the Notion OAuth popup, check the box next to your archive database page
  5. 5Click 'Allow access', then select the database from the 'Database ID' dropdown in Make
What you should see: The Notion module populates a list of property fields matching your database schema — Title, Author, Channel, Message Text, Timestamp, Permalink, etc.
Common mistake — Notion's OAuth grants access only to pages you explicitly check in the permission popup. If your database is nested inside a parent page, you need to share the parent page — not just the database — otherwise the database won't appear in Make's dropdown.
9

Notion module > Create a Database Item > Property fields

Map Slack fields to Notion database properties

With the Notion module open, map each property field using values from the earlier modules. For the Title property, use '2. Text' from Get a Message (the message body). For Author, use '3. Real Name' from Get a User. For Channel, use '1. Channel ID' from Watch Reactions. For Timestamp, use formatDate({{1.item.ts}} * 1000; 'YYYY-MM-DDTHH:mm:ss') to convert the Unix timestamp to an ISO date. For Permalink, paste the message link from '2. Permalink' in Get a Message.

  1. 1Click the 'Title' property field and map '2. Text' from Get a Message
  2. 2Click the 'Author' field and map '3. Real Name' from Get a User
  3. 3Click the 'Channel' field and map '1. Channel Name' from Watch Reactions
  4. 4Click the 'Archived At' date field and enter: formatDate({{1.item.ts}} * 1000; "YYYY-MM-DDTHH:mm:ss")
  5. 5Click the 'Permalink' field and map '2. Permalink' from Get a Message
  6. 6Click 'OK'
What you should see: Each Notion property field shows a purple variable pill or formula. No fields show red error indicators.
Common mistake — Notion property names in Make are case-sensitive and must exactly match what's in your database. If your database has a column called 'Archived At' but you type 'archived_at' in Make, the field will silently fail to populate.
10

Make canvas > Run once (bottom left)

Run a test and verify the Notion entry

Click 'Run once' at the bottom left of the Make canvas. Then go to your Slack workspace and add your chosen emoji reaction (e.g., 📌) to any message in a channel Make has access to. Within 30-90 seconds, Make should detect the event and execute all four modules. Watch the module bubbles — each one gets a green checkmark and a number indicating how many bundles were processed.

  1. 1Click 'Run once' in the bottom toolbar
  2. 2Switch to Slack and react to any message with your chosen emoji
  3. 3Return to Make and watch the module execution indicators
  4. 4Click the green checkmark bubble on the Notion module to inspect the output data
  5. 5Open Notion and confirm the new database entry exists with correct field values
What you should see: All four modules show green checkmarks. In Notion, a new database row appears with the message text, author name, channel, timestamp, and permalink populated correctly.
Make
▶ Run once
executed
Slack
Notion
Notion
🔔 notification
received
11

Make canvas > Scenario toggle (bottom left) > ON

Activate the scenario

Once the test run looks correct, click the toggle switch at the bottom left of the canvas to turn the scenario ON. The toggle turns blue and the scenario status changes from 'OFF' to 'ON'. Make will now listen for the Slack webhook continuously. Check the 'History' tab after your first live run to confirm the scenario executed without errors.

  1. 1Confirm all modules show no red error badges
  2. 2Click the gray toggle switch at the bottom left — it turns blue
  3. 3Click 'Save' (floppy disk icon) to persist the active state
  4. 4Check the 'History' tab after the first real reaction to verify a successful run
What you should see: The scenario status badge at the top of the canvas reads 'ON' in blue. The scenario appears in your Scenarios list with a blue 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 Make for this workflow

Use Make for this if you need conditional logic between the trigger and the Notion write — for example, routing messages from different channels into different Notion databases, or skipping messages under 20 words. Make's visual Router module handles that in 5 minutes without writing code. Also use Make if you need to chain the Slack user ID lookup (Get a User) before writing to Notion — Make handles multi-step sequential calls cleanly in a single scenario. The one case where you'd pick something else: if your team already lives in Zapier and this is the only automation you need, Zapier's Slack + Notion Zap gets you to the same endpoint with fewer configuration steps.

Cost

The math on cost is straightforward. Each message archive uses 4 Make operations. Make's Free tier gives you 1,000 ops/month — that covers 250 archived messages/month at zero cost. If your team archives 50 messages/week (200/month), you stay free. At 100/week (400/month, 1,600 ops), you need the Core plan at $9/month. Zapier's equivalent would be a single-step Zap but you still need a multi-step Zap to do the user ID lookup, which requires Zapier's Starter plan at $19.99/month. Make is $10.99 cheaper per month for the same functionality once you're past the free tier.

Tradeoffs

Zapier's Slack integration has one edge here: its 'New Starred Message' trigger still works without emoji reactions, which some teams prefer as a simpler UX. n8n lets you self-host the entire thing, which matters if you're in a regulated industry where messages can't pass through Make's EU/US servers — n8n's Slack node also handles thread fetching more gracefully with its built-in loop nodes. Power Automate has a native Slack connector but it's shallow: no reaction-based trigger, only new messages in a channel, which is too noisy for this use case. Pipedream's Slack source events are faster (sub-30 second latency vs Make's 60-90 seconds) and free for low volume. Make still wins on the visual debugging experience — when something breaks, clicking a module's execution bubble to see exactly what Slack returned is faster to troubleshoot than reading JSON logs in Pipedream or n8n.

Three things you'll hit after setup. First: Slack's permalink field from the Watch Reactions trigger points to the reaction event, not the message itself — you need the permalink from the 'Get a Message' output, which is different. Map the wrong one and your Notion links will 404. Second: Notion's API rate limit is 3 requests per second. If you somehow batch-trigger this scenario rapidly (e.g., someone adds 10 reactions in 5 seconds), Make will queue the runs but Notion will return 429 errors on some of them — enable Make's built-in retry on the Notion module. Third: Slack message text uses its own markdown dialect where bold is *text* not text and links come as <https://url|label>. Notion won't render these correctly in its Title or rich text fields unless you strip or convert them first — the formula in the pro tip above handles the most common cases.

Ideas for what to build next

  • Add Slack confirmation replyAfter the Notion module succeeds, add a Slack 'Reply to a Thread' module that posts the Notion page URL back into the original message's thread. The person who reacted gets instant confirmation the message was saved, with a direct link.
  • Tag entries by channel categoryAdd a Make Router after the Slack trigger to branch by channel name. Messages from #product-decisions get tagged 'Product' in Notion, from #engineering-standups get tagged 'Engineering', etc. Keeps your archive database filterable without manual tagging.
  • Fetch and append thread repliesAdd a Slack 'Get a Thread' module after Get a Message to pull all replies in the conversation thread. Concatenate them with the parent message text and write the full discussion into a Notion 'Content' rich text property, not just the single flagged message.

Related guides

Was this guide helpful?
Slack + Notion overviewMake profile →