Back to Blog
Guide

How to Make a Table in Slack: Code Block, Canvas or Block Kit

Slack messages have no table format. For a quick table, put padded columns in a code block. For a real, editable table, insert one in a canvas. Apps can send a native table with the Block Kit table block. Steps, a CSV-to-Slack script and the limits of each.

Slack Green Team
September 27, 2026
September 27, 2026
5 min read
Share:
slack
formatting
tables
canvas

To make a table in Slack, pick where it will live. A Slack message has no table format: the formatting toolbar offers bold, italics, underline, strikethrough, code, block quote, code block and lists, and nothing for rows and columns. So for a quick table in a message, type the columns inside a code block (three backticks), where the fixed-width font keeps them lined up. For a real table with cells you can edit, open a canvas and insert a table from its toolbar. Apps and bots can send a native table in a message with the Block Kit table block.

The toolbar options above are from Slack's help article "Format your messages in Slack", and the canvas and Block Kit limits are from Slack's developer docs, all checked on 27 September.

One thing none of these change is your status dot. Slack marks you away after about 10 minutes without input in the Slack window, however long you spend building a table somewhere else. Slack Green keeps your status green from a server during the hours you set.

How to make a table in Slack: code block, canvas table, Slack list, and Block Kit table block

Which table method to use

Four ways to put a table in Slack compared: where each works and whether it gives real rows and columns
MethodWhere it worksWhat you getUse it for
Code blockAny message, any planText that lines up like a tableA few rows in a chat
Canvas tableCanvases (paid plans)Real, editable cellsTables people update and keep
Slack listLists (paid plans)Rows with owners, dates and statusTracking tasks
Block Kit table blockMessages sent by an appReal rows and columns, up to 100 x 20Bot reports and alerts

If the table is a to-do list with owners and due dates, a Slack list fits better than either; see Slack canvas vs lists.

How to make a table in a Slack message with a code block

  • Type or paste your rows, with spaces between the columns so each column starts at the same position.
  • Select the text and click Code block in the formatting toolbar, or press Cmd+Option+Shift+C on a Mac (Ctrl+Alt+Shift+C on Windows). You can also type three backticks before and after the text.
  • Check the preview in the message box, then send.
  • Slack shows code blocks in a fixed-width font, so every character takes the same space and the columns stay in line:

    Name  Task         Status
    ----  -----------  ---------
    Jane  Launch post  Done
    Sam   QA           In review
    Mira  Design       Waiting

    Keep the table narrow, about 60 characters at most, or it will not fit a phone screen. Bold, links and mentions do not work inside a code block.

    To skip the spacing work, paste a markdown table into our markdown to Slack converter. It pads the columns, keeps the alignment from the :---: row, and gives you a code block to paste.

    Why a markdown table does not work in a Slack message

Never appear "away" on Slack again

Cloud-based. No downloads. Works 24/7 even when your laptop is off.

Why a markdown table breaks in a Slack message: code block lines up, pasted pipes are sent as typed

Slack messages use Slack's own markup, which Slack calls mrkdwn. It covers bold (*text*), italic (_text_), strikethrough (~text~), code, quotes and links, and it has no table syntax. A table written with | and ---, including one copied from ChatGPT, arrives as the characters you typed, in a font where the columns do not line up.

The same goes for cells pasted from Excel or Google Sheets. The message box has no table element, so the grid does not survive. Put the cells in a canvas table, share the sheet link, or turn them into a code block.

How to make a real table in a Slack canvas

Make a real table in a Slack canvas: open a canvas, insert a table, fill cells, share it

