How to Generate Executive Dashboards with OpenClaw in Paradime
Feb 26, 2026
How to Build an Automated Executive KPI Dashboard with Paradime, OpenClaw, and Slack
Every Monday morning, the same ritual plays out across data teams: someone manually pulls numbers from spreadsheets, pastes them into a document, writes a narrative, and pushes it to Slack before the leadership standup. By the time it lands, the data is stale and the analyst is exhausted.
What if that entire workflow — measure → identify → fix → validate — ran itself while you slept?
This guide walks you through building an automated executive KPI dashboard that reads live metrics from Google Sheets, uses OpenClaw to generate an AI-powered narrative with trends, highlights, and concerns, and delivers it to Slack every Monday at 7 AM via Paradime Bolt. No vague "optimize your reporting" advice here — every step is a concrete, repeatable action.
Figure 1: End-to-end automation flow — from KPI spreadsheets to executive Slack briefing, orchestrated by Paradime Bolt on a weekly cron schedule.
What Is Paradime?
Paradime is an all-in-one AI platform that replaces dbt Cloud™. It lets you code, ship, fix, and scale data pipelines for analytics and AI from a single workspace. For this project, we care about three capabilities:
Code IDE — An AI-native development environment with full terminal access, Python support, and DinoAI-powered code generation that cuts dbt™ and Python development time by 83%+.
Bolt — A production orchestration engine that runs dbt™ commands and Python scripts on configurable cron schedules, with Slack/email notifications, environment variable management, and 99.9% uptime guarantee.
Radar — FinOps tooling for Snowflake and BigQuery cost optimization (relevant when your dashboards later need warehouse queries).
Bolt is the workhorse of this build. It lets you define schedules as YAML code committed to your Git repo, run Python scripts alongside dbt™ commands, and store secrets as environment variables — all without leaving the platform.
Why Paradime over raw cron + a VM? Bolt gives you version-controlled scheduling, built-in notification routing, AI-powered error debugging (DinoAI resolves failures in ~10 seconds), and a full run-history dashboard. You configure once and forget.
What Is OpenClaw?
OpenClaw is an open-source AI agent framework (formerly Moltbot/Clawdbot) with 68,000+ GitHub stars. It runs as a local Node.js service that connects large language models to real-world tools — files, APIs, chat apps, browsers, and custom plugins.
For our use case, OpenClaw acts as the narrative engine: we register a custom tool that accepts raw KPI data and returns a structured executive summary with trend analysis, highlights, and risk flags. The key architectural features we leverage:
Plugin SDK — Register custom tools via
api.registerTool()that the AI agent can invoke during execution.Model-agnostic — Bring your own API key for Anthropic Claude, OpenAI GPT, or run local models.
Cron + Slack integration — Native cron scheduler and Slack channel plugin for automated delivery.
Persistent memory — Maintains context across sessions so the agent can compare this week's KPIs against last week's.
Figure 2: OpenClaw's plugin architecture — the Python script sends KPI data to the gateway, which routes it through the registered tool to the LLM, returning a structured executive narrative.
Setup: openclaw-sdk + Google Sheets API + Slack SDK
Prerequisites
Component | Purpose | Install |
|---|---|---|
Python 3.11+ | Script runtime | System / |
Poetry | Dependency management |
|
OpenClaw | AI narrative generation |
|
Google Service Account | Sheets API access | |
Slack App | Webhook delivery |
Step 1: Initialize Your Project
Inside your Paradime-connected dbt™ project repo, create the dashboard script directory:
Step 2: Configure Poetry Dependencies
Create a pyproject.toml at your project root (or extend your existing one):
Step 3: Set Up Google Sheets API
Create a service account in Google Cloud Console with the Sheets API enabled.
Download the JSON credentials file.
Share each KPI spreadsheet with the service account email (e.g.,
dashboard-bot@your-project.iam.gserviceaccount.com).
Authentication in Python uses gspread with service account credentials:
Step 4: Register an OpenClaw KPI Analyzer Tool
Create an OpenClaw plugin that accepts structured KPI data and returns an executive narrative. In your OpenClaw workspace, create a plugin file:
Add the plugin to your OpenClaw config:
Step 5: Configure the Slack Webhook
Create a Slack app at api.slack.com/apps.
Enable Incoming Webhooks and create one for your
#exec-dashboardchannel.Copy the webhook URL — it will look like
https://hooks.slack.com/services/T00000000/B00000000/XXXX.
Quick test from Python:
The Script: Read KPIs, Generate Narrative, Deliver to Slack
Here is the complete Python script that ties everything together. Save it as scripts/executive_dashboard/run.py:
Figure 3: Sequence diagram showing the full execution flow — Bolt triggers the script, which reads from Sheets, calls OpenClaw for narrative generation, and delivers via Slack.
Environment Variables
All secrets and configuration live as Paradime Bolt environment variables — never hardcoded. Here's the complete list:
Variable | Description | Where to Get It |
|---|---|---|
| Full JSON content of Google service account key | Google Cloud Console → IAM → Service Accounts |
| Bearer token for OpenClaw gateway HTTP endpoint | OpenClaw config: |
| URL of your OpenClaw gateway (default: | Your deployment URL |
| Incoming webhook URL for your Slack channel | Slack App → Incoming Webhooks |
| Google Sheets spreadsheet ID for Revenue | From the sheet URL |
| Google Sheets spreadsheet ID for Marketing | From the sheet URL |
| Google Sheets spreadsheet ID for Product | From the sheet URL |
| Google Sheets spreadsheet ID for Support | From the sheet URL |
Adding Variables in Paradime
Navigate to 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.Click the save icon (💾).
For bulk upload, prepare a CSV with Key,Value columns and use the Bulk Upload button.
Pro tip: For the
GOOGLE_CREDENTIALS_JSONvariable, paste the entire JSON content of your service account key file as a single-line string. The Python script parses it withjson.loads().
Reference: Paradime Bolt Schedule Environment Variables
Bolt Schedule: Cron Monday 7 AM
Option A: Schedules as Code (Recommended)
Add the following to your paradime_schedules.yml file at the root of your dbt™ project:
Cron expression breakdown:
Important: Paradime uses standard cron syntax with days 0–6 (Sunday=0, Monday=1). Validate your expression at crontab.guru. The first command in any Bolt schedule using Python must be
poetry installto set up the virtual environment.
Option B: UI-Based Schedule
Navigate to Bolt → Create Schedule.
Set the name to
executive-kpi-dashboard.Under Command Settings, add:
Under Trigger Type, select Scheduled Run and enter cron:
0 7 * * 1.Set timezone to
America/New_York.Configure notifications for failure events.
Deployment
Paradime reads paradime_schedules.yml from your default branch (main/master) and checks for changes every 10 minutes. For immediate deployment, navigate to Bolt and click Parse Schedules.
Figure 4: Bolt schedule lifecycle — from YAML commit to conditional execution and notification routing.
Reference: Paradime Schedules as Code
Monitoring and Debugging
Once your schedule is live, Paradime Bolt provides comprehensive observability without any additional tooling.
Run History Dashboard
Navigate to Bolt → Schedules → executive-kpi-dashboard → Run History to see:
Execution Time History — A 30-day graph showing success/error rates, execution duration trends, and total run counts.
Run History Table — Every execution with Run ID, status (Success/Error/Skipped), trigger source (Scheduler/Manual), branch, commit, timestamp, and duration.
Click any Run ID to drill into the detailed log, which shows stdout/stderr from each command in sequence.
DinoAI-Powered Debugging
When a run fails, Paradime's DinoAI automatically analyzes the error and provides actionable fix suggestions — reducing mean time to resolution (MTTR) from 30 seconds to ~10 seconds. This is especially useful when:
A Google Sheets API rate limit is hit (300 requests/60s per project)
The OpenClaw gateway is unreachable
A Slack webhook URL has been rotated
OpenClaw Monitoring
On the OpenClaw side, monitor agent execution with:
Alerting Strategy
Event | Alert Channel | Threshold |
|---|---|---|
Bolt run failure | Slack | Any failure |
SLA breach (>15 min) | Email to owner |
|
OpenClaw gateway down | OpenClaw heartbeat → Slack | Heartbeat interval miss |
Google Sheets API 429 | Script stderr in Bolt logs | Rate limit error |
Figure 5: Monitoring and alerting architecture — Bolt, DinoAI, and OpenClaw each feed into unified Slack and email alert channels.
Reference: Viewing Run Log History
Troubleshooting Common Issues
Paradime Bolt Issues
Error | Cause | Fix |
|---|---|---|
PARA-1000: Missing production warehouse connection | No production warehouse configured | Add connection in Settings → Connections (docs) |
| Missing | Ensure |
Python script not found | Wrong path in command settings | Verify path relative to repo root: |
Environment variable empty | Variable set in Code IDE, not Bolt | Move variable to Settings → Environment Variables → Bolt Schedules section |
Schedule not triggering | YAML not on default branch | Merge |
PARA-1003: Could not read from remote repository | GitHub API down | Check githubstatus.com; manually trigger run after recovery |
OpenClaw Issues
Error | Cause | Fix |
|---|---|---|
| Cron not enabled in config | Run |
| Scheduler crash | Check |
Gateway timeout on | HTTP endpoint disabled by default | Enable in config: |
| Channel not properly configured | Run |
Wrong execution time | Timezone mismatch | Cron without |
Empty narrative returned | API key invalid or model unavailable | Verify key with |
Google Sheets API Issues
Error | Cause | Fix |
|---|---|---|
| Spreadsheet not shared with service account | Share sheet with service account email |
| Rate limit exceeded | Add |
| Malformed | Ensure the full JSON is stored as a single-line string; validate with |
Slack Webhook Issues
Error | Cause | Fix |
|---|---|---|
| Webhook URL deleted or rotated | Regenerate webhook in Slack app settings; update |
| Narrative exceeds Slack block limit (3000 chars) | Add truncation logic in |
| Channel was archived or renamed | Recreate webhook for the current channel |
Figure 6: Troubleshooting decision tree — quickly isolate which stage of the pipeline failed and apply the targeted fix.
Wrapping Up
You now have a fully automated executive KPI dashboard that follows a disciplined measure → identify → fix → validate workflow:
Measure — The Python script authenticates with Google Sheets and pulls the latest KPI data from four department spreadsheets using
gspread.Identify — OpenClaw's AI agent analyzes the raw data and generates a structured executive narrative with trends, highlights, and concerns.
Fix/Deliver — The narrative is formatted as rich Slack blocks and posted to
#exec-dashboardvia webhook.Validate — Paradime Bolt logs every run with status, duration, and full stdout/stderr. DinoAI catches failures instantly.
The entire pipeline runs every Monday at 7 AM Eastern, triggered by a single cron expression in paradime_schedules.yml. No manual spreadsheet copying. No stale data. No exhausted analyst.
What to Build Next
Add warehouse KPIs — Use dbt™ models in the same Bolt schedule to pull metrics directly from Snowflake or BigQuery before the Python script runs.
Historical comparison — Leverage OpenClaw's persistent memory to compare this week's briefing against last week's and surface week-over-week deltas.
Multi-channel delivery — Extend to email via SendGrid or Microsoft Teams using OpenClaw's 22+ channel integrations.
Cost monitoring — Use Paradime Radar to track the warehouse cost of any SQL-based KPI queries and include FinOps data in the briefing.
The code, YAML, and OpenClaw plugin from this guide are all version-controlled in your Git repo. Clone it, swap in your sheet IDs, and ship your first automated briefing this Monday.
References:

