Beginner~8 min setupCommunication & CRMVerified April 2026
Slack logo
Copper logo

How to Log Slack Messages to Copper with Zapier

When a Slack message is posted in a designated customer channel, Zapier creates an Activity log entry on the matching Copper contact record — no manual copy-paste required.

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

Best for

Small sales or account management teams (under 30 people) who run customer conversations in dedicated Slack channels and need those interactions visible in Copper without switching apps.

Not ideal for

Teams logging hundreds of Slack messages per day — at that volume, Zapier task costs add up fast and Make handles the same flow for free.

Sync type

real-time

Use case type

sync

Real-World Example

💡

A 12-person SaaS account management team tracks every enterprise customer in a dedicated Slack channel named after the account (e.g. #acme-corp). Before this automation, AEs had to manually paste key conversation notes into Copper after calls — and most skipped it. Now any message tagged with a specific emoji reaction (or posted in a monitored channel) instantly creates an Activity on the Copper contact, keeping the CRM timeline accurate without any extra steps.

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.

Zapier account — Free tier works for testing, but you'll need Starter ($19.99/mo) or higher for multi-step Zaps with Filter steps
Slack account with access to the target customer channel — you must be a member of the channel to authorize Zapier's access
Copper account with API access enabled — API keys are available on Copper's Basic plan and above under Settings > Integrations > API Keys
Copper contacts must already exist for the customers you're logging — this Zap logs to existing records; it does not create new contacts unless you explicitly enable that in the Find Person step
The Zapier Slack app must be invited to any private channels you want to monitor — run /invite @Zapier in each private channel before setup

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Activity Detailsdetails
Parent Typeparent.type
Parent IDparent.id
Activity Typetype.id
4 optional fields▸ show
Activity Dateactivity_date
Slack Message Permalinkdetails
Slack Channel Namedetails
Slack Usernamedetails

Step-by-Step Setup

1

Zapier Dashboard > Create Zap > Trigger > Search Apps

Create a new Zap and connect Slack

Log into Zapier at zapier.com and click the orange 'Create Zap' button in the left sidebar. You'll land in the Zap editor. In the Trigger box, search for 'Slack' and select it from the results. Zapier will prompt you to choose a Slack account — click 'Sign in to Slack' and authorize through the OAuth popup. Make sure you authorize the workspace that contains your customer channels.

  1. 1Click 'Create Zap' in the left sidebar
  2. 2Click the Trigger box labeled 'Search for an app'
  3. 3Type 'Slack' and select it from the dropdown
  4. 4Click 'Sign in to Slack' and complete the OAuth flow
  5. 5Click 'Continue' after the green Connected badge appears
What you should see: You should see a green 'Connected' badge next to your Slack workspace name inside the trigger panel.
Common mistake — If your workspace uses Slack Enterprise Grid, you must authorize at the org level, not the individual workspace level — otherwise the Zap won't see channels from other Grid workspaces.
2

Zap Editor > Trigger > Event dropdown

Choose the Slack trigger event

With Slack selected, click the 'Event' dropdown under 'Trigger Event.' Choose 'New Message Posted to Channel' — this fires instantly via webhook every time a new message lands in the channel you'll configure next. Do not choose 'New Mention' unless you specifically only want @-mention messages logged; that will miss most conversation messages.

  1. 1Click the 'Event' dropdown
  2. 2Select 'New Message Posted to Channel'
  3. 3Click 'Continue'
What you should see: The event field should display 'New Message Posted to Channel' and a new 'Channel' configuration section should appear below it.
Common mistake — Slack's 'New Message Posted to Channel' trigger includes bot messages and app notifications by default. If your channel has integrations that post alerts, those will also trigger the Zap — filter them out in Step 5 using Zapier's Filter step.
Zapier
+
click +
search apps
Slack
SL
Slack
Choose the Slack trigger event
Slack
SL
module added
3

Zap Editor > Trigger > Configure > Channel

Select the customer Slack channel

In the 'Channel' dropdown, select the specific Slack channel you want to monitor — for example, #acme-corp or a general #customer-comms channel. If you manage multiple customer channels, you'll need to create separate Zaps per channel or use a naming convention that a single channel catches (some teams funnel all customer messages into one #customer-log channel via a Slack workflow). Click 'Continue' after selecting the channel.

  1. 1Click the 'Channel' dropdown
  2. 2Search for or scroll to your target channel (e.g. #acme-corp)
  3. 3Select the channel
  4. 4Click 'Continue'
What you should see: The channel name should appear in the configuration panel. Zapier will attempt to fetch a sample message from that channel to use in later mapping steps.
Common mistake — Private channels require the Zapier Slack app to be invited manually. Go to the channel in Slack, type /invite @Zapier, then return to the Zap editor and refresh the channel list.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
4

Zap Editor > Trigger > Test Trigger

Test the Slack trigger

Click 'Test Trigger' — Zapier pulls the 3 most recent messages from the selected channel. Pick one that looks like a real customer conversation (not a bot notification). This sample will be used throughout the rest of the Zap setup for field mapping. If Zapier returns 'No results found,' post a test message to the channel first, then re-run the test.

  1. 1Click 'Test Trigger'
  2. 2Review the 3 sample messages Zapier returns
  3. 3Select the most representative message sample
  4. 4Click 'Continue with Selected Record'
What you should see: You should see a sample payload showing fields like 'Text,' 'User,' 'Channel,' 'Timestamp,' and 'Permalink.' These are the values you'll map to Copper in later steps.
Zapier
▶ Turn on & test
executed
Slack
Copper
Copper
🔔 notification
received
5

Zap Editor > + (between steps) > Filter by Zapier

Add a Filter to exclude bot and automated messages

Click the '+' icon between the trigger and your next action. Select 'Filter by Zapier.' Set the condition to: 'User' does not contain 'bot' AND 'Text' is not empty. This prevents Slack app notifications, CI/CD alerts, and blank system messages from creating junk Activity records in Copper. Without this filter, your Copper contact timelines will fill with noise within days.

  1. 1Click the '+' button between the trigger and the next action step
  2. 2Select 'Filter by Zapier' from the app list
  3. 3Set Filter Condition 1: 'User' — 'Does not contain' — 'bot'
  4. 4Click '+ AND' to add a second condition
  5. 5Set Filter Condition 2: 'Text' — 'Exists' (is not empty)
  6. 6Click 'Continue'
What you should see: The filter step should show 'Your Zap would have proceeded' when tested against the sample message you selected in Step 4.
Common mistake — Zapier's filter checks the raw Slack user ID string for the word 'bot' — this works for most Slack bots whose user IDs contain 'bot' in the display name. Check your specific bot names in Slack under Settings > Manage Apps if messages still slip through.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Copper
CO
notified
6

Zap Editor > Action > Search Apps > Copper > Sign In

Add a Copper action and connect your account

Click the '+' button after your filter step and search for 'Copper' in the app list. Select it. Zapier will ask you to choose a Copper account — click 'Sign in to Copper.' You'll need your Copper API key, which lives in Copper under Settings > Integrations > API Keys. Copy that key, paste it into Zapier, then enter the email address associated with your Copper account.

  1. 1Click '+' to add an action step
  2. 2Search for 'Copper' and select it
  3. 3Click 'Sign in to Copper'
  4. 4In Copper, navigate to Settings > Integrations > API Keys and copy your key
  5. 5Paste the API key and your Copper email into the Zapier connection modal
  6. 6Click 'Yes, Continue to Copper'
What you should see: A green 'Connected' badge should appear next to your Copper account name. Zapier will display 'Copper ([email protected])' as the connected account.
Common mistake — Copper API keys are tied to individual user accounts. If you use a shared service account email for this integration, make sure that user has the 'Edit' permission on contacts in Copper — read-only accounts will cause every action step to fail with a 403 error.
Zapier settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Zapier
popup window
Connected
green checkmark
7

Zap Editor > Action > Copper > Event dropdown

Choose the Copper action event

With Copper connected, select the action event from the dropdown. Choose 'Create Activity.' This creates a timestamped log entry attached to a Copper contact or lead record — exactly what you want for communication history. Do not choose 'Update Contact' here; that would overwrite contact fields rather than append a new interaction to the timeline.

  1. 1Click the 'Event' dropdown under Copper
  2. 2Select 'Create Activity'
  3. 3Click 'Continue'
What you should see: The action panel should expand to show Copper Activity fields including 'Parent Type,' 'Parent ID,' 'Activity Type,' and 'Details.'
8

Zap Editor > Action > Copper > Configure

Map Slack message data to Copper Activity fields

This is the critical mapping step. Set 'Parent Type' to 'Person' (or 'Lead' if you're logging pre-sales conversations). For 'Parent ID,' you'll need the Copper contact ID — see the warning below for how to handle this. Set 'Activity Type' to 'Note' or a custom type you've created in Copper for Slack messages. In the 'Details' field, map the Slack 'Text' field from the trigger. Also include the Slack 'Permalink' and 'Timestamp' so the full context is one click away from Copper.

  1. 1Set 'Parent Type' to 'Person'
  2. 2Set 'Parent ID' to the Copper contact ID (see warning about lookup step)
  3. 3Set 'Activity Type' to 'Note' or your custom Slack activity type
  4. 4Click the 'Details' field and insert the Slack 'Text' variable
  5. 5Append the Slack 'Permalink' and formatted 'Timestamp' to the Details field
What you should see: The Details field preview should show the actual Slack message text followed by a timestamp and a slack.com permalink URL.
Common mistake — Copper's 'Create Activity' action requires a numeric Copper contact ID — not the person's name or email. If you don't already have the Copper ID in your Slack message data, add a 'Find Person in Copper' action step before this one and use the returned ID. Search by email if the Slack channel description or topic includes the customer's email, otherwise you'll need a lookup table or custom field.
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
9

Zap Editor > + (before Create Activity) > Copper > Find Person

Add a 'Find Person in Copper' step (if needed)

If you don't have the Copper contact ID available from Slack data, insert a Copper 'Find Person' action before Step 8. Set the search to match by email address. This requires the customer's email to exist somewhere in your Slack data — common approaches are: (1) the channel topic contains the email, (2) a Slack custom field stores it, or (3) your team includes the email in a specific message format. Once found, use the returned 'ID' field in the Parent ID mapping back in the Create Activity step.

  1. 1Click '+' to insert a step before 'Create Activity'
  2. 2Select 'Copper' and choose 'Find Person'
  3. 3Map the email field from your Slack data source to the search field
  4. 4Enable 'Create Copper record if not found' only if you want auto-creation
  5. 5Click 'Test Step' to confirm a matching contact is returned
What you should see: Zapier should return a Copper person record with a numeric ID, name, and email. You'll see the ID field labeled something like '5523817' — use this in the Parent ID field in Step 8.
Common mistake — If 'Create record if not found' is enabled and your email lookup fails, Zapier will create a new blank contact in Copper. This can pollute your CRM with duplicate or incomplete records. Disable auto-creation and instead add a Zapier 'Filter' step to halt the Zap if no contact is found.
10

Zap Editor > Action > Copper > Test Step

Test the full Zap end-to-end

Click 'Test Step' on the Copper Create Activity action. Zapier sends the mapped data to Copper using the sample Slack message from Step 4. After the test completes, open Copper, navigate to the contact record you expected to be updated, and check the Activity tab. You should see a new Note entry with the Slack message text, timestamp, and permalink. If the activity doesn't appear, check the Zapier task log for the error detail.

  1. 1Click 'Test Step' in the Copper action panel
  2. 2Wait for the green 'Test was successful' confirmation
  3. 3Open Copper and navigate to the test contact record
  4. 4Click the 'Activity' tab on the contact
  5. 5Confirm the new Note entry shows the Slack message text and permalink
What you should see: The Copper contact's Activity tab should show a new Note timestamped within the last minute, containing the Slack message text and a clickable slack.com permalink.
11

Zap Editor > Name field (top) > Publish Zap button

Name and publish the Zap

Give your Zap a clear name like 'Slack #acme-corp → Copper Activity Log' so it's identifiable in your Zap dashboard later. Click 'Publish Zap' in the top right. The Zap switches to 'On' status and begins listening for new Slack messages immediately via webhook. Test it live by posting a message to the monitored channel and confirming the activity appears in Copper within 2 minutes.

  1. 1Click the Zap name field at the top of the editor and type a descriptive name
  2. 2Click 'Publish Zap' in the upper right corner
  3. 3Confirm the Zap status shows 'On' in green
  4. 4Post a real test message to the monitored Slack channel
  5. 5Check Copper after 60-90 seconds to confirm the Activity was created
What you should see: The Zap dashboard should show your new Zap with a green 'On' toggle. The task history tab should show a successful run within 2 minutes of your test Slack message.

Paste this into a 'Code by Zapier' step inserted between the Slack trigger and the Copper action. It formats the raw Slack Unix timestamp into a readable date, builds a clean Details string that includes the channel name, sender, message body, and permalink — and truncates messages over 2000 characters to stay within Copper's activity field limit. Configure inputData with the Slack fields from your trigger step.

JavaScript — Code Step// Code by Zapier — Slack message formatter for Copper Activity
▸ Show code
// Code by Zapier — Slack message formatter for Copper Activity
// Maps to: inputData.text, inputData.username, inputData.channel, inputData.timestamp, inputData.permalink
const rawText = inputData.text || '';

... expand to see full code

// Code by Zapier — Slack message formatter for Copper Activity
// Maps to: inputData.text, inputData.username, inputData.channel, inputData.timestamp, inputData.permalink

const rawText = inputData.text || '';
const username = inputData.username || 'Unknown user';
const channel = inputData.channel || 'Unknown channel';
const permalink = inputData.permalink || '';
const unixTimestamp = parseFloat(inputData.timestamp) || Date.now() / 1000;

// Convert Unix timestamp to readable date (YYYY-MM-DD for Copper)
const messageDate = new Date(unixTimestamp * 1000);
const activityDate = messageDate.toISOString().split('T')[0]; // e.g. 2023-12-01

// Truncate message body to 1800 chars to leave room for metadata
const MAX_BODY_LENGTH = 1800;
const truncatedText = rawText.length > MAX_BODY_LENGTH
  ? rawText.substring(0, MAX_BODY_LENGTH) + '... [truncated]'
  : rawText;

// Build the full Details string for the Copper Activity
const details = [
  `Slack message from ${username} in #${channel}`,
  `Sent: ${messageDate.toUTCString()}`,
  '',
  truncatedText,
  '',
  permalink ? `View original message: ${permalink}` : ''
].join('\n').trim();

return {
  formattedDetails: details,
  activityDate: activityDate,
  senderUsername: username
};

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, already on a Zapier plan for other Zaps, and monitors fewer than 5 dedicated customer channels. Setup takes about 25 minutes including the Find Person lookup step. The Zap fires within 60-90 seconds of a new Slack message, which is fast enough for async sales communication. If you're on Make already or you need to monitor 10+ channels dynamically, skip Zapier and build this in Make — the router module handles multi-channel matching in a single scenario without duplicating setup.

Cost

The cost math is straightforward. Each Slack message that passes the filter costs 3 Zapier tasks: Filter, Find Person, Create Activity. At 100 customer messages per month across your monitored channels, that's 300 tasks/month. Zapier's Starter plan includes 750 tasks/month at $19.99/month — you have headroom. At 300 messages/month (900 tasks), you're pushing against the limit and the next tier is $49/month for 2,000 tasks. Make's equivalent scenario runs at 3 operations per message too, but Make's free tier includes 1,000 operations/month and the Core plan ($9/month) gives you 10,000 — meaning Make handles 3x the volume at half the cost.

Tradeoffs

Make is better for multi-channel setups because its Router module can match incoming Slack messages to different Copper contacts based on channel name without building separate scenarios. n8n is better if you self-host and want zero per-task cost — the workflow is 5 nodes and runs in under 500ms. Power Automate is the right call if your company is Microsoft 365 heavy and already has Dataverse or Dynamics CRM; it connects natively without per-task billing. Pipedream is better if you want to enrich the Slack message with additional context (e.g. pull the company's Clearbit data) before logging to Copper — async steps and built-in HTTP requests make that 15 lines of code. Zapier is still right if you want to hand this setup to a sales ops person who has never written a line of code and needs it working this afternoon.

Three things you'll hit after going live. First, Copper's Activity API requires a numeric contact ID — not a name, not an email. If your Find Person lookup fails (wrong email, duplicate records, typo in the channel topic), the Create Activity step errors silently unless you have notifications turned on. Second, Slack's 'New Message Posted to Channel' trigger can fire for edited messages in some configurations, which creates duplicate or updated Activity entries in Copper — the Unix timestamp in the Slack payload changes on edit, so add a filter checking that the 'Subtype' field is empty (edits have a subtype of 'message_changed'). Third, Copper has a rate limit of 600 API requests per minute — you're extremely unlikely to hit it with this workflow, but if you ever try to replay 200 failed Zap tasks at once from the task history, you will get 429 errors and the replays will partially fail.

Ideas for what to build next

  • Log emoji-reacted messages onlyInstead of logging every message, modify the trigger to use Slack's 'New Reaction Added' event and only log messages that receive a specific emoji (e.g. :copper: or :log:). This gives your team manual control over what gets logged and eliminates noise.
  • Create a Copper Opportunity when a deal keyword appearsAdd a second Zap that watches the same Slack channel for keywords like 'proposal,' 'contract,' or 'pricing' and creates or updates a Copper Opportunity record when those words appear. Pairs with this Zap to give you both activity history and pipeline tracking from one channel.
  • Send a Slack confirmation when the Copper log is createdAdd a final action step that posts a threaded reply in Slack confirming the message was logged to Copper — include a direct link to the Copper contact record. This closes the loop for your team so they know the CRM is being updated in real time.

Related guides

Was this guide helpful?
Slack + Copper overviewZapier profile →