

How to Log Slack Messages to Copper CRM with Power Automate
When a message is posted in a designated Slack channel, Power Automate captures it and creates an activity note on the matching Copper contact record.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Sales or CS teams already in the Microsoft ecosystem who need customer Slack conversations recorded in Copper without manual copy-paste.
Not ideal for
Teams that need to log messages from multiple Slack workspaces or need bi-directional sync — use Make instead, which handles multi-workspace triggers natively.
Sync type
real-timeUse case type
syncReal-World Example
A 12-person SaaS customer success team tracks all customer conversations in a dedicated Slack channel per account (e.g., #client-acme-corp). Before this flow, reps copied Slack messages into Copper manually at end-of-day — or forgot entirely — leaving the CRM history 6-8 hours behind reality. With this flow running, every message posted in those channels lands in the matching Copper contact's activity feed within 90 seconds.
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
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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Message Text | details | |
| Sender Name | details | |
| Message Timestamp | activity_date | |
| Contact ID (Copper) | parent.id | |
| Parent Type | parent.type | |
| Activity Type | type | |
2 optional fields▸ show
| Slack Channel Name | details |
| Slack Message URL | details |
Step-by-Step Setup
make.powerautomate.com > My flows > + New flow > Automated cloud flow
Create a new Automated cloud flow
Go to make.powerautomate.com and sign in. In the left sidebar, click 'My flows', then click '+ New flow' at the top of the page. Select 'Automated cloud flow' from the dropdown — this is the event-triggered option, which is what you need since Slack will push the message to Power Automate in real time. Give the flow a name like 'Slack to Copper — Log Customer Messages', then click 'Skip' on the trigger selection dialog so you can search manually.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' at the top right
- 3Select 'Automated cloud flow'
- 4Enter flow name: 'Slack to Copper — Log Customer Messages'
- 5Click 'Skip' on the trigger picker dialog
Flow canvas > Trigger search > Slack > When a new message is posted to a channel
Add the Slack trigger for new messages
In the trigger search box, type 'Slack' and wait for the Slack connector to appear. Click it, then scroll through the trigger list to find 'When a new message is posted to a channel'. Click that trigger to select it. You'll be prompted to sign in to Slack — this creates a Connection that Power Automate stores for reuse. Sign in with the Slack account that has access to the customer channel you want to monitor.
- 1Type 'Slack' in the trigger search box
- 2Click the Slack connector from the results
- 3Select 'When a new message is posted to a channel'
- 4Click 'Sign in' and authenticate with your Slack account
- 5Confirm the connection shows your workspace name
channel: {{channel}}
ts: {{ts}}
Trigger card > Channel dropdown
Select the customer Slack channel to monitor
In the trigger card, click the 'Channel' dropdown. Power Automate will fetch your available public channels. Select the specific customer or prospect channel you want to log — for example, '#client-acme-corp'. If the channel is private, the Slack bot that Power Automate installed must be manually invited to that channel first using '/invite @Power Automate' inside Slack before it will appear in this list.
- 1Click the 'Channel' dropdown in the Slack trigger card
- 2Wait 2-3 seconds for channels to load
- 3Select your target customer channel (e.g., #client-acme-corp)
- 4Leave 'Message type' set to 'All' unless you only want direct messages
Flow canvas > + New step > Data Operation > Parse JSON
Add a 'Parse JSON' action to extract message fields
Click '+ New step' below the trigger. Search for 'Parse JSON' and select the 'Data Operation — Parse JSON' action. In the 'Content' field, insert the dynamic value 'Text' from the Slack trigger (this is the raw message body). For the Schema, click 'Generate from sample' and paste in a sample Slack message payload. This step extracts the sender username, timestamp, message text, and channel name as individual variables you can use in later steps.
- 1Click '+ New step'
- 2Search 'Parse JSON' and select 'Data Operation — Parse JSON'
- 3Click the 'Content' field and insert the dynamic value 'Text' from the Slack trigger
- 4Click 'Generate from sample'
- 5Paste a sample Slack message JSON payload and click 'Done'
Flow canvas > + New step > Data Operation > Compose
Add a Compose action to build the note body
Click '+ New step' and search for 'Compose' — select 'Data Operation — Compose'. This is where you build the formatted text that will appear inside the Copper activity note. In the Inputs field, type your note template and inject dynamic values from the Slack trigger and Parse JSON step. A good format is: 'Slack message from [User] in [Channel] on [Timestamp]: [Text]'. This gives the Copper record full context without requiring anyone to switch to Slack.
- 1Click '+ New step'
- 2Search 'Compose' and select 'Data Operation — Compose'
- 3In the Inputs field, type: 'Slack message from '
- 4Insert dynamic value 'User Name' from the Slack trigger
- 5Continue building: ' in #[Channel] on [Timestamp]: [Text]' using dynamic values
Flow canvas > + New step > Copper > Search People
Add the Copper 'Search People' action to find the contact
Click '+ New step' and search for 'Copper'. Select the Copper connector, then choose the action 'Search People' (or 'Get Person by Email' if you know the email is embedded in the Slack message). You'll be prompted to create a Copper Connection — enter your Copper API key (found in Copper > Settings > API Keys) and your Copper account email. In the search parameters, map the sender's email or name from the Slack message to find the matching Copper contact record.
- 1Click '+ New step'
- 2Search 'Copper' in the action picker
- 3Select 'Search People' from the Copper connector
- 4Click 'Sign in' and enter your Copper API key and email
- 5In the 'Name' or 'Email' field, insert the dynamic sender value from the Slack trigger
Flow canvas > + New step > Control > Condition
Handle the case where no Copper contact is found
After the Search People action, click '+ New step' and add a 'Condition' control. Set the condition to check if the Copper search result array is empty — use the expression: empty(body('Search_People')). In the 'Yes' branch (no contact found), add a 'Post message in a chat or channel' Slack action to alert your team that a contact couldn't be matched. In the 'No' branch, continue building the flow. This prevents the flow from crashing and swallowing errors silently.
- 1Click '+ New step'
- 2Select 'Control > Condition'
- 3In the condition field, switch to Expression mode
- 4Enter: empty(body('Search_People'))
- 5In the 'Yes' branch, add a Slack 'Post message' action to notify your team of the unmatched contact
Condition No branch > Add an action > Copper > Create Activity
Add 'Create Activity' in the 'No' branch to log the note
Inside the 'No' branch of your condition (contact was found), click 'Add an action'. Search for 'Copper' again and select 'Create Activity'. Set the 'Parent Type' to 'Person' and the 'Parent ID' to the ID field from the Search People result — use dynamic value 'ID' from the Copper search output. Set 'Activity Type' to 'Note'. In the 'Details' field, insert the Output from your Compose step — this is the formatted message text you built in Step 5.
- 1Click 'Add an action' inside the 'No' condition branch
- 2Search 'Copper' and select 'Create Activity'
- 3Set 'Parent Type' to 'Person'
- 4Set 'Parent ID' to the dynamic value 'ID' from the Search People output
- 5Set 'Activity Type' to 'Note' and insert the Compose output into 'Details'
Flow canvas > Save > Run history
Save and test the flow with a real Slack message
Click 'Save' at the top of the canvas — Power Automate will validate all steps and surface any missing required fields in red. Once saved, go to your monitored Slack channel and post a test message like 'Test log — checking CRM sync'. Wait up to 90 seconds, then return to Power Automate, click your flow name, and scroll to 'Run history' at the bottom. Click the most recent run to inspect each step's inputs and outputs.
- 1Click 'Save' at the top right of the canvas
- 2Go to your monitored Slack channel and post a test message
- 3Wait 60-90 seconds
- 4Return to make.powerautomate.com > My flows > click your flow name
- 5Click the most recent entry in 'Run history' and verify each step shows a green checkmark
My flows > [Flow name] > Settings > Send email notification for failed runs
Turn on the flow and set run notifications
Back on the flow detail page, confirm the toggle at the top shows 'On' — new flows default to On after saving, but verify this. Click the three-dot menu next to the flow name and select 'Edit' to access flow settings. Under 'Run only users', confirm the connection owner is set correctly. Optionally, go to the flow's 'Settings' tab and enable 'Send email notification for failed runs' so you're alerted if Slack or Copper credentials expire.
- 1Confirm the flow toggle is set to 'On' on the flow detail page
- 2Click the three-dot menu and select 'Edit'
- 3Click 'Settings' in the top menu of the canvas
- 4Enable 'Send email notification for failed runs'
- 5Click 'Save'
Paste this expression into a Compose action placed directly after the Slack trigger. It converts the Slack Unix timestamp to a readable local time, strips bot messages by checking for an empty bot_id field, and formats the full note body in one step — replacing the need for separate Parse JSON and Compose steps.
JavaScript — Code Step// Power Automate — Compose expression for full note body with timestamp conversion▸ Show code
// Power Automate — Compose expression for full note body with timestamp conversion // Paste this into the 'Inputs' field of a Data Operation > Compose action // Switch the field editor to Expression mode before pasting
... expand to see full code
// Power Automate — Compose expression for full note body with timestamp conversion
// Paste this into the 'Inputs' field of a Data Operation > Compose action
// Switch the field editor to Expression mode before pasting
concat(
'Slack message from ',
if(
empty(triggerBody()?['user_profile']?['real_name']),
triggerBody()?['user'],
triggerBody()?['user_profile']?['real_name']
),
' in #',
triggerBody()?['channel_name'],
' on ',
convertTimeZone(
addSeconds('1970-01-01T00:00:00Z', int(triggerBody()?['ts'])),
'UTC',
'Eastern Standard Time',
'yyyy-MM-dd HH:mm'
),
': ',
triggerBody()?['text']
)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 Power Automate for this if your team is already inside the Microsoft 365 ecosystem — SharePoint, Teams, Outlook — and your IT department controls app approvals. Power Automate's enterprise governance features (DLP policies, managed environments, run-as service accounts) make it easier to get security sign-off than explaining Make or n8n to a compliance team. Also use it if you need this flow to interact with other Microsoft services later, like writing to a SharePoint log or sending a Teams notification alongside the Copper note. If your team runs purely on Mac, uses Google Workspace instead of M365, and has no existing Power Platform footprint, the Copper premium connector cost alone makes this the wrong choice — go with Make.
Here's the real cost math. Power Automate's premium connectors require either a Power Automate Premium license at $15/user/month or a per-flow plan at $100/month for up to 5 flows. Copper is a premium connector, so the standard M365 license won't work. If you're a 5-person team logging 200 Slack messages per month, each run costs roughly 1 cloud flow run. You get 5,000 runs/month on the per-flow plan. The actual per-message cost is negligible once you're paying the base $100/month. By comparison, Make's free tier handles 1,000 operations/month and Copper is available via HTTP modules — meaning you could run this workflow for free at low volume on Make, versus $100+/month minimum on Power Automate.
Make does one thing better here: it supports monitoring multiple Slack channels in a single scenario using a filter on the channel name, without duplicating flows. Zapier has a native Copper integration that's simpler to configure than Power Automate's — the Zap setup takes about 12 minutes versus 35-45 minutes for this Power Automate flow. n8n lets you self-host and avoid per-connector licensing entirely, and its Slack and Copper HTTP nodes give you full control over the payload without workarounds for bot filtering. Pipedream handles the Slack webhook natively with zero configuration overhead. Power Automate wins here specifically when your organization already has Premium licenses assigned, your IT team requires everything on Microsoft infrastructure, or you need this flow to hand off to Teams or SharePoint in a later step.
Three things you'll hit after go-live. First: Slack display names drift from Copper contact names over time as people change their Slack profiles. The Search People lookup breaks silently — the flow succeeds, no note is created, and you don't know until a rep notices the Copper record is stale. Build in the unmatched-contact Slack alert from Step 7 on day one. Second: Power Automate throttles premium connector calls under heavy load. If you're monitoring 15+ client channels simultaneously with 15 flows, you may hit the 6,000 API calls/day limit on a single connection. Spread connections across two service accounts if volume climbs. Third: Copper's API returns activity timestamps in UTC with no time zone offset in the response. If your team is in EST and the note says '14:00', new reps will assume that's local time. Fix the timestamp conversion in the Compose step from day one using the convertTimeZone() expression — retrofitting it after 500 notes are already in the CRM creates inconsistency in the history.
Ideas for what to build next
- →Monitor multiple client channels with a single flow — Instead of cloning this flow for each client channel, build a SharePoint list mapping channel names to Copper contact IDs — then use a single flow with a lookup to that list to route messages to the right contact without duplicating logic.
- →Log Copper activity updates back to Slack — Add a reverse flow that triggers when a new note or activity is added in Copper and posts a summary back to the relevant Slack channel — giving the whole team visibility without checking the CRM manually.
- →Create a daily digest email of all logged Slack messages — Build a second Scheduled flow that runs each morning, queries Copper for all notes created in the last 24 hours with the tag 'Slack', and sends a formatted summary email to the team lead — replacing the need to scroll Slack history for follow-ups.
Related guides
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
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup