Slack Post
Send messages to Slack channels
The Slack Post node sends messages to Slack channels. Use it for notifications, alerts, summaries, and any communication that should reach your team in Slack.
Overview
| Property | Value |
|---|---|
| Category | Action |
| Node IDs | ds.slackPost.perItem.in1.success1.error1 (per-item)ds.slackPost.batch.in1.success1.error1 (batch) |
| Input Ports | 1 |
| Success Outputs | 1 |
| Error Outputs | 1 |
| Execution Mode | Per-item or Batch |
| Timeout | 30 seconds |
| Retry Strategy | Exponential, 3 attempts |
| Side-Effecting | Yes |
Prerequisites
- Slack integration connected (Setup Guide)
- Agents bot invited to target channel(s)
Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
channel | CEL Expression | Yes | Channel ID or name |
text | Liquid Template | Yes | Message content |
Channel Parameter
Specify the channel using:
Channel ID (recommended):
"C0123456789"
Channel name:
"#sales-updates"
Dynamic from data:
json.slackChannel
How to find Channel ID:
- Right-click channel name in Slack
- Select "View channel details"
- Scroll to bottom, copy the Channel ID
Text Parameter
Message content using Liquid templates:
š *Meeting Summary*
*{{ json.meeting.title }}*
{{ json.summary }}
_Posted by Agents_
Input Schema
Accepts any data from upstream. Access it via json in templates.
Output Schema
Success Output
{
"success": true,
"messageId": "1234567890.123456",
"channel": "C0123456789",
"timestamp": "2024-01-15T14:30:00Z"
}
| Field | Type | Description |
|---|---|---|
success | boolean | Always true on success output |
messageId | string | Slack's message identifier |
channel | string | Channel where message was posted |
timestamp | string | When the message was sent |
Error Output
{
"error": "channel_not_found",
"message": "Channel C0123456789 not found or bot not invited",
"channel": "C0123456789"
}
Examples
Basic Example: Simple Notification
Send a simple notification when a meeting ends.
Configuration:
Channel: "#sales-updates"
Text:
Meeting "{{ json.meeting.title }}" has ended.
Example: Formatted Summary
Send a well-formatted meeting summary.
Configuration:
Channel: "C0123456789" (using channel ID)
Text:
š *Meeting Recap: {{ json.meeting.title }}*
*Date:* {{ json.meeting.startTime | date: "%B %d, %Y at %I:%M %p" }}
*Attendees:*
{% for attendee in json.meeting.attendees %}
⢠{{ attendee.name }}
{% endfor %}
*Summary:*
{{ json.summary }}
{% if json.actionItems.size > 0 %}
*Action Items:*
{% for item in json.actionItems %}
⢠{{ item }}
{% endfor %}
{% endif %}
Example: Conditional Formatting
Different formatting based on sentiment.
Text:
{% if json.sentiment == "positive" %}
ā
*Positive Meeting: {{ json.meeting.title }}*
{% elsif json.sentiment == "negative" %}
ā ļø *Needs Attention: {{ json.meeting.title }}*
{% else %}
š *Meeting Update: {{ json.meeting.title }}*
{% endif %}
{{ json.summary }}
Example: Mention Users
Include Slack mentions in messages.
Text:
Hey <@U0123456789>, the meeting with {{ json.contact.name }} just ended.
Key takeaway: {{ json.keyTakeaway }}
Note: Use Slack user IDs for mentions, not names. Format: <@USERID>
Example: Link to Meeting
Include clickable links.
Text:
*{{ json.meeting.title }}*
{{ json.summary }}
<{{ json.meetingUrl }}|View Meeting Details>
Slack Formatting Reference
Slack uses a specific formatting syntax:
| Format | Syntax | Result |
|---|---|---|
| Bold | *text* | text |
| Italic | _text_ | text |
| Strikethrough | ~text~ | |
| Code | `code` | code |
| Code block | ```code``` | Code block |
| Link | <url|text> | text |
| User mention | <@USERID> | @username |
| Channel mention | <#CHANNELID> | #channel |
Emojis
Use standard emoji shortcodes:
:white_check_mark:ā ā:warning:ā ā ļø:memo:ā š:calendar:ā š
Best Practices
1. Use Channel IDs
Channel IDs are more reliable than names:
- Names can change
- IDs are permanent
- Avoids confusion with similar names
2. Keep Messages Scannable
š *{{ json.meeting.title }}*
*TL;DR:* {{ json.oneSentenceSummary }}
<{{ json.detailsUrl }}|See full details>
3. Include Context
Always include enough context for readers:
- What meeting/deal this relates to
- When it happened
- Why they're receiving this
4. Use Appropriate Channels
- High-volume alerts ā dedicated alert channel
- Deal updates ā deal-specific or team channel
- Urgent items ā consider DM or SMS instead
5. Don't Over-Notify
- Batch related updates when possible
- Use conditional logic to filter noise
- Respect team's attention
Common Issues
"Channel not found" error
Causes:
- Invalid channel ID
- Bot not invited to private channel
- Channel was deleted
Solutions:
- Verify channel ID is correct
- Invite bot:
/invite @Meetingflow Bot - Check channel still exists
Bot can post to some channels but not others
Cause: Bot not invited to private channels
Solution:
/invite @Meetingflow Bot
Message not appearing
Causes:
- Workflow succeeded but wrong channel
- Message in thread (not main channel)
- Slack API delay
Solutions:
- Check output for actual channel posted to
- Verify channel configuration
- Wait a moment and refresh Slack
Formatting looks wrong
Cause: Mixing markdown and Slack syntax
Solution: Use Slack's formatting syntax (*bold* not **bold**)
Related Nodes
- If - Conditionally send messages
- AI Prompt - Generate message content
- Email Send - Alternative communication
Technical Details
Rate Limits
Slack has API rate limits:
- ~1 message per second per channel
- Higher limits for paid workspaces
The retry mechanism handles temporary rate limits automatically.
Message Size Limits
- Maximum message length: ~40,000 characters
- Recommended: Keep under 4,000 characters for readability
Bot Permissions
The Slack bot requires these scopes:
chat:write- Post messageschat:write.public- Post to public channels without joining
For private channels, the bot must be explicitly invited.