Create a Chart from a Data Source and Embed it in Slack

8 min read

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:

  1. One-time sharing — I made a chart and want to share it with my team right now
  2. Recurring delivery — I want this chart posted every Monday morning automatically
  3. 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)

  1. Open your Google Sheet and create a chart from your data range
  2. Click the chart → three-dot menu → Download as PNG
  3. 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)

A Google Sheets chart automatically posted to Slack with AI analysis

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:

  1. Connect your Google Sheet — paste the URL, authorize read access
  2. Select the data range — or pick an existing chart in the sheet
  3. Pick a Slack channel — where your team should see it
  4. Set a schedule — daily, weekly, or custom cron
  5. 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:

  1. Use Connected Sheets (Data → Data connectors → Connect to BigQuery) to pull your query results into a Sheet
  2. Build a chart in that Sheet from the connected data
  3. 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

ScenarioBest approach
One-off chart shareScreenshot + paste
Google Sheets, recurringChartcastr
BigQuery, no codeConnected Sheets → Chartcastr
BigQuery, full controlPython + Slack API
Need AI context with chartChartcastr
Need alerts on thresholdsGrafana / 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

AI-powered follow-up analysis in a Slack thread

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:

  1. Sign up at chartcastr.com
  2. Connect your Google Sheet or BigQuery project
  3. Select your data range and chart type
  4. Choose your Slack channel
  5. 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

Frequently Asked Questions

Was this post helpful?

Google SheetsSlackAI Summaries

Turn your data into automated team updates.

Connect a data source, create charts, and deliver AI-powered insights to Slack or email — in minutes.

No card required. Setup in 2 minutes.

Chartcastr