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

How to Send Copper Deal Stage Alerts to Slack with Make

Polls Copper for deal stage changes and posts a formatted Slack message to your sales channel whenever a deal moves forward or stalls.

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

Best for

Sales teams of 5-30 people who live in Slack and want deal movement visible without opening Copper.

Not ideal for

Teams needing instant sub-minute alerts — Copper has no native webhook for stage changes, so there will always be a polling delay.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 12-person SaaS sales team posts every Copper deal stage change to #deals-live in Slack, including deal value and owner name. Before this automation, reps relied on weekly pipeline reviews to catch stalled deals — by then, opportunities worth $8k-$20k had gone cold. Now the channel fires within 15 minutes of a stage move, and the team has cut average response-to-stall time from 4 days to same-day.

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.

Copper account with API access enabled and an API key generated under Settings > Integrations > API Keys
Copper user account has read access to Opportunities and pipeline stage data
Slack account with permission to post messages in the target sales channel (member or admin of that channel)
Make account on any plan — the Free plan includes 1,000 operations/month, which covers roughly 2,000 deal stage checks at 15-minute intervals
Copper pipeline stages documented and spelled exactly as they appear in Copper Settings > Pipelines (needed for Filter configuration)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Opportunity Namename
Pipeline Stage Namestage_id
Monetary Valuemonetary_value
Assignee IDassignee_id
Assignee Namename
5 optional fields▸ show
Close Dateclose_date
Pipeline Namepipeline_id
Company Namecompany_name
Deal IDid
Last Activity Datedate_last_contacted

Step-by-Step Setup

1

make.com > Scenarios > Create a new scenario

Create a new Make scenario

Log into Make at make.com. Click the blue 'Create a new scenario' button in the top right of the Scenarios dashboard. You'll land on the visual canvas with a single empty module in the center. This is your starting point — every module you add connects left to right in sequence.

  1. 1Log in at make.com and go to the Scenarios section in the left sidebar
  2. 2Click the blue 'Create a new scenario' button in the top right
  3. 3When the canvas loads, click the large circle with a '+' in the center to add your first module
What you should see: You see a blank canvas with one empty module circle and a search bar prompting you to pick an app.
Common mistake — Make auto-saves scenarios in Draft status. Don't activate the scenario until all modules are configured and tested — activating early can flood your Slack channel with test messages.
2

Canvas > Add Module > Copper > Watch Opportunities

Add the Copper 'Watch Opportunities' trigger

Search for 'Copper' in the module search bar and select it. From the list of available triggers, choose 'Watch Opportunities'. This is a polling trigger — Make will check Copper on the schedule you set and return any opportunities updated since the last run. It is the correct trigger for stage changes because Copper does not emit webhooks for pipeline stage updates.

  1. 1Type 'Copper' in the module search bar
  2. 2Select the Copper app from the results
  3. 3Choose 'Watch Opportunities' from the triggers list
  4. 4Click 'Add' to place the module on the canvas
What you should see: A Copper module labeled 'Watch Opportunities' appears on the canvas and a configuration panel opens on the right.
Common mistake — There is no 'Watch Stage Changes' trigger in Copper. 'Watch Opportunities' returns all updated opportunities — you will filter by stage change in a later step using a Filter or Router module.
Make
+
click +
search apps
Slack
SL
Slack
Add the Copper 'Watch Opport…
Slack
SL
module added
3

Copper > Settings > Integrations > API Keys

Connect your Copper account

In the module configuration panel, click 'Add' next to the Connection field. Make will open a credentials dialog. Enter your Copper API key and the email address associated with your Copper account. Your API key is in Copper under Settings > Integrations > API Keys. The connection is account-level, so everyone on your team sharing this scenario will use the same credentials.

  1. 1In the Copper module panel, click 'Add' next to Connection
  2. 2In a separate tab, open Copper and go to Settings > Integrations > API Keys
  3. 3Copy your API key
  4. 4Paste the API key and your Copper account email into the Make connection dialog
  5. 5Click 'Save' to confirm the connection
What you should see: The Connection field shows your Copper account email with a green checkmark, and the module configuration fields below it become active.
Common mistake — Copper API keys are tied to individual user accounts, not the organization. If the key owner leaves the company and their account is deactivated, this scenario will stop running. Use a shared service account or admin account key.
Make settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Make
popup window
Connected
green checkmark
4

Canvas > Copper Module > Configuration Panel

Configure the Copper trigger settings

