Discuss your task

HubSpot + Slack: Smart Deal Notifications

HubSpot + Slack: Smart Deal Notifications

The native HubSpot and Slack integration works - but it creates exactly one problem: within a week, reps turn off notifications because #sales turns into a log file. Below is what is actually wrong with the native approach, which patterns genuinely work, and how to build a webhook -> Slack API setup with conditional routing and Block Kit formatting.

Why the native integration is an anti-pattern at scale

HubSpot App Marketplace offers an official Slack app. It connects in 5 minutes and starts sending notifications: new deals, stage changes, tasks. With a team of 3 reps and 20 deals a month - fine. With 12 reps, 4 customer segments, and 200+ active deals - it is a disaster.

The typical picture after 2-3 weeks of use:

  • The #sales channel receives 150-300 notifications per day
  • 80% of them are irrelevant to any given rep (other people’s deals, minor updates, technical field changes)
  • Reps turn off Slack notifications or mute the channel
  • Critical events (a large deal moving to “Negotiation”, a hot lead sitting idle) get buried in the noise

The solution is not to notify less - it is to notify correctly: the right person, in the right channel, with the right context.

What the native integration can do (and where the ceiling is)

The HubSpot app for Slack, according to the official HubSpot documentation, supports:

  • Event notifications via HubSpot Workflows (deal creation, Deal Stage change, new contact)
  • Search across HubSpot objects via the slash command /hubspot [query]
  • Basic task creation from Slack (/hubspot task create) - without linking to CRM objects
  • Action Buttons in notifications: create a task, log an activity, update a property (available in some notifications)

The ceiling of the native integration is its architectural constraint: a notification goes to a single pre-configured channel. Natively, there is no:

  • Conditional routing by deal attributes (amount, ICP segment, geography, stage)
  • Block Kit formatting with arbitrary fields and buttons
  • DM to the specific deal owner triggered by an event
  • Deduplication (the same event will not trigger multiple notifications)
  • Awareness of working hours by the rep’s timezone

When configuring through HubSpot Workflows you can create multiple workflows with different conditions - each sending a notification to its own channel. This works, but quickly becomes unmanageable: for 5-6 routing conditions you need 5-6 separate Workflows that are hard to maintain and debug.

What does not work without a custom setup

Conditional routing by ICP, amount, and stage

A practical scenario: a company works with three segments - Enterprise (deals from $50k), Mid-Market ($10k-50k), and SMB (up to $10k). The notification logic is fundamentally different:

  • Enterprise: any deal movement goes to #enterprise-deals, DM to the account manager and VP Sales
  • Mid-Market: notification on stage change to “Proposal Sent” and “Negotiation” - in #midmarket-pipeline
  • SMB: only on close (Closed Won / Closed Lost) - in #smb-results

The native integration cannot handle this. HubSpot Workflows allow you to add conditions (if Deal Amount > 50000), but full multi-level routing with dynamic channel selection is not achievable - it is not the right tool for that.

Formatted messages with Block Kit

A native notification looks roughly like this:

New deal stage: Acme Corp -> Negotiation

That is text without context. The rep does not see the amount, does not know who owns it, there is no link to the deal in HubSpot, and there is no quick-action button.

Slack Block Kit is a JSON format for structured messages with sections, fields, buttons, and images. A Block Kit notification looks fundamentally different: a header with the stage, a block with the amount and owner, a direct link to the deal in HubSpot, and “Schedule a Meeting” and “Create Task” buttons. The rep sees full context and can respond right from Slack.

Example Block Kit payload for a deal notification:

{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "Deal moved to Negotiation"
      }
    },
    {
      "type": "section",
      "fields": [
        { "type": "mrkdwn", "text": "*Company:*\nAcme Corp" },
        { "type": "mrkdwn", "text": "*Amount:*\n$85,000" },
        { "type": "mrkdwn", "text": "*Owner:*\n@john" },
        { "type": "mrkdwn", "text": "*Stage:*\nNegotiation" }
      ]
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": { "type": "plain_text", "text": "Open in HubSpot" },
          "url": "https://app.hubspot.com/contacts/PORTAL_ID/deal/DEAL_ID",
          "style": "primary"
        },
        {
          "type": "button",
          "text": { "type": "plain_text", "text": "Create Task" },
          "action_id": "create_task",
          "value": "DEAL_ID"
        }
      ]
    }
  ]
}

Two-way deal interaction from Slack

A one-way notification (HubSpot -> Slack) is half the value. The real time savings come when a rep can respond directly in Slack without opening the CRM.

The native integration supports a limited set of Action Buttons, but the link to a specific CRM object behaves unpredictably. For full two-way interaction you need a custom Slack App with an action-callback handler: pressing the “Create Task” button in a Slack message -> the backend handles the action -> creates a Task in HubSpot via the API linked to the correct deal.

Notification deduplication

HubSpot can trigger several events in a short window: a rep updates 3 fields on a deal - Slack receives 3 notifications within 30 seconds. The native integration cannot group events.

A custom setup solves this through buffering with a timeout: the first event on a deal starts a timer (30-60 seconds), all subsequent events within that window are grouped, then a single summary notification is sent.

Custom setup: webhook + Slack API

Architecture: HubSpot Webhook -> backend service -> Slack API.

Step 1: configure the HubSpot Webhook

HubSpot supports webhooks via the HubSpot Webhooks API. Configure it under Settings -> Integrations -> Private Apps -> create a Private App with CRM object permissions, then in Webhooks specify the backend service URL and event types (deal.stageChange, deal.creation, deal.propertyChange).

