Slack Markdown Not Working? Why and How to Fix It
Typed **bold** formats in the Slack message box, but pasted markdown, headings, tables and [text](url) links stay literal until you fix them. What Cmd+Shift+F, the Format messages with markup setting and bot mrkdwn do, from our own tests.
On this page
Slack markdown usually "stops working" because Slack messages never used standard markdown. Slack has its own markup: one asterisk on each side for bold (*bold*), underscores for italics (_italic_), one tilde for strikethrough (~strike~), backticks for code, and > for a quote. Typed **bold** does turn bold in the message box, but pasted **bold** stays literal, and # Heading, ~~strike~~ and pipe tables show up as the characters you typed. A [text](url) link you type stays literal until you press Cmd+Shift+F (Ctrl+Shift+F on Windows). On pasted text, Cmd+Shift+F formats lists but leaves a stray * on each side of **bold** and does not make links, so convert pasted markdown first. Also check Format messages with markup in Preferences > Advanced.
The syntax and the setting are from Slack's help article "Format your messages in Slack with markup", and the shortcuts from Slack's keyboard shortcuts page, both checked on 27 September. The typed, pasted, markup-mode and bot results below are from our own test messages in a real Slack workspace on 28 September.
Slack formatting not working: symptom, cause and fix
| What you see | Cause | Fix |
|---|---|---|
Pasted **text** shows asterisks | Paste keeps the markup as characters | Convert first, then paste |
A stray * on each side of bold text | Cmd+Shift+F or markup mode on **text** | One asterisk: *text* |
[text](url) stays literal | The default box links it only on Cmd+Shift+F | Press Cmd+Shift+F after typing it |
# Heading stays a # | Slack messages have no headings | A short bold line |
| Asterisks while you type | Format messages with markup is on | It formats when you send |
| A table turns into pipes and dashes | No table syntax in messages | Code block or canvas |
A bot shows ** or [text](url) | mrkdwn has its own syntax | *bold*, and the <url> link form below |
| A bot shows raw asterisks | mrkdwn: false or plain_text | Use a mrkdwn text object |
Does Slack support markdown?
Partly. Slack's markup borrows some markdown characters and changes others. What works in a message you type:
- • Bold
*text*or**text**when typed, italic_text_, strikethrough~text~ - • Inline code with one backtick on each side, and code blocks with three
- • A quote with
>at the start of a line - • A bulleted list with
*and a space, a numbered list with1.and a space - • A link as
[text](url): in the default box it becomes a link only after you press Cmd+Shift+F, and with markup mode on it links when you send
What does not work: pasted **bold** and [text](url), __bold__, ~~strike~~, headings, tables, images and horizontal rules. Each style has its own guide: bold and italics, bullet points, quotes and tables. Superscript has no syntax in Slack at all: ^2^ and <sup>2</sup> stay as typed, and only Unicode characters such as ² and ™ show raised.
Fix pasted markdown that does not format
When you paste text, Slack keeps markup characters as plain text and shows a toast: "Looks like your content contains markdown. Apply formatting". Slack's shortcut list has the same action: Apply markdown formatting, Cmd+Shift+F on a Mac and Ctrl+Shift+F on Windows and Linux. If it goes wrong, Undo formatting is Cmd+Z (Ctrl+Z).
The result is only partly formatted. We pasted a standard markdown block into Slack on 28 September and pressed Cmd+Shift+F:
| Pasted | After Cmd+Shift+F |
|---|---|
- item lines | A bulleted list |
**bold** | Bold, with a stray * on each side |
[text](url) | Stays literal; the URL becomes a link chip |
# Heading | Stays literal |
| A pipe table | Stays literal |
Clicking Apply formatting in the toast gave the same bold and link result, and did not convert the list in that run. So Cmd+Shift+F fixes lists but not bold or links in pasted text.
Text from ChatGPT, Claude, Notion or a GitHub README is written in standard markdown, with double asterisks and # headings, which Slack's markup does not read. Convert it first: paste it into our markdown to Slack converter, press Copy for Slack, and paste the result. Headings become bold lines and tables become aligned code blocks. The ChatGPT case, with a prompt that makes it write in Slack format, is in how to paste ChatGPT into Slack.
Never appear "away" on Slack again
Cloud-based. No downloads. Works 24/7 even when your laptop is off.
The Format messages with markup setting
Slack has two ways to format. By default, the formatting toolbar is on and typed markers turn into formatting as you type. With Format messages with markup on, Slack's help says three things change:
In our test with markup mode on, a typed [text](url) became a link when sent, *one* became bold, **two** became bold with a stray * on each side, and Cmd+U still underlined selected text.
To change it: click your profile picture, choose Preferences, select Advanced, and under Input Options tick or untick Format messages with markup.
How to turn off Slack formatting
To send the characters themselves, not the formatting:
Slack markdown not rendering in bot or API messages
Slack's developer docs list three switches that decide whether a bot's text is formatted:
text of chat.postMessage uses mrkdwn by default. "mrkdwn": false turns formatting off. In mrkdwn, **bold** and [text](url) stay literal in our test; write *bold* and <https://slack.green|text>."type": "mrkdwn". With "type": "plain_text", asterisks stay asterisks."type": "markdown") reads standard markdown: **bold**, [text](url) links, # headings, lists and even pipe tables. Use it for LLM output.Slack also treats &, < and > as control characters. Escape them in text you pass through, or a stray < can swallow part of the message:
def slack_escape(text: str) -> str:
"""Escape the three characters Slack treats as control characters."""
return text.replace("&", "&").replace("<", "<").replace(">", ">")
payload = {
"channel": "C0123456789",
"text": "*Build failed* for " + slack_escape("feature/a<b & c>"),
}
print(payload["text"])
Before a bot sends a message, paste its text into the Slack to Markdown side of the Markdown to Slack converter to preview how Slack renders it.
The full syntax for both, with JSON for section blocks, the markdown block and rich text lists, is in Slack Block Kit markdown.
FAQ
Why is my Slack markdown not working?
Slack uses its own markup, not standard markdown. Bold is *one asterisk*, and headings and tables do not exist in messages.
How do I apply formatting to pasted text in Slack?
Paste, then press Cmd+Shift+F on a Mac or Ctrl+Shift+F on Windows and Linux (Apply markdown formatting). It turns - lines into a list, but **bold** keeps a stray asterisk on each side and [text](url) stays literal, so convert standard markdown with the markdown to Slack converter before you paste.
How do I turn off markdown in Slack?
Press Cmd+Z right after Slack formats your text, wrap the text in backticks, or turn on Format messages with markup in Preferences, Advanced.
Does Slack support markdown headings?
Not in messages. Use a short bold line. Canvases and the Block Kit markdown block do support headings.
Why does my Slack bot show asterisks?
The text is plain_text or the message has "mrkdwn": false. Use a mrkdwn text object, or send standard markdown in a markdown block.
Stop Jiggling Your Mouse.
Join hundreds of remote workers who never worry about their Slack status. Set it up once, stay green forever.
Related Articles
Slack Daily Standup Without a Paid Bot: /remind, Workflow Builder and a Script
We set up a weekday 9:30 standup in a free Slack workspace three ways: a /remind reminder, Workflow Builder, and a short script that posts the questions and collects the thread replies.
Slack Tabs Under a Channel Name: What Each One Is and How to Edit Them
We added, renamed, moved, hid and deleted the tabs under a channel name in Slack web on the Free plan, and compared them with the tabs in a DM.
Leave Multiple Slack Channels at Once: 4 Ways Timed, Plus a Script
Slack has no bulk leave button. We made 12 test channels and left them with the sidebar menu, the channel browser, /leave and a 30-line script, and timed each way.