Recognition
- "slack", "post to channel", "DM", "message the team", "announce"
- Quick internal communication
- Real-time or near-real-time context
Format Selection
| Use | When |
|---|---|
| Block Kit JSON | Announcements, structured updates, anything needing visual hierarchy, metrics, or actions |
| Plain mrkdwn | Quick replies, thread responses, simple one-liners |
Default to Block Kit for any substantive message. Output valid JSON that can be pasted into Slack's Block Kit Builder or sent via API.
Block Kit Structure
Every Block Kit message is a JSON object with a blocks array:
{
"blocks": [
{ "type": "header", ... },
{ "type": "section", ... },
{ "type": "divider" },
{ "type": "context", ... }
]
}Block Types
Header
Top-level title for the message.
{
"type": "header",
"text": {
"type": "plain_text",
"text": "🚀 Release v2.4.0 Shipped",
"emoji": true
}
}Section
Primary content block. Supports mrkdwn text and optional accessory (button, image, etc).
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*What's new:*\n• Faster search indexing\n• Dark mode support\n• Bug fixes for auth flow"
}
}With accessory button:
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Review the changes before merging."
},
"accessory": {
"type": "button",
"text": { "type": "plain_text", "text": "View PR", "emoji": true },
"url": "https://github.com/org/repo/pull/123"
}
}Divider
Visual separator between sections.
{ "type": "divider" }Context
Small metadata line (timestamps, authors, tags).
{
"type": "context",
"elements": [
{ "type": "mrkdwn", "text": "Posted by <@U123ABC> • Dec 5, 2024" }
]
}Actions
Row of interactive buttons.
{
"type": "actions",
"elements": [
{
"type": "button",
"text": { "type": "plain_text", "text": "Approve", "emoji": true },
"style": "primary",
"action_id": "approve_action"
},
{
"type": "button",
"text": { "type": "plain_text", "text": "Reject", "emoji": true },
"style": "danger",
"action_id": "reject_action"
}
]
}Image
Standalone image block.
{
"type": "image",
"image_url": "https://example.com/chart.png",
"alt_text": "Weekly metrics chart"
}Limits
Slack truncates or rejects content that exceeds these limits:
| Element | Limit | Behavior |
|---|---|---|
| Section text | ~3,000 chars | Truncated with "See more" link |
| Header text | 150 chars | Hard limit |
| Context elements | 2,000 chars combined | Hard limit |
| Fields per section | 10 items | Hard limit |
| Blocks per message | 50 | Hard limit |
Breaking Up Long Content
When content exceeds ~3,000 characters, Slack shows a "See more" link that hides the rest. Avoid this by splitting content across multiple blocks.
Strategies:
- Split at natural breakpoints — paragraphs, topics, or logical sections
- Use dividers — separate major sections visually
- Prefer multiple short sections — three 1,000-char sections render better than one 3,000-char section
- Use headers for structure — break long updates into titled subsections
- Consider file upload — for content over ~5,000 chars total, upload as a text snippet instead
Example: Long update split into sections
Instead of one massive section:
{ "type": "section", "text": { "type": "mrkdwn", "text": "[3000+ chars all here]" }}Split by topic:
{ "type": "section", "text": { "type": "mrkdwn", "text": "*What shipped:*\n• Feature A\n• Feature B" }},
{ "type": "divider" },
{ "type": "section", "text": { "type": "mrkdwn", "text": "*What's next:*\n• Feature C\n• Feature D" }},
{ "type": "divider" },
{ "type": "section", "text": { "type": "mrkdwn", "text": "*Blockers:*\n• Issue X pending review" }}Templates
Announcement
{
"blocks": [
{
"type": "header",
"text": { "type": "plain_text", "text": "📢 [Title]", "emoji": true }
},
{
"type": "section",
"text": { "type": "mrkdwn", "text": "[Main announcement body with *bold* for emphasis]" }
},
{ "type": "divider" },
{
"type": "context",
"elements": [
{ "type": "mrkdwn", "text": "Questions? Reply in thread 👇" }
]
}
]
}Status Update with Metrics
{
"blocks": [
{
"type": "header",
"text": { "type": "plain_text", "text": "📊 Weekly Metrics", "emoji": true }
},
{
"type": "section",
"fields": [
{ "type": "mrkdwn", "text": "*Active Users*\n12,450 (+8%)" },
{ "type": "mrkdwn", "text": "*Revenue*\n$84.2K (+12%)" },
{ "type": "mrkdwn", "text": "*Churn*\n2.1% (-0.3%)" },
{ "type": "mrkdwn", "text": "*NPS*\n72 (+5)" }
]
},
{ "type": "divider" },
{
"type": "section",
"text": { "type": "mrkdwn", "text": "*Highlights:* Strong week driven by product launch. Retention up across all cohorts." }
},
{
"type": "context",
"elements": [
{ "type": "mrkdwn", "text": "Week of Dec 2–8, 2024 • <https://dashboard.example.com|Full Dashboard>" }
]
}
]
}Action Prompt
{
"blocks": [
{
"type": "section",
"text": { "type": "mrkdwn", "text": "🙋 *Need approval:* Budget request for Q1 marketing spend ($25K)" }
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": { "type": "plain_text", "text": "✅ Approve", "emoji": true },
"style": "primary",
"action_id": "approve"
},
{
"type": "button",
"text": { "type": "plain_text", "text": "❌ Reject", "emoji": true },
"style": "danger",
"action_id": "reject"
},
{
"type": "button",
"text": { "type": "plain_text", "text": "View Details", "emoji": true },
"url": "https://docs.example.com/budget-q1"
}
]
}
]
}Team Update
{
"blocks": [
{
"type": "header",
"text": { "type": "plain_text", "text": "🏃 Sprint 14 Wrap-up", "emoji": true }
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Completed:*\n• User onboarding redesign\n• API rate limiting\n• Mobile push notifications\n\n*Carried over:*\n• Dashboard export feature (blocked on design)"
}
},
{ "type": "divider" },
{
"type": "section",
"text": { "type": "mrkdwn", "text": "*Next sprint focus:* Performance optimization and Q1 planning" }
},
{
"type": "context",
"elements": [
{ "type": "mrkdwn", "text": "Sprint 14 • Nov 25 – Dec 6 • Team: Platform" }
]
}
]
}mrkdwn Reference
For text within blocks, use Slack's mrkdwn syntax:
| Element | Syntax |
|---|---|
| Bold | *bold* |
| Italic | _italic_ |
| Strike | ~strikethrough~ |
| Code | `inline code` |
| Code block | ```code block``` |
| Link | <https://url.com|display text> |
| User mention | <@U123ABC> |
| Channel | <#C123ABC> |
| Bullet list | • item (or - item) |
Pitfalls
- Section text over ~3,000 characters gets truncated with "See more"—split into multiple sections
- Don't mix Block Kit with plain text in the same message—use one or the other
headeronly acceptsplain_text, not mrkdwnfieldsin section blocks max out at 10 items, 2 columns- Button
styleonly accepts"primary"(green) or"danger"(red)—omit for default gray - Test in Block Kit Builder before sending