

How to Send Pipedrive Deal Stage Alerts to Slack with Pipedream
Fires an instant Slack message to a designated channel whenever a Pipedrive deal changes pipeline stage, including deal name, owner, value, and new stage.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Sales teams that want sub-60-second Slack alerts with custom message formatting when deals advance or regress through Pipedrive pipeline stages.
Not ideal for
Teams who need no-code setup with zero JavaScript — use Zapier or Make instead.
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person B2B SaaS sales team routes deal stage changes to three separate Slack channels: #deals-won, #deals-negotiation, and #pipeline-alerts. Before this workflow, the sales manager ran a manual Pipedrive report every morning and posted updates by hand — stage changes from late-night calls went unannounced until the next day. Now the Slack message fires within 10 seconds of the rep moving the deal card.
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 Pipedream
Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 | ||
| Deal Title | current.title | |
| New Stage ID | current.stage_id | |
| Previous Stage ID | previous.stage_id | |
| Owner ID | current.owner_id | |
| Deal ID | current.id | |
5 optional fields▸ show
| Deal Value | current.value |
| Currency | current.currency |
| Pipeline ID | current.pipeline_id |
| Event Timestamp | meta.timestamp |
| Change Source | meta.change_source |
Step-by-Step Setup
pipedream.com > Workflows > + New
Create a new Workflow in Pipedream
Go to pipedream.com and sign in. Click 'Workflows' in the left sidebar, then click the blue '+ New' button in the top right. A blank workflow canvas opens with a trigger slot at the top labeled 'Add a trigger'. You'll configure Pipedrive as the event source here.
- 1Click 'Workflows' in the left nav
- 2Click the blue '+ New' button in the top right
- 3Click the 'Add a trigger' block on the canvas
Trigger Panel > Search > Pipedrive > Deal Stage Changed
Select the Pipedrive trigger
In the trigger search panel, type 'Pipedrive' and select it from the results. Pipedream will show a list of available Pipedrive trigger types. Select 'Deal Stage Changed' — this fires a webhook payload from Pipedrive every time a deal's stage_id changes. Do not select 'New Deal' or 'Deal Updated'; those fire on too many events.
- 1Type 'Pipedrive' in the trigger search box
- 2Click 'Pipedrive' in the results
- 3Scroll to find and click 'Deal Stage Changed'
- 4Click 'Connect Pipedrive Account' if no account is linked yet
Pipedrive > Settings > Tools and Apps > Webhooks > + Add Webhook
Register the Pipedream webhook in Pipedrive
Copy the webhook URL shown in your Pipedream trigger block. Open Pipedrive in a new tab, go to Settings > Tools and Apps > Webhooks, and click '+ Add webhook'. Paste the Pipedream URL into the Endpoint URL field. Set the Action to 'Updated' and Object to 'Deal'. Save it. Pipedrive will send a test ping immediately.
- 1Copy the webhook URL from the Pipedream trigger block
- 2In Pipedrive, navigate to Settings > Tools and Apps > Webhooks
- 3Click '+ Add webhook'
- 4Paste the URL, set Action to 'Updated', Object to 'Deal'
- 5Click 'Save'
Workflow Canvas > Trigger Block > Test > Event Inspector
Inspect the incoming Pipedrive payload
Click 'Test' on your trigger block to load a sample event. Pipedream shows the full JSON payload in the right panel. Find the key fields you'll need: current.stage_id, current.title, current.value, current.currency, current.owner_id, previous.stage_id, and meta.change_source. Expand each object to confirm the values look correct. You'll reference these paths in the next steps.
- 1Click the 'Test' button on the trigger block
- 2Click a recent event in the 'Recent Events' panel
- 3Expand the 'current' object in the event inspector
- 4Note the exact key paths for stage_id, title, value, and owner_id
Workflow Canvas > + Add a Step > Run Node.js Code
Add a Node.js code step to resolve stage names and filter
Click the '+ Add a step' button below the trigger and select 'Run Node.js code'. This step does two things: calls the Pipedrive API to resolve stage_id to a human-readable stage name, and filters out deal updates that aren't actually stage changes. Without this, you'll get Slack noise for every field edit on a deal. Paste the code from the Pro Tip section into the code editor.
- 1Click '+ Add a step' below the trigger block
- 2Click 'Run Node.js code'
- 3Clear the default code in the editor
- 4Paste the pro tip code into the editor
- 5Replace YOUR_PIPEDRIVE_API_TOKEN with your actual API token or reference it from environment variables
This code step goes between your Pipedrive trigger and your Slack step. It resolves both stage IDs and owner ID to human-readable names via the Pipedrive REST API, checks whether the stage actually changed, and returns a clean object your Slack step can reference directly. Paste it into a 'Run Node.js code' step — no npm installs needed, it uses the built-in fetch available in Pipedream's Node.js runtime.
JavaScript — Code Stepexport default defineComponent({▸ Show code
export default defineComponent({
async run({ steps, $ }) {
const event = steps.trigger.event.body;... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
const event = steps.trigger.event.body;
const current = event.current;
const previous = event.previous;
const apiToken = process.env.PIPEDRIVE_API_TOKEN;
const baseUrl = 'https://api.pipedrive.com/v1';
// Early exit: stage didn't actually change
if (current.stage_id === previous.stage_id) {
return { shouldNotify: false, reason: 'Stage unchanged' };
}
// Resolve current stage name
let stageName = `Stage ID ${current.stage_id}`;
let previousStageName = `Stage ID ${previous.stage_id}`;
let ownerName = `Owner ID ${current.owner_id}`;
try {
const [stageRes, prevStageRes, ownerRes] = await Promise.all([
fetch(`${baseUrl}/stages/${current.stage_id}?api_token=${apiToken}`),
fetch(`${baseUrl}/stages/${previous.stage_id}?api_token=${apiToken}`),
fetch(`${baseUrl}/users/${current.owner_id}?api_token=${apiToken}`)
]);
const stageData = await stageRes.json();
const prevStageData = await prevStageRes.json();
const ownerData = await ownerRes.json();
if (stageData.success) stageName = stageData.data.name;
if (prevStageData.success) previousStageName = prevStageData.data.name;
if (ownerData.success) ownerName = ownerData.data.name;
} catch (err) {
console.error('Pipedrive API lookup failed:', err.message);
// Continue with fallback IDs rather than crashing the workflow
}
const dealValue = current.value
? `${Number(current.value).toLocaleString('en-US')} ${current.currency}`
: 'No value set';
const dealUrl = `https://app.pipedrive.com/deal/${current.id}`;
const isWon = stageName.toLowerCase().includes('won');
const emoji = isWon ? ':trophy:' : ':arrow_right:';
return {
shouldNotify: true,
dealTitle: current.title,
previousStageName,
stageName,
dealValue,
ownerName,
dealUrl,
emoji,
slackMessage: `${emoji} *${current.title}* moved from *${previousStageName}* → *${stageName}*\n💰 ${dealValue} | 👤 ${ownerName}\n🔗 <${dealUrl}|View in Pipedrive>`
};
}
});
Workflow Canvas > + Add a Step > Filter
Add a filter step to halt non-stage-change events
Click '+ Add a step' and select 'Filter'. Set the condition to: the field 'shouldNotify' from the previous code step equals true. If this condition is false, Pipedream stops execution and doesn't send a Slack message. This is what prevents noise from deal title edits, note additions, or other non-stage field updates hitting your Slack channel.
- 1Click '+ Add a step'
- 2Click 'Filter' from the step type list
- 3Click '+ Add condition'
- 4Set the left side to reference the previous step's 'shouldNotify' output
- 5Set the operator to 'is true'
Workflow Canvas > + Add a Step > Slack > Send a Message
Add the Slack step to send the notification
Click '+ Add a step', search for 'Slack', and select the 'Send a Message' action. Connect your Slack account using Pipedream's Connected Accounts — this uses OAuth so no bot token copying is required. Set the Channel field to the Slack channel name where you want notifications (e.g., #pipeline-alerts). Build the message text using data from your code step output.
- 1Click '+ Add a step'
- 2Search for 'Slack' and click it
- 3Select 'Send a Message (Advanced)' to get Block Kit support
- 4Click 'Connect Slack Account' and authorize via OAuth
- 5Set Channel to your target channel name, e.g. #pipeline-alerts
Workflow Canvas > Slack Step > Blocks Field
Build the Slack message using Block Kit
In the Slack step's 'Blocks' field, enter a JSON Block Kit structure that references your code step outputs. Use the expression syntax (double curly braces or Pipedream's reference picker) to insert deal title, stage name, deal value, and owner name. A well-structured message takes 4 fields from the code step and formats them into a readable Slack card with an emoji header.
- 1Click into the 'Blocks' field in the Slack step
- 2Switch to the JSON editor mode
- 3Paste your Block Kit JSON structure
- 4Use Pipedream's reference picker to insert dynamic values like {{steps.code.$return_value.dealTitle}}
- 5Set the 'Text' fallback field to a plain-text summary for notification previews
Workflow Canvas > Three-dot Menu > Add Error Handler
Add error handling with a catch-all email or Slack DM
Click '+ Add a step' and select 'Add Error Handler' from the workflow menu (the three-dot icon on the canvas). Configure it to send a Slack DM to yourself or fire an email if any step throws. Without this, silent failures mean your team misses stage alerts and you have no idea why. Pipedream error handlers run when any upstream step throws an uncaught exception.
- 1Click the three-dot menu icon on the workflow canvas toolbar
- 2Click 'Add Error Handler'
- 3Add a Slack step inside the error handler pointing to a #alerts-internal channel
- 4Reference {{error.message}} and {{error.step}} in the message body
pipedream.com > Workflow Canvas > Deploy Button
Deploy the workflow and verify live
Click the grey 'Deploy' button in the top right of the canvas. The button turns green and shows 'Active'. Now go into Pipedrive and move a real deal from one stage to another. Watch the Pipedream workflow's event log — you should see the event arrive, both steps execute green, and the Slack message land in your channel within 10 seconds. Check that stage names are human-readable and the deal value shows the correct currency.
- 1Click the 'Deploy' button in the top right
- 2Confirm the workflow status shows 'Active' in green
- 3Open Pipedrive and move a test deal to a new stage
- 4Check the Pipedream event log under the workflow's 'Logs' tab
- 5Verify the Slack message appears in your channel with correct data
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 Pipedream for this if your team has even one person comfortable reading JavaScript. The Pipedrive webhook payload buries stage names behind numeric IDs, and resolving them requires an API call — Pipedream's Node.js code step handles that inline in the same workflow without needing a separate HTTP request action or a third-party lookup tool. Pipedream also processes webhooks in under 2 seconds, which matters when a rep closes a deal and the team is watching Slack. The one scenario where you'd pick something else: if your entire team is non-technical and no one will maintain code, go with Zapier — it has a native Pipedrive 'Deal Stage Changed' trigger that skips the webhook registration step entirely.
Pipedream charges in credits. This workflow costs roughly 50-100 credits per run: one trigger event, one Node.js step with 3 parallel API calls, one filter step, and one Slack step. At 100 deal stage changes per month, that's 5,000-10,000 credits. Pipedream's free tier gives you 10,000 credits/month, so most small sales teams run this for free. A 30-rep team moving deals aggressively might hit 500 events/month — that's 25,000-50,000 credits, which requires the Basic plan at $19/month. Zapier charges per task and would cost $49/month for the same volume on the Professional plan. Pipedream is cheaper by roughly $30/month at scale.
Zapier's advantage here is zero-code setup — the Pipedrive trigger resolves stage names automatically without any API calls. Make's advantage is its visual conditional router, which lets you branch to different Slack channels based on stage without writing code. n8n lets you self-host the entire workflow for free if you have a server, which matters for enterprise teams with data residency requirements. Power Automate integrates natively with Microsoft Teams if your company is Microsoft-first, but its Pipedrive connector is community-built and lags behind the official API. Pipedream wins here because the Node.js step collapses what would be 4-5 separate modules in Make into a single readable function — and when this breaks at 2am, you want to read code, not click through a visual diagram.
Three things you'll hit after going live. First, Pipedrive sends webhook events for programmatic updates too — if you have Pipedrive automations that move deals between stages automatically, you'll get double notifications: one from the human action and one from the automation. Check meta.change_source in the payload and filter out 'automation' if you only want human-triggered moves. Second, if a deal has no value set, current.value is null, not zero — the null check in the code step handles this, but if you skip it, you'll see 'null USD' in Slack. Third, Pipedream's free tier workflows go inactive after 30 days with no events. A quiet month with no deal movements will silently pause your workflow — and the first deal move after that won't trigger a notification because the workflow is sleeping.
Ideas for what to build next
- →Route by pipeline to separate Slack channels — Extend the code step to check current.pipeline_id and route enterprise deals to #enterprise-pipeline and SMB deals to #smb-deals. This takes about 10 additional lines of code in the same Node.js step.
- →Add a daily digest of all stage moves — Create a second Pipedream workflow on a scheduled trigger (daily at 9am) that queries the Pipedrive Deals API for all stage changes in the last 24 hours and posts a summary table to #sales-standup — so the team gets both instant alerts and a morning summary.
- →Log every stage change to a Google Sheet for velocity reporting — Add a Google Sheets step after the Slack step to append each stage change as a row with timestamp, deal name, from-stage, to-stage, and value. After 30 days you'll have enough data to calculate average time-in-stage and identify pipeline bottlenecks.
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