Slack Markdown Guide: mrkdwn Syntax, Formatting, and Pasting from Markdown (2026)
Slack doesn't render standard markdown—it uses mrkdwn. Single asterisks for bold, no headers, no list syntax. Here's the full cheat sheet and how to paste formatted text into Slack.
Slack looks like it should understand markdown—the message box even hints at it with a formatting toolbar—but type **bold** and Slack shows you the literal asterisks, not bold text. Slack has its own formatting language called mrkdwn, and it diverges from standard markdown in ways that trip up anyone coming from GitHub, Discord, or a README file. This is the full mrkdwn reference: what's different, the complete syntax, how to get formatted text into a Slack message, and where the formatting simply doesn't exist.
How Slack formatting differs from standard markdown
The differences are small in character count and large in practice. Here's markdown next to its mrkdwn equivalent:
- Bold — markdown:
**bold**(double asterisk). mrkdwn:*bold*(single asterisk). - Italic — markdown:
*italic*or_italic_. mrkdwn:_italic_only. - Strikethrough — markdown:
~~strike~~(double tilde). mrkdwn:~strike~(single tilde). - Headers — markdown:
#,##,###. mrkdwn: no header syntax at all. - Lists — markdown:
-or1.at the start of a line. mrkdwn: no native list markers; lists are written as plain "• " lines. - Links — markdown:
[text](url). mrkdwn:<url|text>, brackets and parens swapped for angle brackets and a pipe. - Underline — markdown has no standard syntax; mrkdwn has none either.
The bold difference is the one that bites most often, because a double asterisk isn't an error in Slack—it's just wrong output. **launch day** doesn't fail; it posts as **launch day**, visible asterisks and all, and nothing in Slack's interface tells you why.
The mrkdwn cheat sheet
- Bold:
*text*— single asterisk each side. - Italic:
_text_— single underscore each side. - Strikethrough:
~text~— single tilde each side. - Inline code: `
text` — single backtick each side, same as standard markdown. - Code block: triple backticks on their own lines, above and below, preserving whitespace—no language tag or syntax highlighting.
- Block quote:
>at the very start of a line quotes that line. - Link:
<https://example.com|link text>— angle brackets around the URL, a pipe, then the display text.<https://example.com>alone shows the bare URL. - Mentions:
<@U0123ABC>for a user,<!here>,<!channel>, or<!everyone>for a group ping. - Emoji:
:tada:-style shortcodes, same as the message box's emoji picker.
# Deploy finished
**Status:** all green. *Rollback* is ~~needed~~ not needed.
- API: `v2.4.1`
- Web: `v2.4.0`
> Ping #eng-oncall if anything looks off.Styles can combine—*_bold italic_*—but nesting more than two is where Slack's parser starts to disagree with itself, so keep combinations simple.
Lists and quotes without native syntax
mrkdwn has no bullet or numbered list markup. The convention is to write each item as its own line starting with a bullet character—"• First item", "• Second item"—and let the line breaks do the structural work. Numbered lists are written the same way, just with "1. ", "2. " typed literally, since mrkdwn won't auto-number them. Block quotes are the one structural element mrkdwn does support: a > at the start of a line quotes that single line, the same convention as standard markdown, though Slack has no multi-line >>> quote the way Discord does.
Code blocks: no syntax highlighting
Inline code and fenced code blocks both work in mrkdwn and render in monospace. The gap from GitHub-flavored markdown is that mrkdwn code blocks don't accept a language tag—```js will show the literal characters "js" on the first line rather than triggering JavaScript syntax highlighting, because Slack has no highlighter to trigger. For sharing real code with syntax highlighting, Slack's "Create a snippet" attachment is the better tool than a message-body code block; mrkdwn code blocks are best kept to short commands, config values, or log lines.
Links and escaping for the API
A link in mrkdwn is <https://example.com|link text>—note the pipe separating the URL from the display text, not the parenthesis-bracket pairing standard markdown uses. If you're building mrkdwn strings programmatically for the Slack API, three characters need HTML-style escaping wherever they appear in the text, not just inside links: & becomes &, < becomes <, and > becomes >. Skipping this is a common source of broken messages from webhooks and bots, since Slack's parser reads an un-escaped < as the start of a link or mention and the message renders wrong or drops content silently.
The markup mode preference, and its limits
Slack has a setting—Preferences → Advanced → "Format messages with markup"—that makes the message box interpret some formatting characters as you type, similar to typing markdown directly into a chat app. It's off by default. Turning it on does not give you full markdown: headers still don't exist, and there's still no native list syntax, so # and - at the start of a line stay literal text either way. The setting only changes whether inline styles like bold, italic, and strikethrough render live as you type versus needing the toolbar or a rich-text paste. It's also desktop- and web-only—Slack's mobile apps don't support markup mode at all, so a message that looks right on your laptop can show raw asterisks to a teammate on their phone.
The 40,000-character limit
A single Slack message tops out at 40,000 characters, far more headroom than Discord's 2,000 or X's 280. In practice almost nothing hits that ceiling—long-form content in Slack usually belongs in a canvas, a thread, or a linked doc rather than one giant message—but it matters for scripted or webhook-driven posts, like a build log or a digest, where the text is assembled without anyone eyeballing the length first.
How to convert markdown to Slack with Markdown2Social
Write your message in standard markdown—headers, bold, italics, lists, quotes, code, links—the way you'd write it anywhere else, and Markdown2Social produces two outputs instead of one. The regular Copy button gives you rich text: paste it directly into Slack's message box and the composer accepts it as a formatted paste, keeping bold, italics, strikethrough, inline code, lists, and quotes without you touching mrkdwn syntax at all. That covers the normal case of typing a message to a channel or a person.
The second output, behind a "Copy Slack mrkdwn" button, is for everything that isn't a human typing into the message box: the Slack API, a Block Kit mrkdwn text field, Workflow Builder steps, and incoming webhooks all expect mrkdwn syntax as plain text, not a rich-text paste. That button converts your **bold** to *bold*, your headers to bold lines since Slack has none, your tables to "Header: value" text since mrkdwn has no table syntax, and your [text](url) links to <url|text>—so you can copy straight into a curl command, a bot's payload, or a webhook body without hand-translating the syntax yourself. Underline and spoiler markup, which Slack doesn't support in either form, are simply dropped rather than left broken.