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.
On this page
- 1. Which table method to use
- 2. How to paste a real table into a Slack message
- 3. Make a text table with a code block
- 4. Why a markdown table does not work in a Slack message
- 5. How to make a real table in a Slack canvas
- 6. Turn a CSV file into a Slack table
- 7. Send a table from a Slack app with the Block Kit table block
- 8. Tables on Slack mobile
- 9. FAQ
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
| Method | Where it works | What you get | Use it for |
|---|---|---|---|
| Paste tab-separated cells | Any message, any plan | A real table, up to 100 rows and 20 columns | Rows from a sheet or a report |
| Code block | Any message, any plan | Text that lines up like a table | Apps with no tables, or more than 20 columns |
| Canvas table | Canvases (paid plans) | Real, editable cells | Tables people update and keep |
| Slack list | Lists (paid plans) | Rows with owners, dates and status | Tracking tasks |
| Block Kit table block | Messages sent by an app | Real rows and columns, up to 100 x 20 | Bot 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.
- 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.
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:
What we measured on 6 October, pasting into the message box of a Free workspace and reading each message back through the API:
| Pasted | What Slack did |
|---|---|
| Tab-separated rows, 2 or more rows and columns | Real table, first row bold |
| 20 columns, 100 rows, 10,000 characters | Real 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 cells | Plain text |
| One row, or one column | Plain text |
| Markdown table with pipes, or CSV with commas | Plain 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
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
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
A canvas is Slack's document inside a channel or DM, and its toolbar has a table option.
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.
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 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 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 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.