

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
scheduledUse case type
notificationReal-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.
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 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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Opportunity Name | name | |
| Pipeline Stage Name | stage_id | |
| Monetary Value | monetary_value | |
| Assignee ID | assignee_id | |
| Assignee Name | name | |
5 optional fields▸ show
| Close Date | close_date |
| Pipeline Name | pipeline_id |
| Company Name | company_name |
| Deal ID | id |
| Last Activity Date | date_last_contacted |
Step-by-Step Setup
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.
- 1Log in at make.com and go to the Scenarios section in the left sidebar
- 2Click the blue 'Create a new scenario' button in the top right
- 3When the canvas loads, click the large circle with a '+' in the center to add your first module
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.
- 1Type 'Copper' in the module search bar
- 2Select the Copper app from the results
- 3Choose 'Watch Opportunities' from the triggers list
- 4Click 'Add' to place the module on the canvas
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.
- 1In the Copper module panel, click 'Add' next to Connection
- 2In a separate tab, open Copper and go to Settings > Integrations > API Keys
- 3Copy your API key
- 4Paste the API key and your Copper account email into the Make connection dialog
- 5Click 'Save' to confirm the connection
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.
- 1Set the 'Watch' dropdown to 'Updated Opportunities'
- 2Set 'Limit' to 10
- 3Click 'OK' to close the module configuration
- 4Click the clock icon on the bottom of the Copper module
- 5Set the polling interval to 'Every 15 minutes' and click 'Save'
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.
- 1Hover over the arrow line between the Copper module and the next empty module slot
- 2Click the small wrench/filter icon that appears on the line
- 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)
- 4Add a second condition using OR logic: set 'Stage Name' to each stage you want to notify on, e.g. 'Proposal Made', 'Won', 'Negotiation'
- 5Click 'OK' to save the filter
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.
- 1Click the '+' after the Filter on the canvas
- 2Search for 'Router' in the module list
- 3Select 'Router' under the Tools category
- 4After the Router appears, click the '+' on each branch to add route-specific filters
- 5For each branch, click the wrench icon and set the Stage Name condition for that branch (e.g., Branch 1: Stage Name equals 'Won')
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}channel: {{channel}}
ts: {{ts}}
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.
- 1Click '+' at the end of a Router branch
- 2Search for and select 'Slack'
- 3Choose 'Create a Message' as the action
- 4Click 'Add' next to Connection
- 5Authorize Make via the Slack OAuth screen and select your workspace
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.
- 1Set the 'Channel' field to your target Slack channel (type # to search)
- 2Click inside the 'Text' field
- 3Use the variable picker (blue dropdown) to insert: Opportunity Name, Pipeline Stage Name, Monetary Value, Close Date, and Assignee Name from Copper
- 4Format the message, e.g.: '*{{name}}* just moved to *{{stage}}* — Value: ${{value}} | Close: {{close_date}} | Owner: {{assignee}}'
- 5Repeat this configuration on each Router branch, adjusting the message tone per stage (e.g., add 🎉 for Won deals)
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}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.
- 1Open Copper in a separate tab and manually update a test deal's stage
- 2Return to Make and click 'Run once' in the bottom toolbar
- 3Wait for the run to complete (green checkmarks appear on each module)
- 4Click the Copper module bubble to inspect the data payload
- 5Click the Slack module bubble to confirm the message was sent and review what was posted
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.
- 1Right-click the Slack 'Create a Message' module on the canvas
- 2Select 'Add error handler' from the context menu
- 3Choose 'Ignore' as the handler type for low-stakes notification failures
- 4Optionally, click '+' on the error handler branch and add a second Slack 'Create a Message' module pointing to #automation-errors
- 5In the error Slack module, map the error message using {{error.message}} in the Text field
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.
- 1Click the grey toggle switch in the bottom left of the canvas
- 2Confirm the toggle turns blue/green and the status reads 'Active'
- 3Navigate to the Scenario History tab to monitor the first automated poll
- 4After 15 minutes, return to History and confirm the run shows green with correct bundle counts
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
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.
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.
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 Digest — Build 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 Sheet — Extend 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 Context — When 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
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