HubSpot sends a POST request to that URL on each event. The payload contains objectId (deal ID), propertyName, propertyValue, and changeSource.

Step 2: backend routing logic

On receiving an event the backend enriches the data: it fetches the deal via the HubSpot CRM API (amount, owner, ICP segment, stage), applies routing rules, and sends a formatted message to Slack:

def route_deal_notification(deal: dict) -> str:
    amount = float(deal.get('amount', 0) or 0)
    segment = deal.get('hs_custom_segment', '')

    if amount >= 50000 or segment == 'enterprise':
        return '#enterprise-deals'
    elif amount >= 10000:
        return '#midmarket-pipeline'
    else:
        return '#smb-results'

def build_slack_payload(deal: dict, event_type: str) -> dict:
    return {
        'channel': route_deal_notification(deal),
        'blocks': build_block_kit_blocks(deal, event_type)
    }

Step 3: map HubSpot owner to Slack user ID

For DM notifications you need to match the HubSpot owner ID to a Slack user ID. This is done once through a small config file or a database table. The Slack API accepts a user ID as the channel in chat.postMessage - that is what creates a DM.

Step 4: Slack App with an actions handler

For two-way interaction (Block Kit buttons) you need a Slack App with an Interactivity URL - an endpoint that Slack calls when a button is pressed. The backend handles the action, calls the HubSpot API, and confirms execution via respond() directly in the Slack thread.

Full stack: Python or Node.js service (Firebase Functions / AWS Lambda / Railway), HubSpot Private App, Slack App with Bot Token and scopes chat:write, im:write, channels:join.

A real case

A B2B SaaS company with 14 reps across 3 countries running HubSpot Sales Hub Professional. Before the custom integration: native HubSpot + Slack app, a single #deals channel, 180-250 notifications per day. After 3 weeks, 11 out of 14 reps had turned off channel notifications. Several Enterprise deals in the Negotiation stage sat without a response for 24-48 hours because notifications were drowning in the stream.

After the custom setup:

  • Routing across 4 channels: #enterprise (from $50k), #midmarket ($10k-50k), #smb (up to $10k), #deals-won (all closed)
  • DM to the deal owner when a deal has been idle for more than 5 days
  • Block Kit with amount, stage, next step, and an “Open in HubSpot” button
  • Notifications only during working hours in the rep’s timezone (9:00-19:00)
  • Deduplication: multiple changes within 60 seconds produce a single summary message

Result after one month: 15-25 notifications per day in #enterprise (instead of 200+ across everything), all reps had notifications turned back on, average response time to an Enterprise event dropped from 18 hours to 2 hours.

For more on automating AI call summaries to a HubSpot contact, see the article on HubSpot AI call summary.

Who this applies to

A custom HubSpot Webhook + Slack API setup is justified when:

  • The sales team has 6-8 reps or more
  • There are multiple deal segments with different priorities (Enterprise vs SMB)
  • Reps work across different timezones
  • Native notifications are already turned off or ignored
  • Speed of response to Enterprise events matters (hours, not days)

If the team is small and the pipeline is homogeneous - the native integration via HubSpot Workflows with a few conditional branches will cover most needs. For a comparison with alternative CRM platforms and notification approaches, the Kommo CRM overview shows a different model for working with messengers.

If you need a custom setup - Exceltic.dev designs and implements HubSpot + Slack integrations: conditional routing, Block Kit, two-way interaction, deduplication.

Frequently asked questions

Can conditional routing be configured entirely through HubSpot Workflows without code?

Partially. For 2-3 conditions (for example, amount above a threshold -> a different channel) this is achievable through multiple Workflows with different triggers and actions. With 5+ conditions or dynamic routing on custom properties, the Workflow approach becomes unmanageable: every change to the logic requires editing several Workflows at once.

What is Block Kit and is it necessary?

Block Kit is Slack’s message formatting system using JSON blocks: sections, fields, buttons, images. Official documentation: api.slack.com/block-kit. Without Block Kit a notification is a line of text. With Block Kit it is a structured deal card with action buttons. For informational notifications Block Kit is optional. For two-way interaction (buttons) it is required.

The native HubSpot + Slack integration supports Action Buttons - is that not enough?

Native Action Buttons (create task, log activity) appeared in 2024-2025 and work for basic scenarios. The limitation: the action does not always bind to the specific deal from the notification, there is no way to add custom buttons with arbitrary action_id values, and there is no way to programmatically handle a button press and execute logic on the backend.

How long does implementing a custom integration take?

A typical project includes: HubSpot Private App and Webhooks configuration, a backend service with routing and deduplication, a Slack App with Block Kit and an actions handler, owner -> Slack user ID mapping. Usually 2-3 weeks. Post-launch support and extending the routing logic is minimal.

How do you ensure notification delivery reliability?

HubSpot Webhooks have a retry mechanism: if the endpoint returns anything other than 200, HubSpot retries the request several times. On the backend side it is important to: respond with 200 immediately (do not wait for the Slack API), process the event asynchronously, and store processed event identifiers for idempotency (so a retry does not create a duplicate notification).


The native HubSpot + Slack integration is a good starting point, but as the team and pipeline grow it becomes a source of noise. A custom webhook + Slack API setup addresses this at the architecture level: the right signal, to the right person, at the right time. If this describes your situation - describe your notification logic, and Exceltic.dev will work through the routing conditions with you.

More articles

All →