Create a Chart from a Data Source and Embed it in Slack
A complete guide to creating charts from any data source — Google Sheets, BigQuery, CSV, or databases — and embedding them directly in Slack channels automatically.
Create a Chart from a Data Source and Embed it in Slack
Your data is in a spreadsheet, a data warehouse, or a BI tool. Your team is in Slack. The gap between those two facts is where most reporting workflows fall apart.
This guide covers every way to bridge that gap — from the fully manual approach all the way to fully automated delivery — across the most common data sources.
The Hard Truth: Slack Only Embeds Images
Before diving in, it's worth being direct about what Slack actually supports — because a lot of people search for "embed chart in Slack" expecting something that doesn't exist.
Slack does not support:
- Live embedded charts (no iframes, no HTML widgets)
- Interactive visualisations (no Plotly, no D3, no Highcharts, no Google Charts)
- Dashboard embeds from Looker, Tableau, Grafana, or Google Data Studio
- Live-updating data panels of any kind
Slack does support:
- Inline image previews for PNG, JPG, and GIF files posted to a channel
- File uploads that appear as visual previews
- Image URLs in Block Kit message layouts — but these are still static images
- Link unfurling — which shows a small thumbnail preview, not an interactive chart
When a BI tool claims to "integrate with Slack," what it almost always means is: it generates a PNG of your chart and uploads it via the Slack API. That's the only mechanism available. The question is just how much manual work is involved in making that happen on a schedule.
The right mental model: think of it as scheduled chart delivery, not embedding. The chart lives in your data source, gets rendered to an image on each run, and lands in Slack where your team can see it without leaving the app.
What "Embed a Chart in Slack" Actually Means
When someone searches for this, they usually mean one of three things:
- One-time sharing — I made a chart and want to share it with my team right now
- Recurring delivery — I want this chart posted every Monday morning automatically
- Alert-based posting — I want a chart posted when a metric crosses a threshold
The tools and approaches differ significantly for each. This guide covers all three, with the focus on #2 since that's where most teams find the biggest leverage. For a deeper look at the push vs pull model, see Slack vs. Dashboards: Why the Best Data Teams Push, Not Pull.
Method 1: Google Sheets → Slack
Google Sheets is the most common data source for this workflow. For a complete dedicated walkthrough, see Create a Chart from Google Sheets and Post it to Slack. Here are your options from least to most automated:
Manual (copy/paste or screenshot)
- Open your Google Sheet and create a chart from your data range
- Click the chart → three-dot menu → Download as PNG
- Drag the image into Slack
Works fine for one-off sharing. Completely unsustainable for anything recurring. For the full cost breakdown of why this approach quietly drains team time, see Why You Shouldn't Screenshot Google Sheets Charts.
Apps Script + Slack Webhook (DIY)
Google Apps Script can automate chart exports and post them to a Slack webhook on a schedule. It requires writing JavaScript, setting up a Slack incoming webhook, and debugging Drive permissions — but it's free and self-contained.
function sendChartToSlack() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sales')
const charts = sheet.getCharts()
const chart = charts[0]
const imageBlob = chart.getAs('image/png')
const file = DriveApp.createFile(imageBlob).setName('chart.png')
const webhookUrl = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
UrlFetchApp.fetch(webhookUrl, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({
text: 'Weekly Sales Update',
attachments: [{ image_url: file.getDownloadUrl() }],
}),
})
}
The catch: Slack deprecated image attachments in older API formats, Drive share links have auth friction, and this breaks every time your sheet structure changes. Most teams abandon it within a month. See Why Google Sheets App Scripts Are Too Complicated for Sending Data to Slack for the full breakdown.
Chartcastr (automated, no code)

