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

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

Use case type

notification

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

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

Pipedrive account with admin access — needed to create webhooks under Settings > Tools and Apps > Webhooks
Pipedrive API token — found under Personal Preferences > API in Pipedrive, used to resolve stage IDs to names via the REST API
Slack workspace with permission to add apps — the OAuth flow requires 'channels:write' and 'chat:write' scopes; a workspace admin may need to approve the Pipedream app
Pipedream account at pipedream.com — free tier supports this workflow but limits monthly invocations to 10,000 credits; estimate your deal stage change frequency before committing
Target Slack channel created in advance — the channel (#pipeline-alerts or similar) must exist before you configure the Slack step, or the send will fail with a 'channel_not_found' error

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Deal Titlecurrent.title
New Stage IDcurrent.stage_id
Previous Stage IDprevious.stage_id
Owner IDcurrent.owner_id
Deal IDcurrent.id
5 optional fields▸ show
Deal Valuecurrent.value
Currencycurrent.currency
Pipeline IDcurrent.pipeline_id
Event Timestampmeta.timestamp
Change Sourcemeta.change_source

Step-by-Step Setup

1

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.

  1. 1Click 'Workflows' in the left nav
  2. 2Click the blue '+ New' button in the top right
  3. 3Click the 'Add a trigger' block on the canvas
What you should see: The trigger selection panel opens on the right side of the screen showing a search box and app icons.
2

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.

  1. 1Type 'Pipedrive' in the trigger search box
  2. 2Click 'Pipedrive' in the results
  3. 3Scroll to find and click 'Deal Stage Changed'
  4. 4Click 'Connect Pipedrive Account' if no account is linked yet
What you should see: The trigger block shows 'Pipedrive — Deal Stage Changed' with a green account badge and a webhook URL field populated automatically by Pipedream.
Common mistake — Pipedrive sends webhook events for ALL pipelines by default. If you have multiple pipelines and only want to notify on one, you'll filter by pipeline_id in a later code step — don't try to filter here at the trigger level.
Pipedream
+
click +
search apps
Slack
SL
Slack
Select the Pipedrive trigger
Slack
SL
module added
3

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.

  1. 1Copy the webhook URL from the Pipedream trigger block
  2. 2In Pipedrive, navigate to Settings > Tools and Apps > Webhooks
  3. 3Click '+ Add webhook'
  4. 4Paste the URL, set Action to 'Updated', Object to 'Deal'
  5. 5Click 'Save'
What you should see: Pipedrive shows the new webhook entry in the list with a green status indicator. Back in Pipedream, the trigger block shows a received test event in the 'Recent Events' panel.
Common mistake — Pipedrive only sends webhook events for the user whose API credentials you used during setup. If your sales team uses multiple Pipedrive seats, make sure the connected account has admin-level access so all reps' deal moves trigger the webhook.
4

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.

  1. 1Click the 'Test' button on the trigger block
  2. 2Click a recent event in the 'Recent Events' panel
  3. 3Expand the 'current' object in the event inspector
  4. 4Note the exact key paths for stage_id, title, value, and owner_id
What you should see: The event inspector shows the full nested JSON. You can see 'current.stage_id' holding a numeric ID like 4 and 'previous.stage_id' holding the prior numeric ID like 2.
Common mistake — stage_id is a numeric integer, not a human-readable string like 'Negotiation'. You must resolve it to a stage name via the Pipedrive API in a code step — sending a raw stage ID to Slack is useless to your team.
5

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.

  1. 1Click '+ Add a step' below the trigger block
  2. 2Click 'Run Node.js code'
  3. 3Clear the default code in the editor
  4. 4Paste the pro tip code into the editor
  5. 5Replace YOUR_PIPEDRIVE_API_TOKEN with your actual API token or reference it from environment variables
What you should see: After clicking 'Test', the step output shows a JSON object with 'stageName', 'previousStageName', 'dealTitle', 'dealValue', and 'shouldNotify' fields. If the stage didn't actually change, 'shouldNotify' is false.
Common mistake — Store your Pipedrive API token in Pipedream's Environment Variables (Settings > Environment Variables), not hardcoded in the script. Hardcoded tokens show up in version history and logs.

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>`
    };
  }
});
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Pipedrive
PI
notified
6

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.

  1. 1Click '+ Add a step'
  2. 2Click 'Filter' from the step type list
  3. 3Click '+ Add condition'
  4. 4Set the left side to reference the previous step's 'shouldNotify' output
  5. 5Set the operator to 'is true'
What you should see: The filter block shows one condition. When you test it with a real stage-change event, the result shows 'Condition passed — workflow continues'. With a non-stage event, it shows 'Condition failed — workflow halted'.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
7

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.

  1. 1Click '+ Add a step'
  2. 2Search for 'Slack' and click it
  3. 3Select 'Send a Message (Advanced)' to get Block Kit support
  4. 4Click 'Connect Slack Account' and authorize via OAuth
  5. 5Set Channel to your target channel name, e.g. #pipeline-alerts
What you should see: The Slack step shows a green 'Connected' badge next to your workspace name. The Channel field accepts both channel names (#pipeline-alerts) and channel IDs (C01ABC123).
Common mistake — Use 'Send a Message (Advanced)' not the basic version if you want Block Kit formatting with bold text and emoji. The basic action only sends plain text strings.
8

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.

  1. 1Click into the 'Blocks' field in the Slack step
  2. 2Switch to the JSON editor mode
  3. 3Paste your Block Kit JSON structure
  4. 4Use Pipedream's reference picker to insert dynamic values like {{steps.code.$return_value.dealTitle}}
  5. 5Set the 'Text' fallback field to a plain-text summary for notification previews
What you should see: After clicking 'Test', a formatted Slack message appears in your target channel showing the deal name, previous stage, new stage, deal value, and owner name — not raw IDs.
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.
9

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.

  1. 1Click the three-dot menu icon on the workflow canvas toolbar
  2. 2Click 'Add Error Handler'
  3. 3Add a Slack step inside the error handler pointing to a #alerts-internal channel
  4. 4Reference {{error.message}} and {{error.step}} in the message body
What you should see: The canvas shows a red-bordered error handler block below the main flow. Test it by temporarily throwing an error in your code step — you should receive the error DM within 15 seconds.
10

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.

  1. 1Click the 'Deploy' button in the top right
  2. 2Confirm the workflow status shows 'Active' in green
  3. 3Open Pipedrive and move a test deal to a new stage
  4. 4Check the Pipedream event log under the workflow's 'Logs' tab
  5. 5Verify the Slack message appears in your channel with correct data
What you should see: The Slack channel receives a formatted message with the deal name, old stage, new stage, deal value with currency, and owner name — all within 10 seconds of the stage change in Pipedrive.
Common mistake — Pipedream free tier workflows pause after 30 days of inactivity. Set a calendar reminder to trigger a test deal move monthly, or upgrade to a paid plan to keep it permanently active.

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

Cost

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.

Tradeoffs

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 channelsExtend 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 movesCreate 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 reportingAdd 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

Was this guide helpful?
Slack + Pipedrive overviewPipedream profile →