Skip to content

How to Make a Table in Discord, Slack and Microsoft Teams

By MarkdownTables.com editorial teamUpdated

On this page

Which chat apps render tables?

Chat apps support a small subset of Markdown, and tables are usually left out. Here is what each app does with a typed pipe table, and what to use instead.

Tables in chat apps (October 2026)
AppMarkdown table in a messageNative table optionBest workaround
Discord❌ Shown as textNoneCode block; bot embeds with inline fields
Slack❌ Shown as text (mrkdwn has no tables)✅ Block Kit table block (apps); tables in canvasesCode block for people; table block for apps
Microsoft Teams⚠️ Varies by client✅ Insert table in the compose box; Adaptive Card TableInsert table; Adaptive Card for bots
Telegram❌ Shown as textNoneMonospace block (three backticks, or <pre> for bots)
WhatsApp❌ Shown as textNoneMonospace with three backticks, or an image
Mattermost, Zulip✅ RenderedMarkdown tablesPaste the Markdown table

If your table is headed for a Markdown-aware app such as Mattermost, Zulip, GitHub or Notion, the regular syntax works:

The same data as a Markdown table
Markdown
| Name  | Role      | Status |
| ----- | --------- | ------ |
| Ada   | Engineer  | Active |
| Grace | Architect | Away   |
Preview
NameRoleStatus
AdaEngineerActive
GraceArchitectAway

Renders in Mattermost and Zulip. In Slack, Discord, Telegram and WhatsApp it stays as text. Syntax rules: Markdown table syntax.

Open in editor : The same data as a Markdown table

The universal workaround: a monospace code block

Every app above shows text between triple backticks in a monospace font, where each character takes the same width. Pad the columns with spaces and the table lines up. Two styles work well:

Plain columns: lightest, survives every clientMessage
```
Name   Role       Status
-----  ---------  ------
Ada    Engineer   Active
Grace  Architect  Away
```
Unicode box drawing: reads like a real tableMessage
```
┌───────┬───────────┬────────┐
│ Name  │ Role      │ Status │
├───────┼───────────┼────────┤
│ Ada   │ Engineer  │ Active │
│ Grace │ Architect │ Away   │
└───────┴───────────┴────────┘
```

You can also keep the Markdown pipes inside the code block. Readers see the source, not a rendered table, but it's quick and readers can paste it straight into a Markdown editor:

Markdown source in a code blockMessage
```
| Name  | Role      | Status |
| ----- | --------- | ------ |
| Ada   | Engineer  | Active |
| Grace | Architect | Away   |
```

Padding by hand is tedious. Paste or type the data into the Markdown table generator and pick the Unicode Box Art (or ASCII SQL Box) output style; the table formatter pads an existing pipe table.

How do I make a table in Discord?

Discord's Markdown covers bold, italics, headers, lists, quotes, spoilers and code, but not tables. There are two ways to get rows and columns:

In a message: a code block

  1. Type three backticks, press Shift+Enter for a new line, and paste the aligned table.
  2. Close with three backticks on their own line and send.

