Examples
Five practical business examples covering Block Kit messages, private channel creation, file uploads, emoji reactions, and user group setup.
Example 1: Send a Formatted Block Kit Message to a Channel
Node: message / send
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-deploy-bot-token |
Channel | #deployments |
Text | Deployment SUCCESS: payment-service v3.7.2 to production |
Username | DeployBot |
IconEmoji | :rocket: |
BlocksJson | See JSON below |
[
{
"type": "header",
"text": {
"type": "plain_text",
"text": ":white_check_mark: Deployment Succeeded — payment-service"
}
},
{
"type": "section",
"fields": [
{ "type": "mrkdwn", "text": "*Service:*\npayment-service" },
{ "type": "mrkdwn", "text": "*Version:*\nv3.7.2" },
{ "type": "mrkdwn", "text": "*Environment:*\nproduction" },
{ "type": "mrkdwn", "text": "*Duration:*\n4m 12s" },
{ "type": "mrkdwn", "text": "*Deployed by:*\nGitHub Actions" },
{ "type": "mrkdwn", "text": "*Commit:*\n`a3f9d22` Fix checkout timeout on high load" }
]
},
{
"type": "divider"
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": { "type": "plain_text", "text": "View Build Logs" },
"url": "https://github.com/acmecorp/payment-service/actions/runs/12345678",
"style": "primary"
},
{
"type": "button",
"text": { "type": "plain_text", "text": "Rollback" },
"url": "https://deploy.acmecorp.internal/rollback/payment-service",
"style": "danger"
}
]
}
]
Expected outcome: The
#deployments channel receives a formatted card showing service, version, environment, and commit details. Engineers see a green header with action buttons — one to view logs, one to trigger a rollback. Output: messageSent: true, messageTs: "1748100000.000100", channel: "C018DEPLOYS".
Example 2: Create a Private Channel and Invite Users
Step 1 — Node: channel / create
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-pm-bot-token |
Name | project-atlas-2026 |
IsPrivate | true |
TeamId | T012ACME01 |
Success output: id: "C07ATLAS01", name: "project-atlas-2026", isPrivate: true.
Step 2 — Node: channel / setTopic
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-pm-bot-token |
ChannelId | C07ATLAS01 (from Step 1 output) |
Topic | Project Atlas | Start: 2026-06-01 | PM: Sarah Chen | Target: Q3 delivery |
Step 3 — Node: channel / invite
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-pm-bot-token |
ChannelId | C07ATLAS01 |
UserIds | U023SARAH1,U034LIANG2,U045JAMES3 |
Step 4 — Node: message / send
Post a welcome message to the newly created channel:
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-pm-bot-token |
Channel | C07ATLAS01 |
Text | Welcome to #project-atlas-2026! This is your dedicated project channel. |
BlocksJson | See JSON below |
[
{
"type": "header",
"text": { "type": "plain_text", "text": ":tada: Welcome to Project Atlas 2026" }
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "This private channel is the home for all *Project Atlas* communication. The project kicks off on *June 1, 2026* with a target Q3 delivery.\n\n*Team:*\n- PM: <@U023SARAH1> (Sarah Chen)\n- Lead Engineer: <@U034LIANG2> (Liang Wu)\n- Client Success: <@U045JAMES3> (James Okafor)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":link: ** | **"
}
}
]
Expected outcome: A private channel
#project-atlas-2026 is created with the correct topic, all three team members are invited, and a formatted welcome message is waiting for them when they arrive. No admin manual steps required.
Example 3: Upload a File with Content to Multiple Channels
Node: file / upload
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-analytics-bot |
Channels | C018SALES1,C027MGMT01 |
Filename | weekly-sales-summary-2026-05-19.csv |
Filetype | csv |
FileContent | See content string below |
The FileContent value is assembled by an upstream Code node and passed as a variable. Example content:
Week Ending,Total Revenue,New Customers,Avg Deal Size,Pipeline Added,MRR
2026-05-19,"$842,500",34,"$24,779","$1,240,000","$112,400"
2026-05-12,"$798,200",29,"$27,524","$985,000","$108,900"
2026-05-05,"$901,000",41,"$21,976","$1,410,000","$119,200"
Follow-up Node: message / send
After uploading, post a summary message in #sales with the permalink to the file:
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-analytics-bot |
Channel | C018SALES1 |
Text | Weekly sales CSV is ready. Revenue this week: $842,500 across 34 new customers. |
BlocksJson | Inline summary with permalink from file/upload output |
[
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":bar_chart: *Weekly Sales Summary — Week Ending 19 May 2026*\n\n*Total Revenue:* $842,500 | *New Customers:* 34 | *MRR:* $112,400\n\n:paperclip: *<https://acmecorp.slack.com/files/.../weekly-sales-summary-2026-05-19.csv|Download CSV>*"
}
}
]
Expected outcome: The CSV file appears in both
#sales and #management channels with a formatted summary card. Output: fileId: "F08SALES01", fileName: "weekly-sales-summary-2026-05-19.csv", permalink: "https://acmecorp.slack.com/files/...".
Example 4: Add an Emoji Reaction to a Message
Step 1 — Node: reaction / add (mark as resolved)
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-support-bot |
Channel | C019SUPPRT |
Timestamp | 1748050000.000400 (the original support request message ts) |
Emoji | white_check_mark |
Step 2 — Node: reaction / add (indicate SLA met)
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-support-bot |
Channel | C019SUPPRT |
Timestamp | 1748050000.000400 |
Emoji | zap |
The :zap: reaction is the team's visual signal that the ticket was resolved within SLA.
Step 3 — Node: message / send (post resolution note in thread)
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-support-bot |
Channel | C019SUPPRT |
ThreadTs | 1748050000.000400 |
Text | Ticket #TKT-8821 resolved. Root cause: expired SSL cert on api-gateway. Fix applied at 14:32 UTC. Customer notified via email. |
Expected outcome: The original support message in
#support-queue shows :white_check_mark: and :zap: reactions, and the resolution note is posted as a thread reply. The support team can scan the channel and instantly see which tickets are closed (checkmark) and which were resolved within SLA (zap) without opening any threads.
Example 5: Create a User Group for a Department and Assign Members
Step 1 — Node: userGroup / create
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-hr-bot |
Name | Finance Team |
Handle | finance-team |
Description | Acme Corp Finance Department — AP, AR, FP&A, and Treasury |
Success output: usergroupId: "S05FINGRP1", name: "Finance Team", handle: "finance-team".
Step 2 — Node: userGroup / addUsers
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-hr-bot |
UsergroupId | S05FINGRP1 (from Step 1 output) |
UserIds | U056PRIYA1,U067OMAR02,U078LINDA3,U089KEVIN4,U090NIAMH5 |
This adds all five Finance team members in a single operation.
Step 3 — Node: message / send (notify the team)
| Property | Value |
|---|---|
BotToken | xoxb-4212350000-4212350001-acmecorp-hr-bot |
Channel | #finance |
Text | The @finance-team user group has been created. You can now mention the whole team with @finance-team. |
BlocksJson | See JSON below |
[
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":busts_in_silhouette: The *@finance-team* user group is now active with 5 members.\n\nAnyone in the workspace can now mention the entire Finance team by typing `@finance-team`. This group will be kept in sync automatically as team membership changes in HR."
}
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "Members: <@U056PRIYA1>, <@U067OMAR02>, <@U078LINDA3>, <@U089KEVIN4>, <@U090NIAMH5>"
}
]
}
]
Expected outcome: The Slack workspace has a new
@finance-team user group with all 5 members. The #finance channel receives a notification. Future workflow runs triggered by HR onboarding will call userGroup / addUsers with the new employee's Slack ID to keep the group current automatically.
Maintaining the group over time: Use
userGroup / getMany with IncludeUsers: true at the start of your HR onboarding workflow to look up the group ID by handle, then call userGroup / addUsers with the new employee's user ID. Use userGroup / getUsers to audit membership on a schedule. Use userGroup / disable if a department is dissolved rather than deleting it, so message history remains searchable.