Search documentation

Search for pages in the documentation

Slack Integration

Connect Agents to Slack for messaging and notifications

Connect Agents to Slack to post automated messages, send notifications, and share meeting insights with your team.

Overview

The Slack integration enables workflows to:

  • Post messages to public and private channels
  • Send direct messages to users
  • Share formatted content with rich formatting
  • Deliver notifications based on meeting events

Prerequisites

Before connecting Slack:

  1. Slack workspace where you have permission to install apps
  2. Channel access to channels you want to post to
  3. Admin approval (if your workspace requires app approval)

Connecting Slack

Step 1: Navigate to Integrations

  1. Go to Workspace Settings
  2. Select Integrations
  3. Find Slack in the list

Step 2: Authorize Connection

  1. Click Connect
  2. Review the requested permissions
  3. Select the workspace to install to
  4. Click Allow

Step 3: Invite Bot to Channels

After installation, the Agents bot needs to be invited to channels:

  1. Go to the Slack channel
  2. Type /invite @Meetingflow (or your bot's name)
  3. The bot can now post to that channel

Required Permissions

The Slack integration requests these OAuth scopes:

ScopePurpose
chat:writePost messages to channels
chat:write.publicPost to public channels without joining
users:readLook up users for DMs
users:read.emailFind users by email
channels:readList available channels
groups:readList private channels (if invited)

Available Actions

Slack Post

Post a message to a Slack channel or direct message.

Configuration:

ParameterTypeRequiredDescription
channelstringYesChannel ID or name (e.g., C0123456789 or #general)
textstringYesMessage content (supports Slack mrkdwn)

Options:

OptionTypeDefaultDescription
mrkdwnbooleantrueEnable Slack markdown formatting
unfurl_linksbooleanfalseShow link previews
unfurl_mediabooleanfalseShow media previews

Channel Configuration

Channel IDs vs Names

You can specify channels two ways:

Channel ID (recommended):

text
C0123456789
  • Most reliable
  • Works even if channel is renamed
  • Found in channel details → Copy Link

Channel Name:

text
#general
  • More readable
  • May break if channel is renamed
  • Include the # prefix

Finding Channel IDs

  1. Open Slack
  2. Right-click on the channel
  3. Select Copy Link
  4. The ID is the last part of the URL: https://workspace.slack.com/archives/C0123456789

Private Channels

For private channels:

  1. Invite the bot first: /invite @Meetingflow
  2. Use the channel ID (not name)
  3. Bot must be a member to post

Direct Messages

To send a DM, use the user's Slack ID as the channel:

text
U0123456789

Or the bot can look up users by email if configured.

Message Formatting

Slack mrkdwn

Slack uses its own markdown syntax called "mrkdwn":

FormatSyntaxResult
Bold*bold*bold
Italic_italic_italic
Strikethrough~strike~strike
Code`code`code
Code block code Code block
Quote> quoteQuoted text
Link<https://url|text>Clickable link
User mention<@U0123456789&gt;@username
Channel mention<#C0123456789&gt;#channel

Formatting Examples

Basic formatting:

liquid
*Meeting Summary* for {{ json.meeting.title }}

_Key Points:_
• {{ json.summary.point1 }}
• {{ json.summary.point2 }}

> "{{ json.keyQuote }}"

<{{ json.meeting.link }}|View full notes>

With sections:

liquid
:clipboard: *Post-Meeting Update*

*Meeting:* {{ json.meeting.title }}
*Date:* {{ json.meeting.startTime | date: "%B %d, %Y" }}
*Attendees:* {{ json.meeting.attendees | map: "name" | join: ", " }}

---

*Summary:*
{{ json.summary }}

*Action Items:*
{% for item in json.actionItems %}
• {{ item }}
{% endfor %}

Emoji

Use emoji shortcodes:

liquid
:white_check_mark: Task completed
:warning: Attention needed
:rocket: Launch update
:calendar: Meeting scheduled

Example Workflows

Post-Meeting Summary

text
[Event: MEETING_ENDED]
        │
        ▼
[Load Meeting]
        │
        ▼
[AI: Summarize meeting]
        │
        ▼
[Slack Post]

Message Template:

liquid
:memo: *Meeting Summary*

*{{ json.meeting.title }}*
{{ json.meeting.startTime | date: "%B %d at %I:%M %p" }}

{{ json.summary }}

{% if json.actionItems.size > 0 %}
*Action Items:*
{% for item in json.actionItems %}
• {{ item }}
{% endfor %}
{% endif %}

Deal Alert to Sales Channel

text
[Event: MEETING_ENDED]
        │
        ▼
[Load Meeting]
        │
        ▼
[AI: Analyze deal urgency]
        │
        ▼
[If: is urgent?]
        │
        ├── Yes ──▶ [Slack Post: #urgent-deals]
        │
        └── No ───▶ [Slack Post: #deal-updates]

Scheduled Pipeline Report

text
[Scheduled: Every Monday 9 AM]
        │
        ▼
[AI: Generate pipeline summary]
        │
        ▼
[Slack Post: #sales-team]

Message Template:

liquid
:chart_with_upwards_trend: *Weekly Pipeline Report*

Good morning team! Here's your pipeline update:

*Active Deals:* {{ json.activeDeals }}
*Total Value:* ${{ json.totalValue | round: 0 }}
*Meetings This Week:* {{ json.meetingsScheduled }}

*Top Opportunities:*
{% for deal in json.topDeals %}
• {{ deal.name }} - ${{ deal.amount }} ({{ deal.stage }})
{% endfor %}

Have a great week! :muscle:

Best Practices

1. Use Channel IDs

Channel IDs are more reliable than names:

  • C0123456789
  • ⚠️ #sales-team (may break if renamed)

2. Keep Messages Concise

Slack messages work best when they're scannable:

  • Use bullet points for lists
  • Bold important information
  • Keep summaries to 3-5 sentences
  • Use emoji sparingly for visual hierarchy

3. Include Context

Always include enough context for the message to be useful:

liquid
*{{ json.meeting.title }}*
{{ json.meeting.startTime | date: "%B %d" }} • {{ json.meeting.attendees.size }} attendees

{{ json.summary }}

4. Handle Missing Data

Check for data before including it:

liquid
{% if json.actionItems.size > 0 %}
*Action Items:*
{% for item in json.actionItems %}
• {{ item }}
{% endfor %}
{% else %}
_No action items identified_
{% endif %}

5. Test in a Test Channel

Before posting to production channels:

  1. Create a #workflow-testing channel
  2. Configure workflow to post there
  3. Verify formatting and content
  4. Update to production channel

Troubleshooting

Common Errors

ErrorCauseSolution
"channel_not_found"Invalid channel ID or bot not invitedVerify channel ID and invite bot
"not_in_channel"Bot not in private channelInvite bot with /invite
"invalid_auth"Token expiredReconnect Slack integration
"rate_limited"Too many messagesAdd delays between posts
"msg_too_long"Message > 40,000 charsShorten message or split

Bot Not Posting

If messages aren't appearing:

  1. Check bot membership - Is bot in the channel?
  2. Check channel ID - Is the ID correct?
  3. Check permissions - Does bot have chat:write?
  4. Check execution logs - Any error messages?

Formatting Issues

If formatting looks wrong:

  1. Verify you're using Slack mrkdwn (not regular markdown)
  2. Check for unescaped special characters
  3. Test in Slack's message composer first
  4. Ensure mrkdwn: true in configuration

Rate Limits

Slack has rate limits:

MethodLimit
chat.postMessage1 per second per channel
General50+ per minute

If you hit limits:

  • Add Wait nodes between posts
  • Batch messages where possible
  • Spread workflows across time

Advanced Features

Control how links appear:

yaml
unfurl_links: false  # Don't expand links into previews
unfurl_media: false  # Don't expand images/videos

Usually keep these false for cleaner messages.

Threading (Future)

Threading support may be added in future versions to reply to existing messages.

Block Kit (Future)

Support for Slack Block Kit rich formatting may be added for more complex layouts.

Security Considerations

Token Storage

  • OAuth tokens are encrypted at rest
  • Tokens are scoped to minimal required permissions
  • Tokens are refreshed as needed

Channel Access

The bot can only post to:

  • Public channels (without being invited)
  • Private channels where it's been invited
  • DMs to users in the workspace

Message Content

Be careful not to include:

  • Sensitive customer data
  • Internal-only information in public channels
  • PII without appropriate consent