Adding a language after the opening backticks (for example ```text) is optional. Discord also highlights ```ansi blocks with ANSI color codes on desktop, which some people use to color a status column; the colors may not show on every client.

From a bot or webhook: embed fields

Embeds can show up to three inline fields side by side, which makes a passable three-column table: each field is a column and line breaks in its value make the rows. Discord documents limits of 25 fields per embed, 256 characters per field name, 1,024 per value and 6,000 characters per embed. On narrow screens inline fields may stack, so keep it to short values.

Webhook payload: an embed used as a three-column tableJSON
{
  "embeds": [
    {
      "title": "Deploy status",
      "fields": [
        { "name": "Service", "value": "API\nWorker\nWeb", "inline": true },
        { "name": "Status", "value": "✅ Live\n⚠️ Degraded\n✅ Live", "inline": true },
        { "name": "Time", "value": "42s\n1m 03s\n38s", "inline": true }
      ]
    }
  ]
}

Values don't line up across columns if one cell wraps, so this works best for short labels and numbers. For anything longer, use a code block or an image.

How do I make a table in Slack?

It depends on who sends the message. People typing in the composer still have no table formatting: Slack's message markup (mrkdwn) supports bold, italic, strikethrough, links, lists, quotes and code, but a pipe table is posted as plain text. Apps are different.

Apps and bots: the Block Kit table block

Since August 14, 2025, Slack's Block Kit includes a table block. An app sends it with chat.postMessage (or publishes it to its Home tab), and Slack renders a real table. As of October 2026 the reference documents:

Slack table block at a glance
PropertyDetails
rowsArray of rows; each row is an array of cells (raw_text or rich_text). Up to 100 rows and 20 cells per row.
column_settingsOptional per-column settings: align (left, center, right) and is_wrapped (wrap long text instead of truncating).
Size limit10,000 characters
Where it worksMessages and the app Home tab
chat.postMessage payload with a table blockJSON
{
  "text": "Latency by service: API 120 ms, Worker 340 ms",
  "blocks": [
    {
      "type": "table",
      "column_settings": [{ "is_wrapped": true }, { "align": "right" }],
      "rows": [
        [
          { "type": "raw_text", "text": "Service" },
          { "type": "raw_text", "text": "p95 latency (ms)" }
        ],
        [
          { "type": "raw_text", "text": "API" },
          { "type": "raw_text", "text": "120" }
        ],
        [
          { "type": "raw_text", "text": "Worker" },
          { "type": "raw_text", "text": "340" }
        ]
      ]
    }
  ]
}

Keep the top-level text: Slack uses it for notifications and for clients that can't show the block. If your data already lives in a Markdown table, a few lines of code turn it into rows:

Markdown table to Slack table blockJavaScript
// Convert a simple Markdown table into a Slack Block Kit table block.
// Assumes no escaped pipes (\|) inside cells.
function markdownToSlackTable(markdown) {
  const rows = markdown
    .trim()
    .split('\n')
    .filter((_, i) => i !== 1) // drop the | --- | delimiter row
    .map(line =>
      line
        .trim()
        .replace(/^\||\|$/g, '')
        .split('|')
        .map(cell => ({ type: 'raw_text', text: cell.trim() })),
    );
  return { type: 'table', rows: rows.slice(0, 100) }; // Slack allows 100 rows
}

People: canvases, code blocks or an image

  • Canvases (in channels, DMs or standalone) have a built-in table you insert from the formatting options. Use a canvas when the table is reference material people will edit.
  • Code block in a message for a quick, read-only table. In the composer, type three backticks or use the code block button, then paste the aligned text.
  • An image when the table is wide or needs color; see below.

How do I make a table in Microsoft Teams?

Teams has a rich-text compose box, so people don't need Markdown for tables at all:

  1. Open the formatting options in the compose box (the expanded editor).
  2. Choose Insert table and pick the size.
  3. Type or paste into the cells. Use the table controls to add rows and columns.

Teams also recognizes some Markdown as you type, but whether a pasted pipe table turns into a table varies between the desktop, web and mobile clients and between versions, so don't depend on it for anything important. Copying a range from Excel and pasting it into the compose box usually keeps it as a table.

Bots and workflows should use an Adaptive Card. Schema version 1.5 added a Table element with columns, rows, cells and optional grid lines and header row. Check that the Teams clients your audience uses support the card version you send, and use a code block in a plain-text message as the fallback.

Telegram, WhatsApp and other chat apps

  • Telegram has no tables. In a message, wrap aligned text in three backticks for monospace. Bots can send the same text in a <pre> element with HTML parse mode (or a code block with MarkdownV2):
Telegram bot message (parse_mode: HTML)HTML
<pre>
Name   Role       Status
Ada    Engineer   Active
Grace  Architect  Away
</pre>
  • WhatsApp has no tables. Three backticks around the text give monospace, but phone screens are narrow, so an image usually reads better.
  • Mattermost and Zulip render standard Markdown pipe tables, so paste the table as is. If one doesn't render there, the cause is usually the syntax: see Markdown table not rendering.

When to send the table as an image

A code block stops working when the table is wider than a phone screen, needs color, or mixes emoji and text. Send it as an image instead: it looks the same in every app and on every device. Keep the source as text too (in a thread reply or a linked doc) so people can search and copy the values, and add alt text where the app supports it.

Markdown table to image renders a table as a PNG or SVG in light or dark themes, ready to paste into any chat.

Why chat tables come out misaligned

  • Proportional font. Spaces only line columns up in a monospace font. Without the code block, a padded table collapses.
  • Emoji and CJK characters are wider than one monospace column, so rows that contain them shift. Use text such as OK / FAIL inside code-block tables.
  • Tabs are rendered with different widths in different clients. Pad with spaces.
  • Line wrapping on phones breaks long rows. Keep code-block tables narrow, drop columns, or send an image.
  • Message length limits cut long tables (Discord messages, for example, are limited to 2,000 characters without Nitro). Split the table or attach it as a file.

Frequently asked questions

Can you make a table in Discord?

Not a real one. Discord’s Markdown has no table syntax, so pipe tables show as plain text. Put a space-aligned table inside a code block (three backticks before and after) so it displays in a monospace font, or have a bot send an embed with inline fields.

Does Slack support Markdown tables?

Not in messages you type: Slack’s mrkdwn formatting has no tables. Since August 2025, apps can post a native table with the Block Kit table block, and canvases have their own tables. In the composer, use a code block or share an image.

What are the limits of Slack’s table block?

As of October 2026, Slack’s Block Kit reference lists up to 100 rows, 20 cells per row and 10,000 characters. Each column can set align (left, center, right) and is_wrapped through column_settings. It works in messages and the app Home tab.

Can I paste a Markdown table into Microsoft Teams?

Don’t rely on it: whether pasted Markdown becomes a table depends on the Teams client and version. The reliable way is the compose box’s formatting options, which include inserting a table. Bots and workflows can send an Adaptive Card (schema 1.5 or later) with a Table element.

Why does my code-block table look misaligned on my phone?

Long lines wrap or scroll on narrow screens, and emoji or CJK characters are wider than one monospace column. Keep rows short, use plain text in cells, and send an image when the table is wide.

How do I make a table in Telegram or WhatsApp?

Neither app renders tables. Wrap a space-aligned table in three backticks to get monospace text; Telegram bots can also send it in a <pre> block with HTML parse mode. For anything wide, send an image.

How do I turn a Markdown table into a chat-friendly table?

Paste it into the Markdown table generator, choose the Unicode Box Art output style, and paste the result inside a code block. To share it as a picture, use Markdown table to image.

Make a chat-ready table

Paste your data, choose the Unicode Box Art style, and copy it into a code block.