[{"data":1,"prerenderedAt":66},["Reactive",2],{"blog-post-markdown-to-slack-formatting-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":37,"related":39},"markdown-to-slack-formatting-guide","Markdown to Slack Formatting: What Actually Works (mrkdwn Explained)","Slack doesn't render standard Markdown — it uses its own mrkdwn format. Here's the full syntax mapping, what breaks (tables, headings, images), and how to convert reliably.","If you've ever pasted a chunk of Markdown into Slack expecting headings and tables to show up nicely, you've already learned the hard way: Slack doesn't speak Markdown. It has its own lookalike…","2026-07-10","workflows","Matt Rathbone","markdown to slack, slack mrkdwn, slack markdown formatting, slack message formatting, slack markdown syntax, convert markdown to slack, slack markdown tables",6,"\u003Cp>If you&#39;ve ever pasted a chunk of Markdown into Slack expecting headings and tables to show up nicely, you&#39;ve already learned the hard way: Slack doesn&#39;t speak Markdown. It has its own lookalike format called \u003Cstrong>mrkdwn\u003C/strong> (yes, missing the &quot;a&quot; — that&#39;s the actual name Slack uses in its own API docs), and it diverges from standard Markdown in ways that are easy to get wrong.\u003C/p>\n\u003Cp>This guide covers the full syntax mapping, what Slack simply can&#39;t render, and the gotcha that trips up most people building bots or webhooks: the difference between typing in the Slack message box and sending mrkdwn through the API.\u003C/p>\n\u003Ch2 id=\"markdown-vs-slacks-mrkdwn\">Markdown vs. Slack&#39;s mrkdwn\u003C/h2>\n\u003Cp>The two syntaxes look similar at a glance, but several common Markdown conventions use different characters in Slack — and a few have no equivalent at all.\u003C/p>\n\u003Cdiv class=\"table-responsive\">\u003Ctable class=\"table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Formatting\u003C/th>\n\u003Cth>Markdown\u003C/th>\n\u003Cth>Slack mrkdwn\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Bold\u003C/td>\n\u003Ctd>\u003Ccode>**bold**\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>*bold*\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Italic\u003C/td>\n\u003Ctd>\u003Ccode>*italic*\u003C/code> or \u003Ccode>_italic_\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>_italic_\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Strikethrough\u003C/td>\n\u003Ctd>\u003Ccode>~~strike~~\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>~strike~\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Inline code\u003C/td>\n\u003Ctd>\u003Ccode>`code`\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>`code`\u003C/code> (same)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Code block\u003C/td>\n\u003Ctd>\u003Ccode>```code```\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>```code```\u003C/code> (same)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Blockquote\u003C/td>\n\u003Ctd>\u003Ccode>&gt; quote\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>&gt; quote\u003C/code> (same, one level only)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Link\u003C/td>\n\u003Ctd>\u003Ccode>[text](url)\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>&lt;url|text&gt;\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Heading\u003C/td>\n\u003Ctd>\u003Ccode># Heading\u003C/code>\u003C/td>\n\u003Ctd>No native heading — use bold instead\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Unordered list\u003C/td>\n\u003Ctd>\u003Ccode>- item\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>• item\u003C/code> (see notes below)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ordered list\u003C/td>\n\u003Ctd>\u003Ccode>1. item\u003C/code>\u003C/td>\n\u003Ctd>Not auto-numbered — type numbers manually\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Horizontal rule\u003C/td>\n\u003Ctd>\u003Ccode>---\u003C/code>\u003C/td>\n\u003Ctd>Not supported in message text\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Table\u003C/td>\n\u003Ctd>\u003Ccode>| a | b |\u003C/code>\u003C/td>\n\u003Ctd>Not supported at all\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Image\u003C/td>\n\u003Ctd>\u003Ccode>![alt](url)\u003C/code>\u003C/td>\n\u003Ctd>Not supported inline\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\u003C/div>\n\u003Cp>The single asterisk for bold is the one that catches people most often — it&#39;s the exact opposite of standard Markdown, where a single asterisk means italic. Type \u003Ccode>*this*\u003C/code> in Slack and you&#39;ll get \u003Cstrong>bold\u003C/strong>, not italics.\u003C/p>\n\u003Ch2 id=\"the-trap-typing-in-slack-vs-sending-via-api\">The Trap: Typing in Slack vs. Sending via API\u003C/h2>\n\u003Cp>Here&#39;s the detail that most guides skip, and the one that matters most if you&#39;re building a bot, webhook, or CI notification: \u003Cstrong>Slack&#39;s message composer and Slack&#39;s API don&#39;t behave identically.\u003C/strong>\u003C/p>\n\u003Cp>When you type directly into the Slack message box, the client does some helpful auto-formatting as you go — typing \u003Ccode>- \u003C/code> at the start of a line converts it to a bullet, and typing \u003Ccode>1. \u003C/code> will auto-number subsequent lines while you&#39;re actively editing. This is a composer-only convenience.\u003C/p>\n\u003Cp>When you send text programmatically — via \u003Ccode>chat.postMessage\u003C/code>, an incoming webhook, or a Block Kit \u003Ccode>mrkdwn\u003C/code> text object — none of that auto-formatting happens. A literal \u003Ccode>- item\u003C/code> sent through the API renders as the literal characters \u003Ccode>- item\u003C/code>, not a bullet. If you want real bullets from a bot or script, you need to insert the actual bullet character (\u003Ccode>•\u003C/code>, \u003Ccode>Option+8\u003C/code> on Mac, or the Unicode character \u003Ccode>U+2022\u003C/code>) yourself, or build proper Block Kit list structures. The same applies to numbered lists — the API will not auto-number \u003Ccode>1.\u003C/code> / \u003Ccode>2.\u003C/code> / \u003Ccode>3.\u003C/code> for you.\u003C/p>\n\u003Cp>If your Markdown-to-Slack workflow runs through automation (a Git-to-Slack notifier, a changelog bot, a CI pipeline), test the actual API output, not just what you see typing manually in a channel.\u003C/p>\n\u003Ch2 id=\"what-doesnt-convert\">What Doesn&#39;t Convert\u003C/h2>\n\u003Ch3 id=\"headings\">Headings\u003C/h3>\n\u003Cp>Slack&#39;s mrkdwn has no heading syntax at all — no \u003Ccode>#\u003C/code>, no font-size levels. The only way to get a &quot;heading&quot; look in an ordinary message is to bold the line: \u003Ccode>*Section Title*\u003C/code>. If you&#39;re using Block Kit (Slack&#39;s structured message format for apps and bots), there&#39;s a dedicated \u003Ccode>header\u003C/code> block type, but that&#39;s a separate block, not something you write inline in mrkdwn text.\u003C/p>\n\u003Ch3 id=\"tables\">Tables\u003C/h3>\n\u003Cp>There is no table support in Slack messages — not in mrkdwn, and not in standard Block Kit blocks either. If your Markdown source has tables, you have a few options: convert the table to a formatted list, use Block Kit&#39;s \u003Ccode>fields\u003C/code> array in a \u003Ccode>section\u003C/code> block to fake a rough two-column layout, or drop the table and link out to the full document instead. There is no clean equivalent, so if tables matter, don&#39;t rely on message text at all.\u003C/p>\n\u003Ch3 id=\"images\">Images\u003C/h3>\n\u003Cp>\u003Ccode>![alt](url)\u003C/code> doesn&#39;t render inline. Slack ignores the syntax entirely and shows it as literal text. To actually display an image in Slack, you need a separate \u003Ccode>image\u003C/code> block in Block Kit, or you paste the image file itself into the channel. A Markdown image reference converted straight to Slack text will just look broken — most conversion tools (including ours) strip the image markup and keep the alt text so at least the description survives.\u003C/p>\n\u003Ch3 id=\"nested-lists\">Nested Lists\u003C/h3>\n\u003Cp>Slack doesn&#39;t have a native concept of list nesting depth in mrkdwn. Manually indenting with spaces before a bullet character will usually render with some visual indentation in the client, but it&#39;s not a documented, reliable feature — behavior has changed across Slack client versions. If nesting matters for readability, consider flattening to a single level with prefixes (\u003Ccode>Frontend: Component X\u003C/code>) rather than depending on indentation.\u003C/p>\n\u003Ch3 id=\"horizontal-rules\">Horizontal Rules\u003C/h3>\n\u003Cp>\u003Ccode>---\u003C/code> has no special meaning in Slack message text — it renders as three literal dashes. The closest equivalent in Block Kit is the \u003Ccode>divider\u003C/code> block, which is a structural element, not something you can type inline.\u003C/p>\n\u003Ch3 id=\"footnotes-definition-lists-task-lists\">Footnotes, Definition Lists, Task Lists\u003C/h3>\n\u003Cp>None of these have any Slack equivalent. Footnote references (\u003Ccode>[^1]\u003C/code>) show up as literal bracket text. Task list checkboxes (\u003Ccode>- [ ]\u003C/code>) render as literal text — Slack has no native inline checkbox in message text (interactive checkboxes exist only as Block Kit UI elements requiring an app, not plain-text formatting).\u003C/p>\n\u003Ch3 id=\"html\">HTML\u003C/h3>\n\u003Cp>Slack strips or ignores raw HTML in message text entirely. If your Markdown source has embedded HTML for layout tricks, none of it will survive — plan on it disappearing.\u003C/p>\n\u003Ch2 id=\"escaping-characters-for-api-use\">Escaping Characters for API Use\u003C/h2>\n\u003Cp>If you&#39;re sending mrkdwn through the API rather than typing manually, three characters need HTML-entity escaping because they have special meaning in Slack&#39;s format (particularly \u003Ccode>&lt;\u003C/code> and \u003Ccode>&gt;\u003C/code>, which wrap links):\u003C/p>\n\u003Cdiv class=\"table-responsive\">\u003Ctable class=\"table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Character\u003C/th>\n\u003Cth>Escape as\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>&amp;\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>&amp;amp;\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>&lt;\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>&amp;lt;\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>&gt;\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>&amp;gt;\u003C/code>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\u003C/div>\n\u003Cp>Skip this and a message containing a literal \u003Ccode>&lt;\u003C/code> or \u003Ccode>&gt;\u003C/code> — say, example code like \u003Ccode>if (x &lt; y)\u003C/code> — can get mangled or silently dropped, since Slack tries to parse it as the start of a link tag.\u003C/p>\n\u003Ch2 id=\"quick-reference\">Quick Reference\u003C/h2>\n\u003Cdiv class=\"table-responsive\">\u003Ctable class=\"table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Markdown feature\u003C/th>\n\u003Cth>Slack support\u003C/th>\n\u003Cth>What happens\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Bold / italic / strikethrough\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Different characters (see table above)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Inline code / code blocks\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Same backtick syntax\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Blockquote\u003C/td>\n\u003Ctd>Partial\u003C/td>\n\u003Ctd>Works, single level only\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Links\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Different syntax: \u003Ccode>&lt;url|text&gt;\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Headings\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Falls back to bold text\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tables\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>No equivalent, renders as broken text\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Images\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Ignored inline; needs a separate Block Kit block\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ordered/unordered lists\u003C/td>\n\u003Ctd>Partial\u003C/td>\n\u003Ctd>Composer auto-formats; API does not\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Nested lists\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Unreliable, client-dependent indentation only\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Horizontal rule\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Renders as literal dashes\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Footnotes, definition lists, task lists\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>No equivalent\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>HTML\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Stripped\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\u003C/div>\n\u003Ch2 id=\"using-the-converter\">Using the Converter\u003C/h2>\n\u003Cp>Our \u003Ca href=\"/tools/markdown-to-slack\">Markdown to Slack converter\u003C/a> handles the mechanical parts of this conversion automatically:\u003C/p>\n\u003Cul>\n\u003Cli>Converts \u003Ccode>**bold**\u003C/code> to \u003Ccode>*bold*\u003C/code> and italics to \u003Ccode>_italic_\u003C/code>\u003C/li>\n\u003Cli>Converts \u003Ccode>~~strikethrough~~\u003C/code> to \u003Ccode>~strikethrough~\u003C/code>\u003C/li>\n\u003Cli>Converts headings to bold text (since Slack has no heading syntax)\u003C/li>\n\u003Cli>Converts \u003Ccode>[text](url)\u003C/code> links to Slack&#39;s \u003Ccode>&lt;url|text&gt;\u003C/code> format\u003C/li>\n\u003Cli>Strips image Markdown while keeping the alt text so the description isn&#39;t lost\u003C/li>\n\u003Cli>Removes horizontal rules\u003C/li>\n\u003Cli>Shows a warning badge if it detects a table in your source, since Slack can&#39;t render it\u003C/li>\n\u003Cli>Protects code blocks and inline code from being touched by the other conversions\u003C/li>\n\u003C/ul>\n\u003Cp>Paste your Markdown on the left and get Slack-ready mrkdwn on the right, with a side-by-side comparison so you can see exactly what changed. No signup required.\u003C/p>\n\u003Cp>This is especially useful for release notes, changelog summaries, or documentation excerpts you&#39;re pasting into a channel — the kind of content that&#39;s authored in Markdown but consumed in Slack.\u003C/p>\n\u003Ch2 id=\"related-posts-and-tools\">Related Posts and Tools\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"/tools/markdown-to-slack\">Markdown to Slack converter\u003C/a> — real-time conversion, no signup required\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/markdown-platform-compatibility-guide\">Markdown Across Platforms\u003C/a> — how Markdown behaves across GitHub, Notion, Obsidian, and Confluence\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/why-your-markdown-isnt-rendering\">Why Your Markdown Isn&#39;t Rendering\u003C/a> — troubleshooting guide covering renderer-specific quirks like this one\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/markdown-to-jira-wiki-markup-guide\">Markdown to Jira Wiki Markup\u003C/a> — the same kind of syntax-mapping problem, different tool\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/markdown-for-notion-what-actually-works\">Markdown for Notion\u003C/a> — what converts cleanly (and what doesn&#39;t) when moving Markdown into Notion\u003C/li>\n\u003C/ul>\n",[15,19,22,25,28,31,34],{"id":16,"text":17,"level":18},"markdown-vs-slacks-mrkdwn","Markdown vs. Slack's mrkdwn",2,{"id":20,"text":21,"level":18},"the-trap-typing-in-slack-vs-sending-via-api","The Trap: Typing in Slack vs. Sending via API",{"id":23,"text":24,"level":18},"what-doesnt-convert","What Doesn't Convert",{"id":26,"text":27,"level":18},"escaping-characters-for-api-use","Escaping Characters for API Use",{"id":29,"text":30,"level":18},"quick-reference","Quick Reference",{"id":32,"text":33,"level":18},"using-the-converter","Using the Converter",{"id":35,"text":36,"level":18},"related-posts-and-tools","Related Posts and Tools",[38],"markdown-to-slack",[40,47,57],{"slug":41,"title":42,"description":43,"excerpt":44,"date":45,"category":9,"author":10,"keywords":46,"readingMinutes":12},"markdown-for-notion-what-actually-works","Markdown for Notion: What Actually Works and What Doesn't","A practical guide to importing, writing, and exporting Markdown in Notion — what converts cleanly, what breaks, and reliable workarounds for each case.","Notion markets itself as Markdown-friendly, and for basic formatting it mostly is. But spend enough time moving documents between Notion and the rest of your toolchain and you'll hit the edge…","2026-06-26","markdown notion, notion markdown import, notion markdown export, notion markdown support, paste markdown notion, notion markdown rendering",{"slug":48,"title":49,"description":50,"excerpt":51,"date":52,"category":53,"author":54,"keywords":55,"readingMinutes":56},"small-text-in-markdown","Markdown Small Text Formatting","Learn how to create small text in Markdown using HTML tags for stylistic text presentation, footnotes, or clarifications.","Small text is a type of text formatting that makes your letters appear smaller than the standard text size. You might find this feature useful when you want certain segments of your text to be…","2024-07-10","Tutorial","Matthew Rathbone","Small text in Markdown",1,{"slug":58,"title":59,"description":60,"excerpt":61,"date":62,"category":63,"author":10,"keywords":64,"readingMinutes":65},"markdown-in-confluence-what-works","Markdown in Confluence: What Actually Works, What Doesn't, and Workarounds","A practical guide to using Markdown in Confluence Cloud and Data Center — what converts cleanly, what breaks, and how to work around the limitations.","If you're a developer or technical writer who lives in Markdown, Confluence can feel like a wall. You write clean Markdown, paste it into Confluence, and something unexpected happens. Sometimes it…","2026-05-15","platform-guides","confluence markdown, confluence markdown support, confluence markdown editor, atlassian markdown, confluence paste markdown, confluence import markdown",7,1792184946942]