Chartcastr connects directly to your Google Sheet, renders the chart from your data range, and posts it to Slack on your schedule. The setup takes about 2 minutes:
- Connect your Google Sheet — paste the URL, authorize read access
- Select the data range — or pick an existing chart in the sheet
- Pick a Slack channel — where your team should see it
- Set a schedule — daily, weekly, or custom cron
- Done — Chartcastr handles the rest on every run
Each post includes the chart image plus an AI-written summary that explains what changed, what's trending, and what the team should pay attention to.
Method 2: BigQuery → Slack
BigQuery data requires a rendering step before it can become a Slack chart, since BQ outputs rows not images. For a complete walkthrough with Cloud Run deployment, see Create a Chart from BigQuery and Post it to Slack.
Option A: BigQuery → Google Sheets → Slack
The most practical no-code path:
- Use Connected Sheets (Data → Data connectors → Connect to BigQuery) to pull your query results into a Sheet
- Build a chart in that Sheet from the connected data
- Connect the Sheet to Chartcastr and post to Slack on schedule
The Sheet acts as a rendering layer — BigQuery crunches the numbers, Sheets visualises them, Chartcastr delivers them. For the BQ + Sheets setup steps, see Best Tool to Load Google Sheets to BigQuery (2025/2026 Guide).
Option B: Python (pandas + matplotlib + Slack API)
For engineers who want full control over the chart appearance:
import pandas as pd
import matplotlib.pyplot as plt
from google.cloud import bigquery
from slack_sdk import WebClient
import io
# Query BigQuery
client = bigquery.Client()
query = """
SELECT DATE_TRUNC(date, WEEK) AS week, SUM(revenue) AS revenue
FROM `project.dataset.orders`
WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 12 WEEK)
GROUP BY 1 ORDER BY 1
"""
df = client.query(query).to_dataframe()
# Render chart
fig, ax = plt.subplots(figsize=(10, 5))
ax.bar(df['week'].astype(str), df['revenue'])
ax.set_title('Weekly Revenue (Last 12 Weeks)')
ax.tick_params(axis='x', rotation=45)
plt.tight_layout()
# Upload to Slack
buf = io.BytesIO()
fig.savefig(buf, format='png', dpi=150)
buf.seek(0)
slack = WebClient(token='xoxb-your-bot-token')
slack.files_upload_v2(
channel='#data-team',
file=buf.getvalue(),
filename='weekly-revenue.png',
initial_comment='Weekly Revenue Update'
)
This gives you full flexibility — custom colours, annotations, multi-panel charts. The trade-off is maintenance: schema changes, auth rotation, and dependency upgrades all land on you.
Option C: Chartcastr with BigQuery source
Chartcastr supports BigQuery as a direct source. Connect your GCP project, write or select a query, and Chartcastr handles the chart rendering and Slack delivery on schedule — no Python, no infrastructure.
Method 3: CSV or File Data → Slack
For data that doesn't live in a live system — exports from Stripe, HubSpot, Shopify, or any tool that lets you download a CSV:
Quick approach: paste into Google Sheets
Drop the CSV into a Google Sheet, build your chart, connect to Chartcastr. This turns any one-time export into a recurring automated report if you refresh the data periodically.
Automated approach: Notion, Airtable, or other databases
Many modern databases (Notion, Airtable, Linear) expose their data via API or have native Chartcastr integrations. Connect directly rather than going through a CSV export step.
Choosing the Right Approach
| Scenario | Best approach |
|---|---|
| One-off chart share | Screenshot + paste |
| Google Sheets, recurring | Chartcastr |
| BigQuery, no code | Connected Sheets → Chartcastr |
| BigQuery, full control | Python + Slack API |
| Need AI context with chart | Chartcastr |
| Need alerts on thresholds | Grafana / PagerDuty for ops; Chartcastr for business KPIs |
What a Good Slack Chart Post Looks Like
A chart image alone is only half the job. The best Slack chart posts include:
- The chart image — high resolution, clearly labelled axes, clean design
- A one-line headline — what this chart is showing and for what period
- A short AI summary — what moved, by how much, and why it matters
- A thread — for follow-up questions or drill-down discussion

Chartcastr generates all of this automatically. The AI summary is written from the actual data in each run, so it's always specific — not a generic template.
The 2-Minute Setup with Chartcastr
If you have a Google Sheet or BigQuery data source and a Slack workspace, you can have your first automated chart delivery running today:
- Sign up at chartcastr.com
- Connect your Google Sheet or BigQuery project
- Select your data range and chart type
- Choose your Slack channel
- Set a delivery schedule
That's it. Your team gets a clean, context-rich chart in Slack on autopilot — no screenshots, no manual exports, no broken scripts.
Set up your first chart delivery for free →
Related Posts
- Create a Chart from Google Sheets and Post it to Slack
- Create a Chart from BigQuery and Post it to Slack
- Connect Your Google Sheets Charts to Slack Automatically
- Best Tool to Load Google Sheets to BigQuery (2025/2026)
- Why Google Sheets App Scripts Are Too Complicated for Slack
- Top 10 Ways to Send Automated Data Pulses to Slack
- Slack vs. Dashboards: Why the Best Data Teams Push, Not Pull