How to Post Weekly Team Metrics to Slack with OpenClaw in Paradime
Feb 26, 2026
Automate Weekly Metrics Delivery to Slack with Paradime, OpenClaw, and Google Sheets
Stop manually pulling numbers every Friday. Wire up a Paradime + OpenClaw pipeline that reads your metrics spreadsheet, calculates week-over-week trends, and drops a formatted summary into Slack — on autopilot.
What Is Paradime?
Paradime is the all-in-one, AI-native data platform that replaces dbt Cloud™. It gives fast-moving data teams a single pane of glass to code, ship, fix, and scale data pipelines for analytics and AI. Three pillars matter for this guide:
Pillar | What It Does |
|---|---|
Code IDE | AI-assisted dbt™ and Python development with DinoAI, lineage, and live data samples |
Bolt | Production-grade dbt™ orchestration — cron schedules, CI/CD, Slack/Teams notifications, and environment-variable management — all through a UI |
Radar | FinOps dashboard that surfaces Snowflake and BigQuery cost outliers before your CFO does |
Paradime is SOC 2 Type II certified, GDPR & CCPA compliant, and guarantees 99.9% uptime, so your credentials and pipeline state are locked down from day one.
Why does this matter here? Bolt is the scheduler that will fire our metrics script every Friday at 5 PM, and its UI-driven environment-variable vault is where sensitive keys live — no
.envfiles scattered across laptops.
What Is OpenClaw?
OpenClaw is an open-source AI agent runtime that runs locally on your hardware and orchestrates tasks across chat apps, files, the web, and your operating system. It is not an LLM — it connects to models like Claude or GPT via API and uses skills and cron jobs to act.
Key concepts:
Gateway — the always-on daemon that manages agent sessions, cron jobs, and channel routing.
Skills — installable plugins (Google Sheets, Slack, GitHub, etc.) that give the agent tool access.
Cron Jobs — built-in scheduler with
at,every, andcronschedule types, plus delivery targets (Slack channel, webhook, etc.).
OpenClaw's local-first model means your Google credentials JSON and Slack tokens never leave your machine — a meaningful security win over cloud-hosted agent platforms.
Architecture Overview
Before diving into code, here is the end-to-end flow:
Figure 1: End-to-end flow — Bolt triggers OpenClaw, which reads Google Sheets, crunches numbers, and posts to Slack.
Setup: openclaw-sdk + Google Sheets API + Slack SDK
Prerequisites
Tool | Version | Install |
|---|---|---|
Node.js | ≥ 22 | |
OpenClaw | latest |
|
Python | ≥ 3.10 | |
gspread | latest |
|
slack_sdk | latest |
|
1. Install and Configure OpenClaw
During onboarding, choose your preferred LLM provider (Anthropic, OpenAI, or OpenRouter) and paste in your API key. OpenClaw stores the key in ~/.openclaw/openclaw.json:
2. Install the Google Sheets Skill
Then authenticate:
This launches the OAuth flow. Once complete, tokens are stored locally — never shipped to a third-party server.
Tip: For headless / CI environments, use a GCP service-account JSON key instead of the OAuth flow. Drop the key file at a secure path and reference it via the
GOOGLE_CREDENTIALS_JSONenv var.
3. Set Up Your Slack App
Head to api.slack.com/apps and create a new app. Add these Bot Token Scopes:
channels:joinchannels:readchat:writefiles:writeusers:read
Install the app to your workspace, copy the Bot User OAuth Token (xoxb-...), and enable Socket Mode (grab the App-Level Token xapp-...).
Wire both tokens into OpenClaw:
Or set them as environment variables:
Environment Variables
Three secrets power this pipeline. Here is where each one lives and what it does:
Variable | Purpose | Where to Store |
|---|---|---|
| Service-account key for Google Sheets API access | Paradime Bolt env vars or |
| Bot token for posting messages to Slack | Paradime Bolt env vars or OpenClaw config |
| API key for the LLM provider OpenClaw connects to |
|
Storing Secrets in Paradime Bolt
Paradime's UI-driven vault is the cleanest option for production:
Open Settings → Workspaces → Environment Variables.
In the Bolt Schedules section, click Add New.
Enter the key name (e.g.,
GOOGLE_CREDENTIALS_JSON) and paste the value.Hit the 💾 save icon.
Figure 2: Adding environment variables through the Paradime UI — no config files, no drift.
These variables are available to every Bolt schedule by default, but you can override them per-schedule when staging and production need different credentials.
Storing Secrets in OpenClaw
OpenClaw uses a layered precedence model (highest → lowest):
Process environment (parent shell / daemon)
.envin current working directoryGlobal
.envat~/.openclaw/.envConfig
envblock in~/.openclaw/openclaw.json
Security note: OpenClaw never overrides an existing env var. If you set
SLACK_BOT_TOKENin your shell, the.envfile will not clobber it. This protects against accidental credential leaks in shared environments.
The Script: Read Metrics, Calculate Trends, Post to Slack
Here is a complete Python script that does the heavy lifting. Save it as weekly_metrics.py in your dbt™ project repo:
How the Script Works
Figure 3: Script execution flow — authenticate, read, compute, format, post.
The script is intentionally framework-free. It uses gspread for Sheets, slack_sdk for Slack, and standard-library JSON/os — nothing else. This keeps the dependency footprint tiny and makes debugging straightforward.
Bolt Schedule: Cron Every Friday at 5 PM
Option A: UI-Driven Schedule (Recommended)
Navigate to Bolt → Schedules → Create Schedule.
Set the Schedule Type to Standard.
Under Commands, add:
Under Trigger, choose Scheduled Run and enter the cron expression:
Set Timezone to your team's local timezone (e.g.,
America/New_York).Under Notifications, add your Slack channel so you get alerted if the schedule itself fails.
Click Save.
Pro tip: Validate your cron expression at crontab.guru before saving.
Option B: Schedules as Code (YAML)
If you prefer version-controlled schedules, add this to your paradime_schedules.yml:
Paradime scans for changes to this file every 10 minutes, or you can trigger a manual parse from the Bolt UI.
Option C: OpenClaw Cron Job
If you want OpenClaw itself to be the scheduler (instead of Bolt), create a cron job via the gateway:
When to pick which: Use Bolt when the script lives inside your dbt™ project and you want unified observability across all your dbt™ runs. Use OpenClaw cron when the agent needs to reason about the output (e.g., add commentary, flag anomalies) before posting.
Connecting dbt™ to the Picture
You might wonder: "Where does dbt™ fit in?" Great question. The metrics in your Google Sheet likely originate from dbt™ models running in your warehouse. A typical pattern looks like this:
Figure 4: dbt™ models feed the warehouse, a sync job pushes KPIs to Google Sheets, and our script delivers the summary to Slack.
If you're using Paradime's Code IDE, you can validate those models with dbt™-llm-evals for AI-generated content. A quick setup looks like this:
This gives you warehouse-native evaluation of any AI-generated content your pipelines produce — a nice complement to the metrics delivery pipeline we're building here.
Monitoring and Debugging
Bolt Run History
After your first Friday run, head to Bolt → Schedules → weekly-metrics-to-slack and click into the run. You'll see:
Status: passed / failed / running
Logs: full stdout/stderr from the Python script
Duration: how long the run took
DinoAI Debugging: if a run fails, Paradime's AI assistant can analyze the error and suggest a fix directly in the UI
OpenClaw Gateway Logs
If you're using OpenClaw as the scheduler, check the gateway logs:
Or tail the log file directly:
Slack Delivery Verification
Add a simple health check to the end of your script:
Monitoring Checklist
Figure 5: Monitoring decision tree — follow the arrows to diagnose failures fast.
Troubleshooting Common Issues
🔴 google.auth.exceptions.DefaultCredentialsError
Cause: The GOOGLE_CREDENTIALS_JSON env var is missing or contains malformed JSON.
Fix:
Verify the variable exists in Bolt: Settings → Workspaces → Environment Variables → Bolt Schedules.
Ensure the value is the entire JSON key (not a file path).
Test locally:
🔴 slack_sdk.errors.SlackApiError: not_in_channel
Cause: The Slack bot hasn't been added to the target channel.
Fix:
Open the Slack channel → click the channel name → Integrations → Add apps.
Find your bot and add it.
Alternatively, grant the
channels:joinscope and callclient.conversations_join(channel=SLACK_CHANNEL)in your script.
🔴 gspread.exceptions.SpreadsheetNotFound
Cause: The service account email doesn't have access to the spreadsheet.
Fix:
Open the Google Sheet → Share → paste the service account email (found in your credentials JSON under
client_email).Grant Viewer access (read-only is sufficient).
🔴 ValueError: Need at least two weeks of data
Cause: Your spreadsheet has fewer than two data rows.
Fix: Ensure at least two weeks of metrics are present. The script reads the last two rows to compute deltas.
🔴 OpenClaw Cron Job Fires but No Slack Message Appears
Cause: The delivery.to channel ID is wrong, or the bot token lacks chat:write scope.
Fix:
Get the correct channel ID: right-click the channel in Slack → View channel details → copy the ID at the bottom.
Verify bot scopes at api.slack.com/apps → OAuth & Permissions.
🔴 Bolt Schedule Shows "Suspended"
Cause: The paradime_schedules.yml has suspended: true, or the schedule was manually suspended in the UI.
Fix:
In YAML: set
suspended: false(or remove the key entirely).In UI: navigate to the schedule and toggle it back to active.
Wrapping Up
Here's what we built:
A Python script (
weekly_metrics.py) that authenticates with Google Sheets, reads the last two weeks of KPIs, computes week-over-week deltas with trend indicators, and posts a rich Block Kit summary to Slack.A Paradime Bolt schedule that fires the script every Friday at 5 PM using a simple cron expression (
0 17 * * 5) — with environment variables managed through a secure, UI-driven vault instead of scattered.envfiles.An OpenClaw integration that connects Slack as a delivery channel, handles Google Sheets authentication through its skills system, and optionally serves as an alternative scheduler with built-in agent reasoning.
Figure 6: The complete stack — secrets management, scheduling, execution, and delivery.
The entire setup takes about 30 minutes. No Airflow DAGs, no Lambda functions, no Docker containers. Just a Python script, a UI-configured schedule, and secrets that stay where they belong.
What to explore next:
Add Paradime Slack notifications to alert on dbt™ test failures alongside your metrics summary.
Use dbt™-llm-evals to evaluate AI-generated content in your warehouse.
Extend the OpenClaw agent to comment on anomalies (e.g., "Revenue dropped 15% — that's the steepest weekly decline this quarter") before posting.
Explore Paradime Radar to keep your warehouse costs in check as pipeline volume grows.
Your Friday afternoon just got a lot quieter. 🎉

