Data Tables and Charts in Substack: A Complete Guide for Newsletter Writers
Data-driven newsletters are some of the most valuable content on Substack. Readers subscribe specifically for analysis, insights, and numbers they can’t find elsewhere. But presenting data well in Substack is harder than it should be.
Substack’s editor wasn’t designed for data-heavy content. There’s no native table tool, no chart builder, and no spreadsheet integration. Writers who want to include structured data need workarounds — and some workarounds are dramatically better than others.
This guide covers every approach to presenting tables and charts in Substack, from native options to external tools, with practical advice on what works best.
The Core Problem: Substack and Structured Data
Substack’s editor is optimized for prose. It handles paragraphs, headings, images, embeds, links, and blockquotes well. What it doesn’t handle:
- Tables: no native table creation tool
- Charts: no built-in charting capability
- Spreadsheet embeds: no Google Sheets or Excel integration
- Interactive visualizations: no support for embedded JavaScript visualizations
This means every table and chart in your Substack newsletter requires a creative solution. The good news: several approaches work well, and the best ones are easier than you’d expect.
Approach 1: Image-Based Tables
The most reliable method for tables in Substack is converting your table to an image and embedding it.
Why Images Work
- Render identically in email and on the web
- Full control over formatting, colors, and layout
- No email client compatibility issues
- Look professional and polished
How to Create Table Images
Method 1: Screenshot from a spreadsheet
- Build your table in Google Sheets, Excel, or Numbers
- Format it with headers, borders, and colors
- Take a screenshot of the table area
- Upload the screenshot to your Substack post
This works but produces inconsistent quality. Screenshots vary by screen resolution, and you need to crop carefully.
Method 2: Design tool
- Create the table in Figma, Canva, or a similar tool
- Export as PNG at 2x resolution for retina displays
- Upload to Substack
Higher quality but time-consuming for frequent updates.
Method 3: Markdown-to-image conversion
If you write in markdown, tools like DownStack can convert your markdown tables directly to hosted images. You write the table in markdown syntax:
| Metric | Q1 2025 | Q2 2025 | Q3 2025 |
|-----------|---------|---------|---------|
| Revenue | $2.1M | $2.4M | $2.8M |
| Users | 45,000 | 52,000 | 61,000 |
| Churn | 4.2% | 3.8% | 3.5% |
The tool renders it as a clean, formatted image and hosts it. You paste the result into Substack. No screenshots, no design tools, no manual formatting.
Image Table Best Practices
- Resolution: export at 2x for sharp display on retina screens
- Width: keep tables under 600px wide for email compatibility
- Alt text: add descriptive alt text for accessibility (“Q1-Q3 2025 revenue and user growth metrics”)
- Font size: minimum 14px for readability on mobile
- Colors: use sufficient contrast between text and background
- File size: optimize PNGs to keep email load times fast
Approach 2: HTML Tables (Limited)
Substack’s editor doesn’t support HTML input, but there’s a workaround: some writers paste tables from Google Docs or Word, which Substack’s editor sometimes preserves as formatted tables.
How It Works
- Create a table in Google Docs
- Format it with borders and shading
- Copy the table
- Paste into Substack’s editor
The Problems
- Inconsistent rendering: sometimes the table formatting survives the paste, sometimes it doesn’t
- Email rendering: even if the table looks correct in the web editor, email clients may strip the formatting
- No editing: once pasted, you can’t easily edit the table structure in Substack
- Mobile issues: HTML tables in email often break on small screens
This approach is fragile and unreliable. It can work for simple two-column tables, but anything complex is risky.
Approach 3: Text-Based Tables
For simple data, you can format tables using plain text with consistent spacing.
Using Monospace Formatting
Metric Q1 Q2 Q3
Revenue $2.1M $2.4M $2.8M
Users 45K 52K 61K
Churn 4.2% 3.8% 3.5%
Format this as a code block in Substack (using the code block feature) to preserve spacing.
Pros
- Always renders correctly (it’s just text)
- Works in every email client
- Easy to create and update
Cons
- Looks basic and unprofessional for polished publications
- No colors, borders, or visual hierarchy
- Difficult to read with many columns
- Doesn’t scale well for large datasets
Text-based tables work for quick, informal data sharing but aren’t suitable for publications where presentation quality matters.
Approach 4: Embedded Charts
For charts and graphs, you have several options:
Static Chart Images
Create your chart in any tool and export as an image:
- Google Sheets: create chart → right-click → “Save image as”
- Excel: create chart → right-click → “Save as Picture”
- Datawrapper: create chart → export PNG
- Flourish: create visualization → export static image
- Python (matplotlib/seaborn): save figure with
plt.savefig() - R (ggplot2): save with
ggsave()
Static chart images are the most reliable approach. They look the same everywhere.
Datawrapper Embeds
Datawrapper is particularly well-suited for newsletter charts because it offers:
- Clean, minimalist chart styles
- Responsive designs that work on mobile
- Export to static PNG for email reliability
- Embed codes for web versions
Many successful data newsletters (like some financial and political analysis publications) use Datawrapper for their charts.
Flourish Embeds
Flourish creates interactive visualizations. You can embed them in Substack’s web version using the URL embed feature. However, they won’t render in email — subscribers will see a link instead.
For this reason, if you use interactive embeds, always include a static image fallback for email readers.
Best Practices for Data Presentation in Newsletters
Design for Email First
Email is where most of your readers consume your content. Design your data presentations for email constraints:
- Maximum width: 600px — most email clients cap content width here
- Static images over interactive embeds — interactive elements don’t work in email
- High contrast colors — email rendering can slightly alter colors
- Large enough text — readers may be on phones with small screens
Label Everything
Every table and chart should include:
- A descriptive title above the visualization
- Source attribution below (even if it’s your own analysis)
- Units and time periods clearly labeled
- A brief caption explaining what the data shows
Don’t make readers guess what they’re looking at.
Keep Tables Focused
The most common mistake with newsletter tables is including too much data. A 15-column, 30-row spreadsheet dump is overwhelming on a phone screen.
Guidelines:
- 5-7 columns maximum for email readability
- 10-15 rows maximum before the table becomes unwieldy
- Highlight the key row or column that supports your argument
- Split large datasets into multiple focused tables
Use Consistent Formatting
If you publish data regularly, establish conventions:
- Same color scheme for all charts
- Same font and style for all tables
- Same source citation format
- Same placement (e.g., tables always follow the analysis paragraph, not precede it)
Consistency makes your publication feel professional and helps readers parse data quickly across multiple posts.
Provide Context, Not Just Numbers
A table of numbers without context is noise. Always pair data with interpretation:
Weak: [table showing quarterly revenue]
Strong: “Revenue grew 33% over three quarters, accelerating from 14% Q1-Q2 growth to 17% Q2-Q3 growth. The acceleration suggests the pricing change in March is compounding.” [table showing quarterly revenue]
The text gives meaning to the numbers. The table provides evidence for the text.
Building a Data Newsletter Workflow
If data is central to your newsletter, invest in a repeatable workflow:
Weekly Data Newsletter Workflow
- Collect data — pull from your sources (APIs, spreadsheets, databases)
- Analyze — do your analysis in your preferred tool (Excel, Python, R, etc.)
- Draft in markdown — write your analysis with markdown table syntax for quick iteration
- Convert tables to images — use DownStack or your preferred tool to generate clean table images
- Create charts — export from your charting tool as static PNGs
- Compose in Substack — paste your text, insert images, add captions
- Preview and test — send a test email to check rendering across clients
- Publish — send to subscribers
Tool Recommendations
| Need | Recommended Tool |
|---|---|
| Simple tables | DownStack (markdown → image) |
| Complex charts | Datawrapper or Google Sheets |
| Statistical visualizations | Python + matplotlib |
| Interactive dashboards (web only) | Flourish |
| Quick screenshots | CleanShot X or ShareX |
Common Mistakes
Mistake 1: Relying on Interactive Embeds
Interactive charts and widgets don’t render in email. Your email subscribers — often the majority of your audience — will see a broken embed or a plain link. Always have a static image fallback.
Mistake 2: Embedding Huge Images
A 2MB chart image slows email loading and may get clipped by Gmail (which truncates emails over ~102KB). Optimize your images:
- Use PNG for charts and tables (sharp lines, small file size)
- Compress with tools like TinyPNG or ImageOptim
- Keep total email size under 80KB if possible (excluding images loaded externally)
Mistake 3: No Mobile Testing
Over 60% of email opens happen on mobile devices. A table that looks great on desktop may be unreadable on a phone. Always preview on mobile before publishing.
Mistake 4: Forgetting Alt Text
Image-based tables are invisible to screen readers. Add descriptive alt text that summarizes the data for accessibility. This also helps when images fail to load (corporate email filters sometimes block external images).
Mistake 5: Data Without Narrative
A newsletter isn’t a spreadsheet. Every data point should serve a narrative purpose. If you include a table, explain what it means. If you include a chart, tell readers what to notice. Data is evidence for your argument, not the argument itself.
The Markdown Writer’s Advantage
Writers who draft in markdown have a natural advantage for data-heavy newsletters. Markdown table syntax is fast to write and easy to iterate on:
| Company | Revenue | Growth |
|---------|---------|--------|
| Alpha | $4.2M | +18% |
| Beta | $3.1M | +12% |
| Gamma | $2.8M | +25% |
Editing a markdown table is as simple as changing text. No clicking through menus, no drag-and-drop formatting, no broken layouts.
With DownStack, you write your entire post — including tables — in markdown, and the tables are automatically converted to cleanly formatted, hosted images ready for Substack. The text becomes Substack-ready rich text; the tables become embedded images. It’s the fastest workflow for data-heavy newsletters.
Key Takeaways
- Substack has no native table or chart tools — you need workarounds
- Image-based tables are the most reliable approach (consistent in email and web)
- Markdown-to-image tools like DownStack streamline the table creation workflow
- Static chart images are safer than interactive embeds for email delivery
- Design for email first: 600px max width, high contrast, large text
- Keep tables focused: 5-7 columns, 10-15 rows maximum
- Always provide context — data without narrative is just noise
- Establish a consistent visual style for your data presentations
- Test on mobile before every publish
- Add alt text to all image-based tables and charts for accessibility