Intermediate~15 min setupCommunication & CRMVerified April 2026
Slack logo
Copper logo

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-time

Use case type

sync

Real-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.

/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 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.

Slack account with access to the customer channel you want to monitor, and permission to install apps in your Slack workspace
Copper CRM account with API access enabled — find your API key under Copper > Settings > API Keys
Power Automate Premium license (or per-flow plan) — Copper is a premium connector and will not work on standard Microsoft 365 plans
Slack workspace admin rights or explicit permission to authorize the Power Automate Slack app in your workspace
A consistent naming convention or email address in Slack profiles that matches Copper contact records — the lookup in Step 6 depends on this

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Message Textdetails
Sender Namedetails
Message Timestampactivity_date
Contact ID (Copper)parent.id
Parent Typeparent.type
Activity Typetype
2 optional fields▸ show
Slack Channel Namedetails
Slack Message URLdetails

Step-by-Step Setup

1

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.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' at the top right
  3. 3Select 'Automated cloud flow'
  4. 4Enter flow name: 'Slack to Copper — Log Customer Messages'
  5. 5Click 'Skip' on the trigger picker dialog
What you should see: You should see the flow canvas open with an empty trigger box labeled 'Search connectors and triggers'.
Common mistake — Do not choose 'Instant cloud flow' — that requires manual button press and won't fire automatically on new Slack messages.
2

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.

  1. 1Type 'Slack' in the trigger search box
  2. 2Click the Slack connector from the results
  3. 3Select 'When a new message is posted to a channel'
  4. 4Click 'Sign in' and authenticate with your Slack account
  5. 5Confirm the connection shows your workspace name
What you should see: The trigger card should show your Slack workspace name and a dropdown to select a channel.
Common mistake — Power Automate's Slack connector uses Slack's Events API under the hood, but it only supports monitoring one channel per trigger. If you need to monitor 10 client channels, you'll need 10 separate flows or a different platform.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
3

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.

  1. 1Click the 'Channel' dropdown in the Slack trigger card
  2. 2Wait 2-3 seconds for channels to load
  3. 3Select your target customer channel (e.g., #client-acme-corp)
  4. 4Leave 'Message type' set to 'All' unless you only want direct messages
What you should see: The trigger card shows the selected channel name. You should NOT see any error banners at this point.
Common mistake — Private channels won't appear in the dropdown until you invite the Power Automate bot into that channel from inside Slack. Skipping this step causes the trigger to fail silently.
4

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.

  1. 1Click '+ New step'
  2. 2Search 'Parse JSON' and select 'Data Operation — Parse JSON'
  3. 3Click the 'Content' field and insert the dynamic value 'Text' from the Slack trigger
  4. 4Click 'Generate from sample'
  5. 5Paste a sample Slack message JSON payload and click 'Done'
What you should see: The Parse JSON card shows a green schema preview with field names like 'user', 'text', 'ts', and 'channel' visible.
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.
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
5

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.

  1. 1Click '+ New step'
  2. 2Search 'Compose' and select 'Data Operation — Compose'
  3. 3In the Inputs field, type: 'Slack message from '
  4. 4Insert dynamic value 'User Name' from the Slack trigger
  5. 5Continue building: ' in #[Channel] on [Timestamp]: [Text]' using dynamic values
What you should see: The Compose card shows your note template with dynamic value pills (blue tags) for user, channel, timestamp, and text.
Common mistake — The Slack trigger returns 'User ID' (e.g., U04ABCXYZ), not a display name. To show a readable name, you need to add a 'Get User Info' Slack action before this step and pull 'Real Name' from that response instead.
6

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.

  1. 1Click '+ New step'
  2. 2Search 'Copper' in the action picker
  3. 3Select 'Search People' from the Copper connector
  4. 4Click 'Sign in' and enter your Copper API key and email
  5. 5In the 'Name' or 'Email' field, insert the dynamic sender value from the Slack trigger
What you should see: The Copper connection card shows 'Connected' with your account email, and the Search People action shows input fields for search criteria.
Common mistake — Copper's connector in Power Automate is a premium connector — it requires a Power Automate Premium license (or a per-flow plan). The standard Microsoft 365 license does not include it.
7

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.

  1. 1Click '+ New step'
  2. 2Select 'Control > Condition'
  3. 3In the condition field, switch to Expression mode
  4. 4Enter: empty(body('Search_People'))
  5. 5In the 'Yes' branch, add a Slack 'Post message' action to notify your team of the unmatched contact
What you should see: The canvas shows a branching condition block with 'Yes' and 'No' paths clearly labeled.
Common mistake — If you skip this step and the Slack sender has no matching Copper contact, the flow will throw a null reference error and the run history will show a red failure — with no notification to your team that a message was dropped.
8

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.

  1. 1Click 'Add an action' inside the 'No' condition branch
  2. 2Search 'Copper' and select 'Create Activity'
  3. 3Set 'Parent Type' to 'Person'
  4. 4Set 'Parent ID' to the dynamic value 'ID' from the Search People output
  5. 5Set 'Activity Type' to 'Note' and insert the Compose output into 'Details'
What you should see: The Create Activity card shows all required fields populated with dynamic values. No red validation errors should appear.
Common mistake — If Search People returns multiple matches (common with generic names), Power Automate wraps the result in an array and 'Apply to each' fires automatically — which creates a duplicate note on every matched contact. Add a 'First()' expression to pull only the top result: `first(body('Search_People'))?['id']`.
9

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.

  1. 1Click 'Save' at the top right of the canvas
  2. 2Go to your monitored Slack channel and post a test message
  3. 3Wait 60-90 seconds
  4. 4Return to make.powerautomate.com > My flows > click your flow name
  5. 5Click the most recent entry in 'Run history' and verify each step shows a green checkmark
What you should see: Every step in the run history shows a green checkmark. In Copper, open the matched contact and check the Activity tab — your Slack message should appear as a Note with the sender name, channel, and message text.
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.
Power Automate
▶ Test flow
executed
Slack
Copper
Copper
🔔 notification
received
10

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.

  1. 1Confirm the flow toggle is set to 'On' on the flow detail page
  2. 2Click the three-dot menu and select 'Edit'
  3. 3Click 'Settings' in the top menu of the canvas
  4. 4Enable 'Send email notification for failed runs'
  5. 5Click 'Save'
What you should see: The flow detail page shows status 'On' in green and the run history continues to populate as new Slack messages arrive.

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 flowInstead 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 SlackAdd 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 messagesBuild 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

Was this guide helpful?
Slack + Copper overviewPower Automate profile →