Set 'Watch' to 'Updated Opportunities' so the trigger fires when existing deals are modified, not just when new ones are created. Set the 'Limit' field to 10 — this controls how many records Make retrieves per polling run. For most teams, 10 is enough headroom. Set the schedule to every 15 minutes by clicking the clock icon on the module, which controls polling frequency.

  1. 1Set the 'Watch' dropdown to 'Updated Opportunities'
  2. 2Set 'Limit' to 10
  3. 3Click 'OK' to close the module configuration
  4. 4Click the clock icon on the bottom of the Copper module
  5. 5Set the polling interval to 'Every 15 minutes' and click 'Save'
What you should see: The Copper module shows '15 min' in small text below the module icon, confirming the polling interval is set.
5

Canvas > Connection Line > Wrench Icon > Set up a filter

Add a Filter to isolate stage changes

Click the small wrench icon on the line connecting the Copper module to the next step, then click 'Set up a filter'. This filter prevents Slack messages from firing every time any field on an opportunity changes — you only want notifications when the pipeline stage specifically moves. You'll compare the current stage name against a stored previous value, but since Copper only returns the current state, the practical approach is to filter by specific stage names you care about.

  1. 1Hover over the arrow line between the Copper module and the next empty module slot
  2. 2Click the small wrench/filter icon that appears on the line
  3. 3In the filter dialog, set Condition 1 to: map 'Stage Name' from Copper > 'Does not equal' > leave value blank (this passes all stage updates through initially)
  4. 4Add a second condition using OR logic: set 'Stage Name' to each stage you want to notify on, e.g. 'Proposal Made', 'Won', 'Negotiation'
  5. 5Click 'OK' to save the filter
What you should see: A small filter icon appears on the connection line between the Copper trigger and the next module, indicating the filter is active.
Common mistake — Stage names in the filter must match Copper exactly, including capitalization and spacing. Go to Copper > Settings > Pipelines and copy the stage names character-for-character. A mismatch means zero notifications fire.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Copper
CO
notified
6

Canvas > Add Module > Tools > Router

Add a Router to send different messages per stage

Click the '+' button after the filter to add a new module, and search for 'Router'. The Router module splits the scenario into multiple branches — one per stage you care about. This lets you send a celebratory Slack message for 'Won' deals and a different, more subdued message for 'Stalled' or early-pipeline stages. Each branch gets its own filter and its own Slack message template.

  1. 1Click the '+' after the Filter on the canvas
  2. 2Search for 'Router' in the module list
  3. 3Select 'Router' under the Tools category
  4. 4After the Router appears, click the '+' on each branch to add route-specific filters
  5. 5For each branch, click the wrench icon and set the Stage Name condition for that branch (e.g., Branch 1: Stage Name equals 'Won')
What you should see: The canvas shows the Router module with two or more branches extending from it, each with a filter badge on the branch 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
7

Canvas > Router Branch > Add Module > Slack > Create a Message

Connect your Slack account

Click the '+' at the end of each Router branch and search for 'Slack'. Select the 'Create a Message' action. In the module panel, click 'Add' next to the Connection field. Make will redirect you to Slack's OAuth page. Log in as a user who has permission to post in your target channel. The connection grants Make the ability to post messages on that user's behalf — choose a bot account or shared team account if possible.

  1. 1Click '+' at the end of a Router branch
  2. 2Search for and select 'Slack'
  3. 3Choose 'Create a Message' as the action
  4. 4Click 'Add' next to Connection
  5. 5Authorize Make via the Slack OAuth screen and select your workspace
What you should see: The Slack module shows your connected workspace name in the Connection field. The 'Channel' and 'Text' fields below become editable.
Common mistake — If you connect with a personal Slack account instead of a bot, messages will appear to come from that person. Other reps may not realize it's automated and try to respond to the 'person'. Use a dedicated Slack bot or app connection to make the source clear.
8

Canvas > Slack Module > Configuration Panel > Text Field

Configure the Slack message for each stage

