Back to Blog
Guide

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

Copy cells from Excel or Google Sheets and paste them into a Slack message: Slack turns tab-separated text into a real table, up to 20 columns, 100 rows and 10,000 characters (tested 6 October 2026). Plus code blocks, canvas tables and the Block Kit table block, with the errors we hit.

Slack Green Team
September 27, 2026
October 6, 2026
8 min read
Share:
slack
formatting
tables
canvas

To make a table in a Slack message, copy the cells from Excel or Google Sheets and paste them into the message box. Slack turns tab-separated text into a real table: the box says "Table added as an attachment", and the sent message shows a grid with the first row in bold. We tested it in Slack for web on 6 October 2026, on a Free workspace. The formatting toolbar still has no table button, and a markdown table from ChatGPT pastes as plain pipes, so our Slack table maker turns markdown, CSV or JSON into the tab-separated text Slack accepts. For a table people keep editing, use a canvas. Bots send the Block Kit table block.

The paste test, its limits and the Block Kit answers below come from our own workspace on 6 October 2026. The canvas limit is from Slack's developer docs.

Which table method to use

MethodWhere it worksWhat you getUse it for
Paste tab-separated cellsAny message, any planA real table, up to 100 rows and 20 columnsRows from a sheet or a report
Code blockAny message, any planText that lines up like a tableApps with no tables, or more than 20 columns
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 paste a real table into a Slack message

  • Select the cells in Excel or Google Sheets and copy them (Cmd+C or Ctrl+C). For a ChatGPT table, CSV or JSON, paste it into the Slack table maker first and click Copy table for Slack.
  • Click in the Slack message box and paste. Slack says "Table added as an attachment" and shows a Table chip under the box.
  • Type a line above it if you want, then send.
  • Slack message box after pasting tab-separated cells: a Table chip reading Task, Owner, Hours under the text field

    The chip opens a read-only Table preview, so fix cells before you copy. This is the Google Sheets sample from the table maker after sending, with a line break inside one cell:

    A real table in a Slack message, pasted from tab-separated cells: Week, Signups, Churn and Notes columns, header row in bold

    What we measured on 6 October, pasting into the message box of a Free workspace and reading each message back through the API:

    PastedWhat Slack did
    Tab-separated rows, 2 or more rows and columnsReal table, first row bold
    20 columns, 100 rows, 10,000 charactersReal table
    21 columns, 101 rows or 10,001 characters"This table is too big to send as an attachment. Send a snippet instead?"
    Rows with different numbers of cellsPlain text
    One row, or one columnPlain text
    Markdown table with pipes, or CSV with commasPlain text
    A second table in the same message"Only 1 table can be attached to each message. Paste as text instead?"

    Slack counts the 10,000 characters in UTF-16 units, so an emoji or a symbol like 𝐀 counts 2. In a pasted table, <@user>, @channel, links, *bold* and ` code stay as plain text; only :emoji:` codes turn into emoji. When the clipboard held an HTML table with bold text and a link next to the tab-separated copy, as Google Sheets puts it there, Slack built the table from the plain text and dropped the bold and the link.

    Make a text table 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, the As a code block tab of the Slack table maker pads the columns for you, and the markdown to Slack converter does the same for a markdown table inside a longer message.

    Why a markdown table does not work in a Slack message

    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.

    Cells copied from Excel or Google Sheets work, because the clipboard holds them as tab-separated text. To send a markdown table as a real table, change the pipes to tabs first; the Slack table maker does that and drops the ** markers.

Never appear "away" on Slack again

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

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. Standalone canvases are a paid-plan feature; Slack marks Create new > Canvas as Pro, and existing canvases become read-only when a workspace drops to the free plan. A free workspace can still add a canvas tab to a channel, which is where we tested the Slack canvas formatting shortcuts. 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

    Apps can post a real table in a message. Slack's Block Kit has a table block, and we hit the same limits as a paste: at 101 rows chat.postMessage answered no more than 100 items allowed, at 21 cells in a row no more than 20 items allowed, and at 10,001 characters table_character_count_must_not_exceed_10000. Cells are raw_text, raw_number or rich_text (for bold, links and mentions), and column_settings sets wrapping and alignment per column. Two traps from the same test: a null entry in column_settings fails with must provide an object, so use {} for a column with no setting, and an empty raw_text cell fails with must be more than 0 characters, so send an empty cell as null. The From a bot tab of the Slack table maker builds this JSON from a pasted table.

    Save the message as table.json:

    {
      "channel": "C0123456789",
      "text": "Launch status: 3 tasks",
      "blocks": [
        {
          "type": "table",
          "column_settings": [{"is_wrapped": true}, {}, {"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. For a sortable table with paging, or a chart next to it, apps can use the newer data_table and data_visualization blocks; we tested both, with the errors each returns, in Slack Block Kit charts.

    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. We sent the pipe table below on 6 October, and Slack stored it as a table block; unlike a paste, the header row was not bold. 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 to Markdown side of the Markdown to Slack converter 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 or a canvas instead. The Slack keyboard shortcuts for code blocks and lists only apply on desktop.

    FAQ

    Does Slack markdown support tables?

    Not as pipes in a message you type: | and --- show as typed. Tab-separated text is the format the message box turns into a table. Markdown tables do work in canvases created through the Slack API and in the Block Kit markdown block that apps send.

    How do I paste a table from Excel into Slack?

    Copy the cells and paste them into the message box. Slack makes a real table from up to 100 rows, 20 columns and 10,000 characters; past that it offers to send a snippet instead.

    Is there a table button in Slack messages?

    No. The message toolbar has bold, italics, underline, strikethrough, code, block quote, code block and lists. Pasting tab-separated cells is the way in; 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

    Guide

    Slack Bot Scopes: The Scope Each API Method Needs, Measured on 44 Methods

    We gave a Slack bot one scope, called 44 common Web API methods, and read the needed field of every missing_scope error. Then we added the scopes and called them again. The table shows which scope clears each method.

    Slack Green Team
    Guide

    Slack File Size Limit: 1 GB Is Exactly 1,073,741,824 Bytes, Tested

    We uploaded files of 50 MB, exactly 1 GiB and 1 GiB plus one byte to Slack through its upload API. The limit is 1,073,741,824 bytes, and a failed upload can still leave a broken file behind.

    Slack Green Team
    Guide

    Slack Dark Mode: Where the Setting Is, and Which Custom Emoji Disappear

    Slack's dark mode is under Preferences > Appearance > Color Mode, with Light, Dark and System. We switched modes in Slack web with three test emoji and measured which ones vanish.

    Slack Green Team