BigQuery Connected Sheets to Slack: Step-by-Step Setup

6 min read

A practical walkthrough of connecting BigQuery to Google Sheets using the Data Connector, then delivering those results to Slack automatically with Chartcastr — no Python, no Cloud Functions.

BigQuery Connected Sheets to Slack: Step-by-Step Setup

BigQuery Connected Sheets is the least-friction path to get BigQuery data into a format that Chartcastr can deliver to Slack. No Python. No Cloud Functions. No export pipelines. You write a SQL query in a spreadsheet, and Chartcastr handles the rest.

This guide walks through the full setup — from an empty Google Sheet to a scheduled Slack pulse — in under 30 minutes.


What You're Building

BigQuery SQL view
       ↓
Google Sheets (Connected Sheets / Data Connector)
       ↓
Chartcastr source
       ↓
Slack channel — scheduled chart + AI summary

The Connected Sheet acts as a thin bridge between BigQuery and Chartcastr. Chartcastr reads from the sheet, renders the data as a chart, and posts to Slack on your schedule with an AI-written summary of what changed.


Prerequisites

  • A BigQuery project with a dataset you want to report on
  • A Google account with read access to that dataset
  • A Chartcastr account (free tier works)
  • Chartcastr connected to your Slack workspace

Step 1: Create Your BigQuery View

Before connecting to Sheets, shape your data into a clean, reportable format. The SQL view is the right place to do aggregations, filters, and date logic — not in the spreadsheet.

Good practices for reporting views:

  • Use human-readable column names (weekly_revenue, not sum_rev_usd_7d)
  • Pre-aggregate to the granularity you want to display (week, month)
  • Include a date column for time series
  • Filter to a meaningful rolling window
-- Example: weekly revenue by channel, last 16 weeks
CREATE OR REPLACE VIEW `your-project.reporting.weekly_revenue_by_channel` AS
SELECT
  DATE_TRUNC(order_date, WEEK(MONDAY)) AS week_start,
  channel,
  COUNT(DISTINCT order_id)             AS order_count,
  ROUND(SUM(revenue_usd), 2)           AS revenue_usd,
  ROUND(SUM(revenue_usd) / NULLIF(COUNT(DISTINCT order_id), 0), 2) AS avg_order_value
FROM `your-project.sales.orders`
WHERE
  order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 16 WEEK)
  AND status NOT IN ('cancelled', 'refunded')
GROUP BY 1, 2
ORDER BY 1 DESC, 3 DESC

Test the view in the BigQuery Console before connecting it to Sheets. Confirm the columns look right and the row count is reasonable (a few hundred rows is ideal — Connected Sheets can handle thousands, but smaller is faster and cheaper to query).


Step 2: Connect BigQuery to Google Sheets

  1. Open a new Google Sheet.
  2. Go to Data → Data connectors → Connect to BigQuery.
    • If you don't see this option, check that BigQuery Data Connector is enabled in your Google Workspace admin console.
  3. Select your GCP project.
  4. Choose Custom query (rather than browsing tables — it gives you more control).
  5. Paste your SQL, or reference your view:
    SELECT * FROM `your-project.reporting.weekly_revenue_by_channel`
    ORDER BY week_start DESC
    
  6. Click Connect.

Sheets runs the query and places results in a connected range starting at cell A1. You'll see a small "Connected to BigQuery" badge in the top-left of the range.

Name and organise your sheet

  • Rename the tab to something descriptive: bq_weekly_revenue
  • In a separate tab, you can build formatting or pivot tables on top of the connected range without affecting the connector

Refresh behaviour

Connected Sheets results are cached. To get fresh data:

  • Click the Refresh icon next to the connected range
  • Or use Data → Data connectors → Manage → Refresh now

Chartcastr will trigger a refresh before each pulse run, so your Slack posts always reflect current BigQuery data.


Step 3: Connect the Sheet to Chartcastr

  1. In Chartcastr, go to Sources → Add source → Google Sheets.
  2. Authenticate with your Google account.
  3. Paste the URL of the Google Sheet you just set up.
  4. Select the tab containing the connected data range (bq_weekly_revenue).
  5. Chartcastr detects your columns and asks you to confirm the data range.
  6. Save the source.

Chartcastr reads your data, detects the numeric and date columns, and suggests a chart type. For a weekly time series with a category breakdown (week, channel, revenue), it'll default to a grouped bar or stacked bar chart.


Step 4: Set Up the Slack Connection

  1. In Chartcastr, go to Connections → New connection.
  2. Select the Google Sheets source you just added.
  3. Choose your Slack channel. This is where the chart will be posted.
  4. Preview the chart — check that the columns and chart type look right.
  5. Set your schedule: daily, weekly (e.g. every Monday 8:30am), or a custom cadence.
  6. Activate the connection.

Your first pulse will be delivered at the next scheduled time.


What the Pulse Looks Like

Each Chartcastr pulse to Slack includes:

  1. Chart image — a clean bar, line, or area chart rendered from your connected data.
  2. AI summary — a plain-English explanation of what changed since the last delivery: which channels grew, which contracted, notable week-over-week shifts.
  3. Thread Q&A — your team can reply in the thread to ask follow-up questions; Chartcastr answers against the current data.

Common Report Configurations

Different teams use slightly different query patterns for their Connected Sheets sources. Here are three proven setups:

Marketing: Weekly channel performance

SELECT
  DATE_TRUNC(date, WEEK(MONDAY)) AS week_start,
  channel,
  SUM(sessions)     AS sessions,
  SUM(conversions)  AS conversions,
  SUM(revenue_usd)  AS revenue
FROM `your-project.marketing.attribution`
WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 12 WEEK)
GROUP BY 1, 2
ORDER BY 1 DESC, 4 DESC

Pulse cadence: every Monday at 9am. Posted to #marketing-weekly.

Finance: Monthly P&L summary

SELECT
  DATE_TRUNC(transaction_date, MONTH) AS month,
  account_category,
  SUM(amount_usd) AS net_amount
FROM `your-project.finance.gl_entries`
WHERE
  transaction_date >= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH), MONTH)
GROUP BY 1, 2
ORDER BY 1 DESC, 2

Pulse cadence: first Monday of each month. Posted to #finance-leads.

Product: Daily active users

SELECT
  event_date,
  COUNT(DISTINCT user_id) AS dau
FROM `your-project.analytics.events`
WHERE
  event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
  AND event_name = 'session_start'
GROUP BY 1
ORDER BY 1

Pulse cadence: daily at 10am. Posted to #product-metrics.


Troubleshooting

The Connected Sheets range is empty after connecting The query may have returned zero rows for the date range. Check your WHERE clause — particularly the interval used for date filtering.

Chartcastr shows "no data" when I add the source Confirm the tab name in Chartcastr matches exactly the tab name in your sheet (case-sensitive). Also check that the connected range starts at A1 with headers in row 1.

Data in Slack looks stale Connected Sheets caches results. Chartcastr triggers a refresh before delivery, but if your GCP project has query quota limits, the refresh may time out. Consider writing results to a native BigQuery table with a Scheduled Query and reading from that instead — see BigQuery Scheduled Queries → Slack Reporting.


Related Reading

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 3 minutes.

Chartcastr