BigQuery Connected Sheets to Slack: Step-by-Step Setup
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, notsum_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
- Open a new Google Sheet.
- 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.
- Select your GCP project.
- Choose Custom query (rather than browsing tables — it gives you more control).
- Paste your SQL, or reference your view:
SELECT * FROM `your-project.reporting.weekly_revenue_by_channel` ORDER BY week_start DESC - 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
- In Chartcastr, go to Sources → Add source → Google Sheets.
- Authenticate with your Google account.
- Paste the URL of the Google Sheet you just set up.
- Select the tab containing the connected data range (
bq_weekly_revenue). - Chartcastr detects your columns and asks you to confirm the data range.
- 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
- In Chartcastr, go to Connections → New connection.
- Select the Google Sheets source you just added.
- Choose your Slack channel. This is where the chart will be posted.
- Preview the chart — check that the columns and chart type look right.
- Set your schedule: daily, weekly (e.g. every Monday 8:30am), or a custom cadence.
- 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:
- Chart image — a clean bar, line, or area chart rendered from your connected data.
- AI summary — a plain-English explanation of what changed since the last delivery: which channels grew, which contracted, notable week-over-week shifts.
- 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
- BigQuery Scheduled Queries → Slack: Automate Your Weekly Data Pulse — the scheduled query alternative to Connected Sheets
- SQL Views as a Reporting Layer: BigQuery to Slack — designing views that make great Slack charts
- Create a Chart from BigQuery and Post it to Slack — full comparison including Python and direct BQ approaches
- Turn Your BigQuery Views into Slack Reports — use case overview with step-by-step guide






