HubSpot + Slack: what the native integration cannot do

HubSpot has an official Slack app. It works: notifications about new deals and stage changes appear in a channel. Problems start when the team wants more — notifications routed to different channels based on deal amount, a manager being able to create a HubSpot task directly from a Slack message, notifications silenced outside business hours. None of this is supported by the native integration — and this is exactly where teams discover its limits.

What the native HubSpot + Slack integration can do

The HubSpot app for Slack (installed from the HubSpot App Marketplace) provides:

  • Event notifications: contact creation, deal creation, Deal Stage changes
  • HubSpot Cards in Slack: viewing a contact or deal card with the /hubspot [name] command directly in Slack
  • Task creation from Slack: /hubspot task create — a basic task without association to a specific object
  • Notifications from Workflows: a HubSpot Workflow can send a Slack notification as an action

For basic use this is sufficient. Limitations appear when scaling or when requirements are non-standard.

Limitation 1: no conditional routing

The native integration sends notifications to one pre-configured channel (or multiple, but with fixed logic). It is not possible to define a rule: “if Deal Amount > $20,000 — send to #enterprise, if < $5,000 — to #smb, if the prospect is from Healthcare — to #industry-healthcare.”

HubSpot Workflows can configure different notifications for different conditions — but that requires a separate Workflow for each routing condition, which quickly becomes unmanageable.

With a custom integration:

def route_deal_notification(deal: dict) -> str:
    amount = deal.get('amount', 0)
    industry = deal.get('industry', '')

    if amount > 20000:
        return SLACK_CHANNEL_ENTERPRISE
    elif 'healthcare' in industry.lower():
        return SLACK_CHANNEL_HEALTHCARE
    elif amount < 5000:
        return SLACK_CHANNEL_SMB
    else:
        return SLACK_CHANNEL_DEFAULT

Limitation 2: no DM to the responsible manager

When a hot lead stalls at a stage with no activity — you need to notify a specific manager, not the entire channel. The native integration sends to a channel. Sending a DM to a specific Slack user on a HubSpot event is not natively available.

A custom integration resolves this by mapping HubSpot owner -> Slack user ID:

OWNER_TO_SLACK = {
    'hubspot_owner_id_1': 'U01ABC123',  # Slack User ID
    'hubspot_owner_id_2': 'U02DEF456',
}

def send_deal_alert(deal: dict):
    owner_id = deal['hubspot_owner_id']
    slack_user = OWNER_TO_SLACK.get(owner_id)
    if slack_user:
        slack_client.chat_postMessage(
            channel=slack_user,  # DM when passing user ID as channel
            text=f'Deal {deal["dealname"]} inactive for 7 days'
        )

Limitation 3: one-way flow

The native integration is HubSpot -> Slack only. Creating a task in HubSpot from Slack with /hubspot task create is possible, but it is not associated with a specific deal or contact.

Practical scenario: a manager sees a new lead notification in Slack and wants to assign the next step right there — create a Task in HubSpot linked to that deal with a deadline. Natively this requires switching to HubSpot.

A custom Slack App with a Shortcut or Block Kit Actions allows pressing a button in the message -> creating a Task in HubSpot via API:

@app.action('create_hubspot_task')
def handle_create_task(ack, body, client):
    ack()
    deal_id = body['actions'][0]['value']
    hubspot.crm.objects.tasks.basic_api.create({
        'properties': {
            'hs_task_subject': 'Follow up with customer',
            'hs_task_status': 'NOT_STARTED',
            'hs_timestamp': datetime.now().isoformat()
        },
        'associations': [{
            'to': {'id': deal_id},
            'types': [{'associationCategory': 'HUBSPOT_DEFINED',
                       'associationTypeId': 216}]
        }]
    })

Limitation 4: fixed notification format

The native integration sends standard text: “New deal created: [Deal Name].” There is no control over the format — it is not possible to add a link to the deal, amount, owner, priority, or an “Open in HubSpot” button directly in the message.

Slack Block Kit solves this for a custom integration: a structured message with sections, fields, and buttons.

Limitation 5: no business hours

Notifications arrive at any time. For global teams (managers in different time zones) this creates noise at night. The native integration does not support notification scheduling.

Custom integration:

def should_send_now(timezone: str = 'Europe/Berlin') -> bool:
    local_time = datetime.now(pytz.timezone(timezone))
    return 8 <= local_time.hour < 20 and local_time.weekday() < 5  # Mon-Fri, 8:00-20:00

When the native integration is sufficient

The native HubSpot + Slack integration covers the use case when:
— One channel for all notifications
— No need for DMs to specific managers
— Team is in one time zone
— Plain text notifications without buttons are sufficient
— No need to create Tasks from Slack linked to CRM objects

Similar limitations of HubSpot native integrations are covered in the articles on HubSpot + Intercom and HubSpot + Calendly — the pattern is the same: native works for the basic case, custom works for real team requirements.

Real-world case

SaaS company (12 managers, 4 countries, HubSpot Enterprise):

  • Enabled native integration -> within 2 weeks managers disabled notifications: 200+ notifications per day in one channel, 80% irrelevant.
  • Custom integration: routing by amount (3 channels), DM to manager when a deal stalls, notifications only during business hours per manager’s time zone.
  • Result: 15–20 notifications per day per channel, 90%+ open rate (managers stopped disabling them).

Frequently asked questions

Can conditional routing be configured through HubSpot Workflows?

Partially. A HubSpot Workflow can send a Slack notification as an action with conditions. But this requires a separate Workflow for each routing scenario. With 5+ conditions — inconvenient and hard to maintain. A custom integration moves routing logic into code.

HubSpot recently updated the Slack integration — did the limitations change?

HubSpot periodically updates the Slack App. As of May 2026 the main limitations remain: no DM by owner, no conditional routing by custom properties, no two-way actions linked to CRM objects.

How much does a custom integration cost?

A typical project: 2–3 weeks of development. Includes: conditional routing, DM notifications, business hours, Block Kit formatting. Optional: buttons to create Tasks from Slack.

Is a Slack Bot Token required for a custom integration?

Yes. For chat.postMessage and DMs a Bot Token is required. Created via api.slack.com/apps -> create Slack App -> OAuth Scopes: chat:write, im:write. For Incoming Webhooks (channel only, no DM) — no Bot Token needed, only the webhook URL.

Summary

  • Native HubSpot + Slack integration: notifications to one channel, basic commands, no DMs and no conditional logic
  • Key limitations: no channel routing, no DM to manager, no two-way actions linked to CRM objects, no business hours
  • Custom integration: HubSpot Webhook -> backend with conditional logic -> Slack API
  • Typical result after custom build: notification volume drops by 10x, open rate increases

If you use HubSpot and Slack and the native integration creates noise or does not cover your needed scenarios — describe your notification logic. Exceltic.dev will review the routing conditions and propose an architecture.

More articles

All →