Slack table maker

Make a real table in a Slack message. Paste cells from Excel or Google Sheets, a markdown table from ChatGPT, CSV or JSON, and copy it in the one format Slack turns into a table: tab-separated rows. Checked against the limits we measured in Slack: 20 columns, 100 rows, 10,000 characters.

Try:

You 10:07 AM

FeatureOwnerStatusDue
SSO loginPriyaIn reviewOct 9
CSV export@samBlocked on APIOct 14
Dark mode :crescent_moon:JaneDone
Billing pageLuisIn progressOct 20

How Slack draws a pasted table: first row in bold, long cells never wrap (a line break you put in a cell stays), and a scroll bar when the table is wider than the message. Click a cell to edit it.

  • A mention stays plain text in a pasted table; nobody is notified (cells in amber)
  • An :emoji: code turns into the emoji
Rows5 / 100
Columns4 / 20
Characters149 / 10,000
Slack will turn this into a table. Copy it, click in a Slack message box and paste. Slack says "Table added as an attachment." You can type a message above it before you send.

Other ways to send it

A table block for chat.postMessage, with numbers right-aligned. Bots get the same limits: Slack answered no more than 100 items allowed, no more than 20 items allowed and table_character_count_must_not_exceed_10000 one past each. Empty cells are sent as null, because an empty raw_text is invalid_blocks.

{
  "blocks": [
    {
      "type": "table",
      "rows": [
        [{"type":"rich_text","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"Feature","style":{"bold":true}}]}]},{"type":"rich_text","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"Owner","style":{"bold":true}}]}]},{"type":"rich_text","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"Status","style":{"bold":true}}]}]},{"type":"rich_text","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"Due","style":{"bold":true}}]}]}],
        [{"type":"raw_text","text":"SSO login"},{"type":"raw_text","text":"Priya"},{"type":"raw_text","text":"In review"},{"type":"raw_text","text":"Oct 9"}],
        [{"type":"raw_text","text":"CSV export"},{"type":"raw_text","text":"@sam"},{"type":"raw_text","text":"Blocked on API"},{"type":"raw_text","text":"Oct 14"}],
        [{"type":"rich_text","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"Dark mode "},{"type":"emoji","name":"crescent_moon"}]}]},{"type":"raw_text","text":"Jane"},{"type":"raw_text","text":"Done"},null],
        [{"type":"raw_text","text":"Billing page"},{"type":"raw_text","text":"Luis"},{"type":"raw_text","text":"In progress"},{"type":"raw_text","text":"Oct 20"}]
      ]
    }
  ]
}

How to put a table in a Slack message

  1. Paste your table in the box: cells copied from Excel or Google Sheets, a markdown table from ChatGPT, CSV, JSON, or text lined up with spaces or pipes. The format is detected; change it under Read as if the guess is wrong.
  2. Check the preview. It shows the table the way Slack draws a pasted table: first row in bold, long cells on one line. Click a cell to fix it. Untick First row is a header if your first row is data, and the page adds a header row.
  3. Read the status line. Slack makes a table only from 2 or more rows and columns, up to 20 columns, 100 rows and 10,000 characters. A longer table is split into several tables with the header repeated.
  4. Click Copy table for Slack, click in a Slack message box and paste. Slack shows "Table added as an attachment" and a Table chip. Type a line above it if you like, then send.

Frequently asked questions

How do I make a table in a Slack message?

Paste tab-separated text into the message box. Copying cells from Excel or Google Sheets gives you exactly that, and so does Copy table for Slack on this page. We tested it in Slack for web on 6 October 2026: the box said "Table added as an attachment", showed a Table chip, and the sent message held a real table with the first row in bold. It worked on a Free workspace. The formatting toolbar still has no table button.

Why does my markdown table from ChatGPT show pipes in Slack?

Slack builds a table only from tabs. In our test a markdown table with | and --- pasted as plain text, and so did CSV with commas, a single row, a single column, and rows with different numbers of cells. An HTML table alone pasted nothing. Paste the ChatGPT answer here, and the page turns the pipes into tabs, drops the ** markers, and gives every row the same number of cells.

What are the limits of a table in Slack?

What we measured, last value that worked: 20 columns, 100 rows including the header, and 10,000 characters across all cells. At 21 columns, 101 rows or 10,001 characters Slack says "This table is too big to send as an attachment. Send a snippet instead?" Slack counts characters in UTF-16 units, so an emoji or a rare symbol such as 𝐀 counts 2: 5,000 of them passed, 5,001 did not. You need at least 2 rows and 2 columns, and a message holds one table; a second paste asks "Only 1 table can be attached to each message. Paste as text instead?"

Can a Slack table have bold text, links or mentions?

Not in a pasted table. Slack makes the first row bold and stores every other cell as plain text: in our test <@user>, @channel, a URL, *bold* and `code` all stayed as typed, with no link and no notification. An :emoji: code turned into the emoji. Bold or links in cells copied from Google Sheets were dropped, because Slack reads the plain text copy. A bot can send rich_text cells through the API; the From a bot tab gives you that JSON.

Can I edit a table after I paste it?

Not in Slack. Clicking the Table chip in the message box opens a read-only Table preview, so fix cells here before you copy. A cell can hold a line break: a quoted cell from a spreadsheet, like "line one" and "line two" in one cell, stayed one cell with the break.

How do I send a table from a bot or a webhook?

Use a Block Kit table block. The From a bot tab builds it from your table, with numbers right-aligned. We posted it with chat.postMessage on 6 October 2026. The limits matched the pasted table: Slack answered "no more than 100 items allowed" at 101 rows, "no more than 20 items allowed" at 21 columns and "table_character_count_must_not_exceed_10000" at 10,001 characters. Two traps from the same test: an empty raw_text cell and a null entry in column_settings are both invalid_blocks. Send an empty cell as null and a column with no setting as {}.

Related reading

Slack Green does one thing: it keeps your Slack presence dot green while you are actually working, so a quiet keyboard does not mark you away. Try it free.