A canvas is Slack's document inside a channel or DM, and its toolbar has a table option.

  • Click Files in the sidebar, then the + button, and choose Canvas. To attach it to a conversation, click the + in the channel header and pick Canvas.
  • Click the table option in the canvas toolbar, or press / to open the insert menu and choose the table.
  • Type in the cells. Cells can hold bold text, links, mentions and checkboxes.
  • Share the canvas in the conversation, or keep it as a channel tab so everyone finds it.
  • Slack's developer docs set a limit of 300 cells per canvas table, in any mix of rows and columns. Canvases are a paid-plan feature: when a workspace drops to the free plan, existing canvases become read-only. Canvas tables are the one place in Slack where a markdown table works: an app that creates a canvas with the canvases.create API can send the table as markdown and Slack builds the grid.

    Turn a CSV file into a Slack table

    For a spreadsheet you export often, a short script does the padding. Save this as csv_to_slack.py and run python3 csv_to_slack.py team.csv. It prints a code block you can paste into any Slack message:

    import csv
    import sys
    
    FENCE = "`" * 3
    
    with open(sys.argv[1], newline="") as f:
        rows = list(csv.reader(f))
    
    ncols = max(len(r) for r in rows)
    rows = [r + [""] * (ncols - len(r)) for r in rows]
    widths = [max(len(r[i]) for r in rows) for i in range(ncols)]
    
    lines = ["  ".join(c.ljust(w) for c, w in zip(r, widths)).rstrip() for r in rows]
    lines.insert(1, "  ".join("-" * w for w in widths))
    print("\n".join([FENCE, *lines, FENCE]))

    For the team.csv file behind the example above, the output is the table shown in the code block section, with a dashed line under the header. For a CSV with more than five or six columns, a canvas table is easier to read.

    Send a table from a Slack app with the Block Kit table block

    Never appear "away" on Slack again

    Cloud-based. No downloads. Works 24/7 even when your laptop is off.

    Apps can post a real table in a message. Slack's Block Kit has a table block: up to 100 rows, up to 20 cells per row, and at most 10,000 characters across all cells in a message. Cells are raw_text, raw_number or rich_text (for bold, links and mentions), and column_settings sets wrapping and alignment per column.

    Save the message as table.json:

    {
      "channel": "C0123456789",
      "text": "Launch status: 3 tasks",
      "blocks": [
        {
          "type": "table",
          "column_settings": [{"is_wrapped": true}, null, {"align": "right"}],
          "rows": [
            [{"type": "raw_text", "text": "Task"}, {"type": "raw_text", "text": "Owner"}, {"type": "raw_text", "text": "Hours"}],
            [{"type": "raw_text", "text": "Launch post"}, {"type": "raw_text", "text": "Jane"}, {"type": "raw_text", "text": "6"}],
            [{"type": "raw_text", "text": "QA pass"}, {"type": "raw_text", "text": "Sam"}, {"type": "raw_text", "text": "12"}]
          ]
        }
      ]
    }

    Then post it with chat.postMessage and your bot token:

    curl -X POST https://slack.com/api/chat.postMessage \
      -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
      -H "Content-type: application/json; charset=utf-8" \
      --data @table.json

    The text field is the fallback that shows in notifications. For longer tables, Slack's docs say to split them across messages.

    A shorter route for apps that already produce markdown, such as an LLM answer: Slack's Block Kit markdown block ("type": "markdown") takes standard markdown, and Slack's docs say a pipe table in it "renders as a formatted table". All markdown blocks in one message share a 12,000-character limit.

    {
      "channel": "C0123456789",
      "text": "Launch status",
      "blocks": [
        {"type": "markdown", "text": "| Task | Owner |\n| --- | --- |\n| Launch post | Jane |\n| QA pass | Sam |"}
      ]
    }
    ``` For text a bot posts outside a table, the [Slack message formatter](/en/tools/slack-message-formatter) previews the mrkdwn before you send it.
    
    ## Tables on Slack mobile
    
    On the Slack app for iPhone and Android, a wide code block does not fit the screen. If most readers are on phones, keep code-block tables to two or three short columns, or use a [bulleted list](/en/blog/how-to-make-bullet-points-in-slack) or a canvas instead. The [Slack keyboard shortcuts](/en/blog/slack-keyboard-shortcuts) for code blocks and lists only apply on desktop.
    
    ## FAQ
    
    **Does Slack markdown support tables?**
    
    Not in messages you type. Slack's mrkdwn has no table syntax, so `|` and `---` show as typed. Markdown tables do work in canvases created through the Slack API and in the Block Kit markdown block that apps send, and canvases have a table option in their toolbar.
    
    **How do I paste a table from Excel into Slack?**
    
    A message cannot hold a grid, so the cells lose their layout. Paste them into a canvas table, share a link to the spreadsheet, or line them up in a code block.
    
    **How do I format a Slack message as a table?**
    
    Put the rows in a code block with spaces between the columns. The fixed-width font keeps the columns aligned. Our [markdown to Slack converter](/en/tools/markdown-to-slack) does the spacing for you.
    
    **Can a Slack bot send a table?**
    
    Yes. Use the Block Kit `table` block in `chat.postMessage`: up to 100 rows, 20 cells per row, and 10,000 characters per message.
    
    **Is there a table button in Slack messages?**
    
    No. The message toolbar has bold, italics, underline, strikethrough, code, block quote, code block and lists. The table button is in canvases.
    Always Active

    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

    Templates

    Slack Status for Limited Availability: 30 Statuses to Copy

    A Slack status for limited availability says you are around but slow, until when, and how to reach you if it is urgent, such as ⏳ 'Limited availability today, replies after 3 PM. Urgent: @mention me.' 30 statuses for busy days, slow replies and catching up, the emoji to use, and when to pause notifications too.

    Slack Green Team•5 min read
    Ideas

    Slack Emoji for Thank You (and You're Welcome)

    The usual Slack emoji for thank you are 🙏 :pray:, 🙌 :raised_hands: and ❤️ :heart:. For you're welcome, 😊 :blush: or 🤗 :hugging_face:. What each one says, which ones read wrong, and custom :ty:, :np: and :welcome: emoji your team can add in a minute.

    Slack Green Team•5 min read
    Ideas

    Slack Emoji for Condolences: What to React With, and What to Say

    The right Slack emoji for condolences are ❤️ :heart:, 🙏 :pray:, 🤗 :hugging_face:, 💐 :bouquet:, 🕯️ :candle: and 🕊️ :dove_of_peace:. Avoid 👍, ✅ and 👀, which read as 'noted'. Add a few words in the thread or a DM. Short condolence messages, get-well emoji, and custom 'thinking of you' emoji.

    Slack Green Team•5 min read