Slack formatting is one of the most misunderstood topics in workplace communication tools. Most people assume Slack uses markdown. It does not. Slack uses its own format called mrkdwn (yes, without the "a"), and the differences between mrkdwn and standard markdown are the source of nearly every formatting frustration you have experienced when pasting content from AI tools, note-taking apps, or documentation systems.
This Slack formatting masterclass covers everything: the mrkdwn syntax, what it supports, what it does not support, the Block Kit API for richer messages, the relatively new Table Block, and practical strategies for getting properly formatted content into Slack.
Slack mrkdwn syntax: the complete reference
Slack's mrkdwn format supports a limited subset of text formatting. Here is every formatting option available in Slack messages.
Bold: Use single asterisks. *bold text* renders as bold text. This is the most common source of confusion because standard markdown uses single asterisks for italic and double asterisks for bold. In Slack, **text** does not render as bold. It shows the literal asterisks.
Italic: Use underscores. _italic text_ renders as italic text. This matches one of markdown's italic syntaxes, but Slack does not support *text* for italic (that is bold in Slack).
Strikethrough: Use tildes. ~strikethrough~ renders as strikethrough text. Standard markdown uses double tildes (~~text~~), but Slack only needs one on each side.
Inline code: Use backticks. `code` renders as code. This matches standard markdown.
Code blocks: Use triple backticks. This also matches standard markdown. However, Slack does not support language-specific syntax highlighting. ```python is treated the same as ```.
Blockquotes: Use > at the start of a line. > quoted text renders as a blockquote. This matches standard markdown. Multi-line blockquotes require > on each line.
Links: Use angle brackets with a pipe. <https://example.com|click here> renders as a clickable link with "click here" as the display text. This is completely different from markdown's [click here](https://example.com) syntax. Pasting a markdown link into Slack shows the raw brackets and parentheses.
Ordered lists: Use 1. followed by a space. 1. First item starts a numbered list. This matches standard markdown.
Unordered lists: Use - or * followed by a space. Both work. However, * can conflict with bold formatting if Slack interprets the asterisk as a bold marker instead of a list marker. Context determines which interpretation Slack chooses.
Line breaks: Press Shift+Enter for a line break within a message. Enter sends the message (unless you have changed this in Slack preferences).
What Slack mrkdwn does not support
The list of unsupported formatting is longer than what is supported, and it includes many features that AI tools use regularly in their output.
Headings. There is no heading syntax in Slack mrkdwn. # Heading displays as literal text with the hash mark visible. ## Subheading shows both hash marks. This is one of the biggest gaps for AI output, which relies heavily on headings for document structure.
Tables (in messages). Standard markdown table syntax (pipes and dashes) renders as plain text in Slack messages. The pipe characters, alignment colons, and separator rows all appear literally. For data-heavy AI output, this makes the content nearly unreadable.
Inline images. Markdown's  image syntax does not work. Slack handles images through file uploads, unfurled URLs, and Block Kit, not through inline syntax.
HTML. No HTML tags are rendered. <b>bold</b> shows the literal angle brackets and tag text.
Nested formatting. Combining bold and italic (*_text_* or _*text*_) produces inconsistent results. Sometimes it works, sometimes one format overrides the other.
Task lists. Markdown's - [ ] unchecked and - [x] checked syntax renders as literal text. Slack has no native task list in messages (though Slack Lists and Canvases have separate task features).
Footnotes. [^1] and footnote definitions are not supported.
Horizontal rules. --- or *** renders as literal text, not as a visual separator.
Text color. There is no way to color text in Slack mrkdwn.
Superscript and subscript. Not supported.
This means that a typical AI response, which commonly includes headings, tables, task lists, and nested formatting, loses a significant portion of its structure when pasted directly into Slack. The formatting breaks you see when pasting from ChatGPT are not bugs. They are the expected result of a format mismatch.
The bold/italic conflict explained
The single most confusing aspect of Slack formatting is the asterisk conflict. Let's trace through a specific example.
In standard markdown (used by ChatGPT, Claude, Gemini):
*text*= italic**text**= bold***text***= bold italic
In Slack mrkdwn:
*text*= bold**text**= literal asterisks (not bold, not anything)_text_= italic
When you paste **important deadline** from an AI tool into Slack, you see **important deadline** with the asterisks visible. Slack does not recognize double asterisks as any formatting command. The intended bold emphasis is completely lost, replaced by visible syntax characters.
Conversely, if you type *note* in Slack intending italic (as in markdown), you get bold instead. The same character means different things in the two systems.
This single conflict accounts for a large percentage of the formatting complaints people have about Slack. It is not a bug in Slack or in markdown. It is two different formatting languages using the same characters with different meanings.
Slack Block Kit: structured rich messages
For formatting beyond what mrkdwn supports, Slack provides Block Kit, a JSON-based system for building structured messages. Block Kit is primarily used by Slack apps, bots, and integrations through the API. Regular users do not type Block Kit JSON into message fields.
Block Kit supports several block types:
Section blocks contain text (mrkdwn or plain text) and optional accessories like buttons, images, or overflow menus.
Header blocks provide large, bold text that functions like a heading. This is the closest Slack gets to heading formatting, but it is only available through the API, not through typing in the message field.
Divider blocks are horizontal rules. Again, API-only.
Image blocks display images with alt text and optional titles.
Context blocks show small, secondary text alongside images. Useful for metadata, timestamps, or attribution.
Actions blocks contain interactive elements: buttons, select menus, date pickers, overflow menus.
Input blocks (in modals only) provide form fields: text inputs, select menus, date pickers, checkboxes.
Rich text blocks are the native representation of formatted messages. When you type a message in Slack with bold and lists, Slack internally represents it as a rich text block. The API can read and construct these blocks directly.
Block Kit is powerful but inaccessible to regular users composing messages. You cannot type JSON into the message field. This means the richer formatting options (headers, dividers, structured layouts) are only available through Slack apps and bots, not through manual message composition.
Slack Table Block: what it is and what it is not
Slack introduced the Table Block in August 2025. This was a significant addition because tables were one of the most-requested formatting features. However, the Table Block comes with important limitations.
API only. The Table Block is available through the Slack API (Block Kit). You cannot create a table by typing syntax into a message field. There is no mrkdwn table syntax.
Size limits. Maximum 100 rows and 20 columns per table. For most use cases this is sufficient, but large data exports from AI tools may exceed these limits.
Plain text cells. Table cells contain plain text, not mrkdwn. You cannot have bold, italic, links, or code formatting inside table cells. This limits the expressiveness of tables compared to markdown tables or HTML tables.
No merged cells. Every cell occupies exactly one row and one column. No spanning.
Bot/app messages only. End users cannot insert tables into their own messages. Tables appear in messages sent by Slack apps.
For teams that build custom Slack integrations, the Table Block is useful. For individual users pasting AI output into channels, it does not solve the table formatting problem. You still cannot paste a markdown table and have it render as a formatted grid.
Slack Canvases and markdown
Slack Canvases are a document-like feature within Slack that supports richer formatting than messages. Canvases support:
- Headings (H1, H2, H3)
- Bullet and numbered lists
- Task lists (checkboxes)
- Code blocks
- Tables (native table editor)
- Dividers
- Images and file embeds
- Bookmarks (URL previews)
Canvases are closer to a document editor than a message format. If your goal is to share structured AI output with your team, a Canvas is a better container than a message. You can paste formatted content into a Canvas and get better results than pasting into a message field.
However, Canvases have their own limitations. They do not support the full range of markdown formatting. Complex nested structures, multi-level lists, and advanced table formatting may not survive the paste. And Canvases are a separate feature from channels, so sharing content in a Canvas requires a different workflow than posting to a channel.
Practical Slack formatting strategies for AI output
Given the limitations of mrkdwn, here are the most effective approaches for getting AI-generated content into Slack.
For short messages: manual conversion
If you are posting a brief AI response (a few paragraphs, a simple list), manually convert the formatting:
- Change
**bold**to*bold* - Change
*italic*to_italic_ - Remove heading markers (
##) - Replace
[text](url)links with<url|text> - Remove table syntax (summarize the data in text instead)
This is tedious but works for occasional short messages.
For structured content: use a conversion tool
Tools like Unmarkdown™ can convert markdown to Slack-compatible formatting automatically. The conversion handles the mrkdwn syntax differences, strips unsupported elements, and produces text that renders correctly when pasted into Slack.
This is the fastest approach for regular use, especially when dealing with AI output that contains tables, headings, or mixed formatting.
For long documents: use Canvases or threads
If the AI output is long and structured (a report, a project plan, a technical document), consider:
- Slack Canvas: Create a Canvas and paste the content there. Canvases handle headings and tables better than messages.
- Thread with sections: Break the content into sections and post each as a threaded reply. This gives readers a scannable overview in the main message with details in the thread.
- External link: Publish the document on a platform that renders markdown properly and share the link in Slack. Slack will unfurl a preview.
For automated workflows: use Block Kit
If you are building a Slack bot or integration that posts AI-generated content, use Block Kit to structure the output. You can use header blocks for section titles, section blocks for text, divider blocks for visual separation, and the Table Block for tabular data. This produces the richest formatting available in Slack.
Formatting Slack messages like a professional
Beyond handling AI output, there are formatting habits that make your Slack messages more readable regardless of the source.
Use bold for key information. Deadlines, action items, and decisions should be *bold* so readers can scan quickly.
Use code blocks for technical content. Anything that should be read literally (commands, file paths, error messages, configuration values) belongs in backticks or triple-backtick blocks.
Use blockquotes for attribution. When referencing someone else's message or an external source, prefix with >.
Break long messages into paragraphs. Use Shift+Enter to create visual breaks. A wall of text in Slack is harder to read than in a document because the message width is narrower.
Use threads for extended discussions. Keep the main channel readable by moving detailed conversations into threads. Post the summary or decision in the channel, details in the thread.
Use emoji reactions instead of reply messages. For acknowledgments, agreements, and simple responses, a reaction is faster and less noisy than a reply.
Slack formatting limitations in context
Slack's formatting limitations are a deliberate design choice, not an oversight. Slack was built for fast, informal communication. The mrkdwn format is intentionally simple: a few text decorations, links, and lists. Complex formatting was left to Canvases, files, and external tools.
This design works well for conversational messages. It does not work well for structured content, and the rise of AI tools has made this gap more visible. When ChatGPT generates a detailed report with headings, tables, code blocks, and nested lists, and you need to share it with your team in Slack, you are pushing structured content through a channel designed for unstructured conversation.
Understanding the difference between markdown and mrkdwn is the first step. Choosing the right container (message vs. Canvas vs. external document) is the second. And for the content that does go into messages, knowing exactly which formatting survives and which breaks lets you adjust your approach before hitting send.
The formatting problem is not unique to Slack. Every destination application has its own formatting model, and none of them natively speak markdown. But Slack's case is particularly tricky because its format looks enough like markdown to create false confidence. The asterisks are there. The backticks are there. The results are just different.
