How to Auto-Generate Timesheet Summaries with OpenClaw in Paradime

Feb 26, 2026

Table of Contents

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 paradime_schedules.yml — version-controlled, reviewable, reproducible

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

  1. Go to the Google Cloud Console.

  2. Create a new project (e.g., timesheet-automation).

  3. Enable Google Calendar API: Enable Calendar API

  4. 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:

  1. Navigate to IAM & Admin > Service Accounts in Google Cloud Console.

  2. Click Create Service Account — name it timesheet-bot.

  3. Grant no additional roles (API access is enough).

  4. Click Keys > Add Key > Create new key > JSON.

  5. 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_CREDENTIALS_JSON

Google Cloud Console > Service Account > Keys > JSON

Google Calendar API + Google Sheets API

OPENCLAW_API_KEY

OpenClaw dashboard (starts with sk-)

openclaw-sdk for AI categorization

TIMESHEET_SPREADSHEET_ID

URL of your Google Sheet (the long string between /d/ and /edit)

Google Sheets API

GOOGLE_CALENDAR_ID

Usually primary, or a specific calendar ID from Calendar settings

Google Calendar API

Setting Environment Variables in Paradime Bolt

  1. Navigate to Settings in Paradime.

  2. Go to Workspaces > Environment Variables.

  3. In the Bolt Schedules section, click Add New.

  4. Add each variable:

📋 Tip: For bulk upload, create a CSV with Key,Value header 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_York to fire at 5 PM local time. Validate expressions at crontab.guru.

Deployment

  1. Commit paradime_schedules.yml to your default branch (main or master).

  2. Paradime auto-detects changes within ~10 minutes.

  3. 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 stdout/stderr

~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-team channel on failures

  • Email 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:

  1. Minify the JSON to a single line before pasting:

  2. Paste the single-line output into the Bolt environment variable value field.

  3. 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: scheduler disabled

Cron system is off

Enable in OpenClaw config

heartbeat skipped reason=quiet-hours

Quiet hours are blocking execution

Adjust quiet hours window

unknown accountId

Auth mismatch

Re-run openclaw onboard

📖 Reference: OpenClaw Troubleshooting Docs

Issue 6: Script Runs but Sheets Are Empty

Symptom: Exit code 0, logs show "Wrote 0 rows."

Checklist:

  1. Verify TIMESHEET_SPREADSHEET_ID matches your actual Sheet URL.

  2. Confirm the sheet tab name matches SHEET_RANGE (default: Timesheet!A:F).

  3. Check that the service account has Editor (not Viewer) access to the Sheet.

  4. Verify the week_start and week_end bounds — 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:

  1. Verify your Scheduler Environment connection.

  2. Validate the cron expression at crontab.guru.

  3. Check that paradime_schedules.yml is on your default branch and has been parsed.

Wrapping Up

You've built a complete, automated timesheet pipeline that:

  1. Runs on schedule — Paradime Bolt fires every Friday at 5 PM via cron.

  2. Fetches real data — Google Calendar API retrieves all your week's events.

  3. Uses AI to categorize — OpenClaw's SDK classifies events by project and client.

  4. Writes results automatically — Google Sheets API appends timesheet rows.

  5. Fails gracefully — fallback to "Uncategorized" ensures you never lose data.

  6. 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

GOOGLE_CREDENTIALS_JSON

{"type":"service_account",...}

OPENCLAW_API_KEY

sk-abc123...

TIMESHEET_SPREADSHEET_ID

1BxiMVs0XRA5n...

GOOGLE_CALENDAR_ID

Optional

primary (default)

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.

Interested to Learn More?
Try Out the Free 14-Days Trial

Stop Managing Pipelines. Start Shipping Them.

Join the teams that replaced manual dbt™ workflows with agentic AI. Free to start, no credit card required.

Stop Managing Pipelines. Start Shipping Them.

Join the teams that replaced manual dbt™ workflows with agentic AI. Free to start, no credit card required.

Stop Managing Pipelines. Start Shipping Them.

Join the teams that replaced manual dbt™ workflows with agentic AI. Free to start, no credit card required.

Copyright © 2026 Paradime Labs, Inc. Made with ❤️ in San Francisco ・ London

*dbt® and dbt Core® are federally registered trademarks of dbt Labs, Inc. in the United States and various jurisdictions around the world. Paradime is not a partner of dbt Labs. All rights therein are reserved to dbt Labs. Paradime is not a product or service of or endorsed by dbt Labs, Inc.

Copyright © 2026 Paradime Labs, Inc. Made with ❤️ in San Francisco ・ London

*dbt® and dbt Core® are federally registered trademarks of dbt Labs, Inc. in the United States and various jurisdictions around the world. Paradime is not a partner of dbt Labs. All rights therein are reserved to dbt Labs. Paradime is not a product or service of or endorsed by dbt Labs, Inc.

Copyright © 2026 Paradime Labs, Inc. Made with ❤️ in San Francisco ・ London

*dbt® and dbt Core® are federally registered trademarks of dbt Labs, Inc. in the United States and various jurisdictions around the world. Paradime is not a partner of dbt Labs. All rights therein are reserved to dbt Labs. Paradime is not a product or service of or endorsed by dbt Labs, Inc.