How to Format Tables in Substack (Without Breaking Your Layout)
If you’ve ever tried pasting a table into Substack, you know the frustration. The columns misalign, the borders vanish, and what looked perfect in your editor turns into an unreadable mess in your subscriber’s inbox.
Tables are one of the most requested features in Substack’s community forums, and for good reason. Data-driven newsletters — covering finance, technology, sports analytics, or product comparisons — rely on tabular data to communicate clearly. Yet Substack’s editor has never offered native table support.
This guide covers every practical method for getting clean, professional tables into your Substack posts, from quick workarounds to automated solutions.
Why Tables Break in Substack
Substack’s editor is built for prose. It handles headings, bold, italic, links, images, blockquotes, and code blocks beautifully. But it does not render HTML tables, and there is no table insertion tool in the editor toolbar.
Even if you write raw HTML table markup, Substack strips it during publishing. The platform sanitizes HTML to ensure consistent rendering across email clients — and tables are one of the casualties.
This isn’t unique to Substack. Email rendering is notoriously inconsistent. Gmail, Apple Mail, Outlook, and Yahoo Mail all interpret HTML tables differently. By stripping tables, Substack avoids a class of rendering bugs that would make newsletters look broken for large portions of readers.
The result: writers need workarounds.
Method 1: Screenshots and Manual Images
The simplest approach is to create your table in another application and screenshot it.
How It Works
- Build your table in Google Sheets, Excel, Notion, or any spreadsheet tool
- Style it with clear headers, consistent alignment, and readable font sizes
- Take a screenshot (or export as an image)
- Upload the image to your Substack post
Pros and Cons
This method works in a pinch, but it has real drawbacks:
- Image quality varies — screenshots on different screens produce different resolutions
- No accessibility — screen readers cannot parse text in images
- Tedious at scale — if you publish tables weekly, the screenshot workflow adds up
- Updates require re-screenshotting — change one number, redo the whole process
- File size — unoptimized screenshots can bloat your email’s loading time
For a one-off table, screenshots are fine. For regular use, you need something better.
Method 2: Plain Text Tables
You can approximate a table using monospace formatting inside a code block.
Company | Revenue | Growth
------------|----------|-------
Apple | $394B | +8%
Microsoft | $245B | +12%
Google | $307B | +14%
In Substack, you can insert this as a code block, and the monospace font will keep columns roughly aligned.
Limitations
- Columns break if any cell content is significantly longer than others
- Code blocks use a dark or grey background, which may not match your newsletter aesthetic
- No header styling — everything looks the same
- Mobile rendering can force horizontal scrolling
This works for quick, simple data. For anything polished, it falls short.
Method 3: Tables as Hosted Images (The Reliable Approach)
The most reliable method is rendering your table as a styled image and hosting it on a permanent URL. This is what professional data-driven newsletters use.
Why This Works
- Consistent rendering — an image looks identical in every email client
- Full styling control — headers, borders, colors, fonts all render exactly as designed
- Permanent hosting — the image URL never expires, so older posts always display correctly
- Mobile friendly — images scale responsively in Substack
The Manual Process
- Write your table in markdown or HTML
- Render it in a browser with your preferred styling
- Capture it as a PNG image
- Upload it to an image host (Imgur, Cloudflare R2, S3, etc.)
- Insert the image URL into your Substack post
This process produces great results but involves multiple steps and tools.
The Automated Process with DownStack
DownStack automates this entire pipeline. You write your table in markdown:
| Company | Revenue | Growth |
|-----------|---------|--------|
| Apple | $394B | +8% |
| Microsoft | $245B | +12% |
| Google | $307B | +14% |
DownStack detects tables in your markdown, renders them as clean, styled images, uploads them to a permanent CDN, and gives you Substack-ready rich text with the table images embedded. One click, and you’re done.
Markdown Table Syntax Reference
If you draft in markdown (or plan to use a tool like DownStack), here’s the complete syntax:
Basic Table
| Header 1 | Header 2 | Header 3 |
|----------|----------|----------|
| Cell 1 | Cell 2 | Cell 3 |
| Cell 4 | Cell 5 | Cell 6 |
Column Alignment
Use colons in the separator row to control alignment:
| Left Aligned | Center Aligned | Right Aligned |
|:-------------|:--------------:|--------------:|
| Text | Text | Text |
| More text | More text | More text |
:---aligns left (default):---:centers---:aligns right
Right alignment is especially useful for numerical data like prices, percentages, and counts.
Formatting Inside Cells
You can use inline markdown within table cells:
| Feature | Status |
|----------------|------------------|
| **Bold text** | ~~Strikethrough~~ |
| *Italic text* | `inline code` |
| [A link](url) | Regular text |
Design Tips for Newsletter Tables
Whether you’re screenshotting a spreadsheet or using an automated tool, these design principles make tables more readable:
Keep It Narrow
Email viewports are narrow — especially on mobile. Aim for 3-4 columns maximum. If your data needs more columns, consider splitting it into multiple tables or restructuring as a list.
Use Clear Headers
Bold headers with a distinct background color (even a subtle grey) make the table scannable. Readers should instantly understand what each column contains.
Right-Align Numbers
Financial data, percentages, and counts should be right-aligned so decimal points and digits line up vertically. This is a small detail that dramatically improves readability.
Add Context
Always include a brief caption or introductory sentence before the table. Don’t drop a table into your post without explanation — tell readers what they’re looking at and why it matters.
Consider Row Shading
Alternating row colors (zebra striping) help readers track across wide tables. If your method supports it, a very subtle alternating background improves legibility.
Choosing the Right Method
The best approach depends on your publishing frequency and content type:
Occasional tables (monthly or less): Screenshots from Google Sheets or Notion work fine. The manual effort is manageable.
Regular tables (weekly): The table-as-image approach, either manual or automated, is worth the setup. Consistency matters when readers expect data every issue.
Data-heavy newsletters (daily or multiple tables per issue): Automation becomes essential. Writing tables in markdown and using a tool like DownStack to handle rendering and hosting saves significant time per issue.
Accessibility Considerations
Tables rendered as images present an accessibility challenge: screen readers cannot parse the data. To mitigate this:
- Always include descriptive alt text for table images
- Summarize key data points in the surrounding prose
- Consider linking to a web version of the post where the full data is available in text form
Substack automatically generates a web version of every post, so you can direct readers who need accessible data to the web link.
Key Takeaways
- Substack does not support native HTML tables — the editor strips them during publishing
- Screenshots work for occasional use but don’t scale well
- Plain text tables in code blocks work for simple data but lack visual polish
- The table-as-image approach (render as PNG, host permanently) is the most reliable method across all email clients
- Markdown table syntax is straightforward and works with automation tools
- Design tables for narrow viewports: 3-4 columns max, clear headers, right-aligned numbers
- Always provide alt text and prose summaries for accessibility
- For regular publishing, automating the table-to-image pipeline saves meaningful time each issue