In the Slack 'Create a Message' module, set the Channel to your sales Slack channel (e.g., #deals-live). In the Text field, use Make's variable picker to build your message. Click the variable picker icon next to the Text field and map in fields from the Copper module: deal name, stage name, deal value, close date, and owner name. Format the message so it reads naturally in Slack — use Slack's mrkdwn formatting like *bold* for deal name and deal value.

  1. 1Set the 'Channel' field to your target Slack channel (type # to search)
  2. 2Click inside the 'Text' field
  3. 3Use the variable picker (blue dropdown) to insert: Opportunity Name, Pipeline Stage Name, Monetary Value, Close Date, and Assignee Name from Copper
  4. 4Format the message, e.g.: '*{{name}}* just moved to *{{stage}}* — Value: ${{value}} | Close: {{close_date}} | Owner: {{assignee}}'
  5. 5Repeat this configuration on each Router branch, adjusting the message tone per stage (e.g., add 🎉 for Won deals)
What you should see: The Text field shows a mix of static text and orange variable tokens representing Copper data fields. The preview at the bottom of the panel shows a realistic-looking Slack message.
Common mistake — Copper returns monetary values as raw numbers without currency symbols or comma formatting — '$50000' not '$50,000'. Use Make's built-in formatNumber() function in the Text field to format it: {{formatNumber(value; 2; '.'; ',')}}
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
9

Canvas > Bottom toolbar > Run once

Run a test with real Copper data

Click 'Run once' at the bottom left of the canvas. Make will poll Copper immediately and attempt to retrieve recently updated opportunities. If no deals have been updated recently, manually edit a test deal in Copper first to generate activity. After the run completes, click each module bubble to inspect the data bundles that passed through — confirm the stage name, deal name, and value are populated correctly.

  1. 1Open Copper in a separate tab and manually update a test deal's stage
  2. 2Return to Make and click 'Run once' in the bottom toolbar
  3. 3Wait for the run to complete (green checkmarks appear on each module)
  4. 4Click the Copper module bubble to inspect the data payload
  5. 5Click the Slack module bubble to confirm the message was sent and review what was posted
What you should see: Every module shows a green checkmark with a bundle count. The Slack module shows '1 bundle processed' and the message appears in your Slack channel within 30 seconds.
Common mistake — Make's 'Run once' uses the current timestamp as the start point. If you want to test with an older deal, temporarily change the Copper module's 'Updated after' field to a date before your test deal was last modified.
Make
▶ Run once
executed
Slack
Copper
Copper
🔔 notification
received
10

Canvas > Slack Module > Right-click > Add error handler

Add an error handler for failed Slack posts

Right-click the Slack module and select 'Add error handler'. Choose 'Rollback' or 'Ignore' depending on your tolerance — for notifications, 'Ignore' is usually fine since a missed ping is less harmful than a broken scenario. Alternatively, add a second Slack module in the error handler branch that posts to a private #automation-errors channel so you know when deliveries fail without exposing errors to the sales channel.

  1. 1Right-click the Slack 'Create a Message' module on the canvas
  2. 2Select 'Add error handler' from the context menu
  3. 3Choose 'Ignore' as the handler type for low-stakes notification failures
  4. 4Optionally, click '+' on the error handler branch and add a second Slack 'Create a Message' module pointing to #automation-errors
  5. 5In the error Slack module, map the error message using {{error.message}} in the Text field
What you should see: A red error handler branch appears extending from the Slack module. The scenario will continue running even if an individual Slack post fails.
11

Canvas > Bottom toolbar > Active toggle

Activate the scenario

Click the toggle switch in the bottom left of the canvas to turn the scenario from Off to On. Make will begin polling Copper every 15 minutes automatically from this point forward. Confirm the scenario status changes to 'Active' in green. Check back after the first scheduled poll (within 15 minutes) to confirm the scenario history shows a successful run in the Scenario History tab.

  1. 1Click the grey toggle switch in the bottom left of the canvas
  2. 2Confirm the toggle turns blue/green and the status reads 'Active'
  3. 3Navigate to the Scenario History tab to monitor the first automated poll
  4. 4After 15 minutes, return to History and confirm the run shows green with correct bundle counts
What you should see: The scenario status shows 'Active' in the scenario list. The History tab shows the first scheduled run within 15 minutes of activation.

Paste this into a Make 'Set Variable' module placed between the Copper trigger and the Router. It evaluates the deal's close date against today's date and appends an urgency tag to the stage name — so your Router can branch on 'Won-URGENT' vs 'Won' and send a different Slack message for deals closing within 7 days. Map the output variable 'enrichedStage' into your Router filter conditions instead of the raw stage name.

JavaScript — Custom Function// Make Set Variable module — Formula field for 'enrichedStage'
▸ Show code
// Make Set Variable module — Formula field for 'enrichedStage'
// Place this module between Copper trigger and Router
// Step 1: Calculate days until close

... expand to see full code

// Make Set Variable module — Formula field for 'enrichedStage'
// Place this module between Copper trigger and Router

// Step 1: Calculate days until close
// In the 'Days Until Close' variable field:
round(
  (parseDate({{3.close_date}}; "YYYY-MM-DD") - now) / 86400000
)

// Step 2: Build enriched stage label
// In the 'enrichedStage' variable field:
if(
  {{3.stage_id}} = "Won";
  if(
    {{days_until_close}} <= 7;
    "Won-URGENT";
    "Won"
  );
  if(
    {{3.stage_id}} = "Negotiation";
    if(
      {{days_until_close}} <= 7;
      "Negotiation-URGENT";
      "Negotiation"
    );
    {{3.stage_id}}
  )
)

// Step 3: Format close date for Slack readability
// In a third variable 'formattedCloseDate':
formatDate(parseDate({{3.close_date}}; "YYYY-MM-DD"); "MMM D, YYYY")

// Step 4: Format monetary value with commas
// In a fourth variable 'formattedValue':
formatNumber({{3.monetary_value}}; 0; "."; ",")

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 your team wants conditional routing without writing code. The Router module lets you send a different Slack message for a 'Won' deal versus a 'Proposal Made' deal in about 10 minutes of configuration — no code, no workarounds. Make also handles the Copper polling and Slack OAuth in native modules, so there's nothing to host or maintain. The one scenario where you'd pick something else: if you need sub-minute latency on stage changes. Copper doesn't support webhooks for pipeline events, so any tool you use will poll — but if 15-minute delays are genuinely unacceptable, Pipedream can poll at 1-minute intervals on its free tier and handles that edge case better.

Cost

This scenario costs roughly 11,500 operations per month at 15-minute polling with 3 deals returned per run. Make's Free plan gives you 1,000 operations — that runs out in under 4 days. The Core plan at $9/month includes 10,000 operations, which covers light usage (under 2 active deals updating daily). The Pro plan at $16/month includes 10,000 operations with higher-frequency scheduling options. For most sales teams of 10-30 people with 5-15 active deals moving per week, the Core plan handles it. If you're running 50+ deals per week with sub-5-minute polling, budget for Pro. By comparison, Zapier's equivalent setup costs $49/month minimum (Professional plan) for the same volume — Make wins on price by $30+/month here.

Tradeoffs

Zapier has a dedicated Copper trigger called 'Updated Deal Stage' that is simpler to set up than Make's Watch Opportunities approach — 5 minutes vs. 15 minutes, and no Filter module needed. That's a genuine advantage for teams who want faster setup. n8n's Copper integration is less mature and requires more manual HTTP request configuration, which adds 30+ minutes of setup time with more failure points. Power Automate has no native Copper connector — you'd need to build a custom HTTP connector, which is an afternoon of work. Pipedream handles Copper polling cleanly with JavaScript and can poll every minute on the free tier, but you need to write the stage-change detection logic yourself. Make wins for non-technical teams who want the Router's visual branching without touching code — Zapier wins if you want the absolute fastest setup and don't need multi-branch routing.

Three things you'll hit after going live. First: Copper's API returns assignee as a numeric ID (e.g., 892341), not a name. Your Slack message will say 'Owner: 892341' until you add a Copper Get User lookup module — plan for that extra module from the start. Second: if two team members edit the same deal within the same 15-minute polling window, the scenario may process it twice and post duplicate Slack messages. A Make Data Store with a deal-ID-plus-stage key prevents this but adds 2 operations per run. Third: Copper rate-limits API requests to 600 per minute. Make's polling well within that limit, but if you're also running other Make scenarios against Copper simultaneously (e.g., contact sync, activity logging), check your combined operation rate — hitting the limit causes silent polling failures with no error message in Make's scenario history.

Ideas for what to build next

  • Add a Daily Stalled Deals DigestBuild a second Make scenario on a daily schedule that queries Copper for deals with no stage change in 14+ days and posts a summary list to Slack every morning at 9am.
  • Route Won Deals to a CRM Summary SheetExtend the Won branch of the Router to also write a row to a Google Sheet with deal name, value, owner, and close date — giving leadership a running log without a separate report.
  • Add Slack Thread Replies for ContextWhen a deal moves to Negotiation or later stages, use Slack's 'Reply to a Thread' action to post deal history (last activity date, number of touchpoints) as a thread under the original stage notification.

Related guides

Was this guide helpful?
Slack + Copper overviewMake profile →