How to Auto-Generate Timesheet Summaries with OpenClaw in Paradime
Feb 26, 2026
How to Build an Automated Timesheet Summary with Paradime, OpenClaw, and Google APIs
Every Friday at 5 PM, your week's calendar events are analyzed, categorized by project, and written to a timesheet — automatically. No more end-of-week scrambles reconstructing where your hours went. In this guide, you'll wire together Paradime's Bolt scheduler, OpenClaw's AI agent SDK, Google Calendar API, and Google Sheets API into a fully automated timesheet pipeline.
This is an incident-friendly guide. Every section prioritizes reproducibility, time to first clue when things break, and minimal fixes to get you back on track.
What Is Paradime?
Paradime is an all-in-one AI-native platform for analytics engineering that replaces dbt Cloud™. It provides a complete workspace for coding, shipping, fixing, and scaling data pipelines — built for fast-moving teams.
Key capabilities relevant to this guide:
Feature | What It Does |
|---|---|
Bolt Scheduler | Orchestrates dbt™ and Python jobs in production with cron scheduling, notifications, and DinoAI-powered debugging |
Code IDE | AI-native IDE for dbt™ and Python development with DinoAI assistance |
Environment Variables | Securely stores secrets (API keys, credentials) for Bolt schedules |
Schedules as Code | Define pipeline schedules in |
Bolt is the engine that will run our timesheet script on a cron schedule. It supports Python script execution natively via Poetry environments, meaning you can poetry install your dependencies and run custom Python scripts alongside dbt™ commands.
What Is OpenClaw?
OpenClaw is an open-source personal AI assistant that runs on your machine (Mac, Windows, or Linux). It connects to Anthropic, OpenAI, or local models and acts as a 24/7 autonomous agent with access to its own computer — browsing the web, managing calendars, reading/writing files, running scripts, and more.
For this guide, we use the openclaw-sdk — the Python SDK that lets you programmatically interact with OpenClaw's AI agent capabilities:
Key OpenClaw features we'll leverage:
Feature | Role in This Pipeline |
|---|---|
openclaw-sdk | Python SDK to invoke AI agent tasks — categorizing calendar events by project/client |
Cron Jobs | OpenClaw's native scheduling (used during local development/testing) |
Google Workspace Skills | Community skills for Google Calendar and Sheets integration |
Persistent Memory | Remembers project/client mapping preferences over time |
The AI agent's job is to interpret calendar event titles, descriptions, and attendees — then categorize each event into a project or client bucket and estimate hours.
Architecture Overview
Before diving into setup, here's how the pieces fit together:
Figure 1: End-to-end flow — Bolt triggers the Python script every Friday, which fetches calendar events, uses OpenClaw to categorize them, and writes the summary to Google Sheets.
Setup: openclaw-sdk + Google Calendar API + Google Sheets API
Prerequisites
Requirement | Version / Detail |
|---|---|
Python | 3.10.7+ |
Node.js | 22+ (for OpenClaw gateway, if running locally) |
Paradime account | With Bolt access (app.paradime.io) |
OpenClaw | Installed locally or API key from openclaw.ai |
Google Cloud project | With Calendar API and Sheets API enabled |
Step 1: Create a Google Cloud Project and Enable APIs
Go to the Google Cloud Console.
Create a new project (e.g.,
timesheet-automation).Enable Google Calendar API: Enable Calendar API
Enable Google Sheets API: Enable Sheets API
Step 2: Create a Service Account
For a headless Bolt environment (no interactive OAuth possible), use a service account:
Navigate to IAM & Admin > Service Accounts in Google Cloud Console.
Click Create Service Account — name it
timesheet-bot.Grant no additional roles (API access is enough).
Click Keys > Add Key > Create new key > JSON.
Download the JSON key file. This becomes your
GOOGLE_CREDENTIALS_JSON.
⚠️ Security Note: Never commit this JSON file to git. Store it as a Paradime Bolt environment variable.
Step 3: Share Resources with the Service Account
Google Calendar: In Google Calendar settings, share your calendar with the service account email (e.g.,
timesheet-bot@your-project.iam.gserviceaccount.com). Grant "See all event details" permission.Google Sheets: Open your timesheet spreadsheet and share it with the same service account email. Grant Editor access.
Step 4: Install Python Dependencies
In your dbt™ project root, create a pyproject.toml with Poetry:
Install locally:
Step 5: Configure OpenClaw SDK
Obtain your OpenClaw API key from the OpenClaw dashboard and test the connection:
Verify via CLI:
The Script: Analyze, Categorize, Estimate, Write
Here's the complete timesheet_agent.py script that ties everything together.
Decision Tree: What the Script Does
Figure 2: Decision tree for the timesheet script. Notice the fallback path — if OpenClaw fails, events are still written as "Uncategorized" so you never lose data.
Full Script
Environment Variables
You need three secrets configured. Here's the decision matrix:
Variable | Where to Get It | Used By |
|---|---|---|
| Google Cloud Console > Service Account > Keys > JSON | Google Calendar API + Google Sheets API |
| OpenClaw dashboard (starts with | openclaw-sdk for AI categorization |
| URL of your Google Sheet (the long string between | Google Sheets API |
| Usually | Google Calendar API |
Setting Environment Variables in Paradime Bolt
Navigate to Settings in Paradime.
Go to Workspaces > Environment Variables.
In the Bolt Schedules section, click Add New.
Add each variable:
📋 Tip: For bulk upload, create a CSV with
Key,Valueheader and use the Bulk Upload feature. See Bolt Schedule Environment Variables docs.
🔒 Admin Only: Only workspace administrators can configure Bolt environment variables. Individual schedules can override global defaults if needed — see Environment Variables Override.
Bolt Schedule: Cron Friday 5 PM
File Structure
Your dbt™ project should look like this:
paradime_schedules.yml
Define the schedule using Paradime's schedules-as-code:
Cron Expression Breakdown
🕐 Timezone Note: If your team works in US Eastern time, set
timezone: America/New_Yorkto fire at 5 PM local time. Validate expressions at crontab.guru.
Deployment
Commit
paradime_schedules.ymlto your default branch (mainormaster).Paradime auto-detects changes within ~10 minutes.
For immediate pickup, go to Bolt UI and click Parse Schedules.
Figure 3: Deployment and execution flow for the Bolt schedule.
Monitoring and Debugging
Time to First Clue: 60-Second Diagnostic
When a run fails, follow this exact sequence to get your first clue as fast as possible:
Figure 4: Diagnostic decision tree — always start with Summary Logs for the fastest path to the root cause.
Monitoring in Paradime Bolt
Bolt provides three log levels for each run (access via Run History > Click a run > Logs and Artifacts):
Log Level | What to Use It For | Time to First Clue |
|---|---|---|
Summary Logs | DinoAI-generated overview with warnings and potential fixes | ~10 seconds |
Console Logs | Chronological output from | ~30 seconds |
Debug Logs | System-level operations, dbt™ internals, full stack traces | ~2 minutes |
Artifacts produced by each run include compiled SQL, manifest files, and run_results.json — useful for auditing what actually executed.
Monitoring OpenClaw
For the OpenClaw SDK portion, use these diagnostic commands:
Setting Up Notifications
In your paradime_schedules.yml, notifications are already configured for failures and SLA breaches. Additionally, you can set up:
Slack alerts for the
data-teamchannel on failuresEmail alerts to the schedule owner
Jira ticket creation for failed runs (see Jira Tickets from Bolt)
Troubleshooting Common Issues
Issue 1: GOOGLE_CREDENTIALS_JSON Parse Error
Symptom: json.JSONDecodeError: Expecting value: line 1 column 1
Root Cause: The JSON string was corrupted during copy-paste into Paradime's environment variable UI (common with multi-line strings).
Fix:
Minify the JSON to a single line before pasting:
Paste the single-line output into the Bolt environment variable value field.
Re-trigger the schedule manually from Bolt UI.
Issue 2: Google Calendar Returns 403 Forbidden
Symptom: googleapiclient.errors.HttpError: 403 ... "The caller does not have permission"
Decision tree:
Figure 5: 403 error decision tree for Google Calendar API.
Issue 3: OpenClaw Returns 429 Rate Limit
Symptom: HTTP 429: rate_limit_error
Fix:
Check your OpenClaw plan's rate limits (free tier supports up to 10 jobs).
Add exponential backoff to the categorization call.
If consistently hitting limits, batch events into fewer, larger prompts.
Issue 4: Google Sheets Write Fails with 400
Symptom: HttpError 400: Invalid values[0][0]
Root Cause: Data type mismatch — the Sheets API expects strings, but numeric or None values were passed.
Fix: Ensure all values are cast to strings in the rows array:
Issue 5: OpenClaw Cron Didn't Fire
Symptom: No logs for scheduled cron job.
Diagnostic commands:
Common log signatures and fixes:
Log Signature | Meaning | Fix |
|---|---|---|
| Cron system is off | Enable in OpenClaw config |
| Quiet hours are blocking execution | Adjust quiet hours window |
| Auth mismatch | Re-run |
📖 Reference: OpenClaw Troubleshooting Docs
Issue 6: Script Runs but Sheets Are Empty
Symptom: Exit code 0, logs show "Wrote 0 rows."
Checklist:
Verify
TIMESHEET_SPREADSHEET_IDmatches your actual Sheet URL.Confirm the sheet tab name matches
SHEET_RANGE(default:Timesheet!A:F).Check that the service account has Editor (not Viewer) access to the Sheet.
Verify the
week_startandweek_endbounds — if run on a Saturday, the script looks at the past Mon–Fri. Check timezone alignment.
Issue 7: Bolt Schedule Shows "Missed" Status
Symptom: Schedule shows as "Missed" in Bolt UI.
Root Cause: The Bolt scheduler environment connection is broken or the cron expression is invalid.
Fix:
Verify your Scheduler Environment connection.
Validate the cron expression at crontab.guru.
Check that
paradime_schedules.ymlis on your default branch and has been parsed.
Wrapping Up
You've built a complete, automated timesheet pipeline that:
Runs on schedule — Paradime Bolt fires every Friday at 5 PM via cron.
Fetches real data — Google Calendar API retrieves all your week's events.
Uses AI to categorize — OpenClaw's SDK classifies events by project and client.
Writes results automatically — Google Sheets API appends timesheet rows.
Fails gracefully — fallback to "Uncategorized" ensures you never lose data.
Is fully observable — Bolt's Summary/Console/Debug logs give you time-to-first-clue in under 60 seconds.
Quick Reference: All Environment Variables
Variable | Required | Example |
|---|---|---|
| ✅ |
|
| ✅ |
|
| ✅ |
|
| Optional |
|
Quick Reference: Key Documentation Links
Next Steps
Add historical backfill: Modify
get_week_bounds()to accept a date parameter, then run the script for past weeks.Improve categorization accuracy: Teach OpenClaw your project/client taxonomy by adding context to the prompt or using its persistent memory feature.
Add dbt™ models on top of the timesheet data: Use Paradime's IDE to build dbt™ models that aggregate timesheet data for reporting, and schedule them in Bolt after the timesheet write completes using the On Run Completion trigger type.
Set up Google Calendar push notifications: For real-time event tracking instead of weekly batch, use Google Calendar push notifications to trigger the pipeline via the Bolt API trigger type.

