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.