How to Build Automated Expense Reports with OpenClaw in Paradime
Feb 26, 2026
How to Build an Automated Expense Report with Paradime and OpenClaw
Stop copying receipt data by hand. If you've ever spent the last day of the month hunting through your Gmail for invoices, pasting amounts into a spreadsheet, and praying you didn't miss a vendor — this guide is for you.
We're going to wire up OpenClaw (the open-source AI agent) with the Gmail API, Google Sheets API, and Paradime's Bolt scheduler to build a fully automated monthly expense report. The system scans your inbox for receipts and invoices, extracts vendor names, amounts, dates, and categories, then compiles everything into a clean Google Sheet — on a cron schedule, with zero manual intervention.
No more local config headaches. No more fragile shell scripts. Just a secure, UI-driven setup that runs itself.
What Is Paradime?
Paradime is an AI-native platform purpose-built for data teams — often described as "Cursor for Data." It replaces dbt Cloud™ with a faster, more integrated experience for building, scheduling, and monitoring data pipelines.
Three pillars matter for this project:
Feature | What It Does | Why It Matters Here |
|---|---|---|
Code IDE | AI-native dbt™ development environment with DinoAI | Write and test your dbt™ models with full warehouse context |
Bolt | Production scheduler for dbt™ and Python pipelines | Schedule your expense report script on a monthly cron — no Airflow needed |
Radar | FinOps for Snowflake and BigQuery | Keep your warehouse costs under control as data grows |
Paradime is SOC 2 Type II certified, GDPR and CCPA compliant, and offers a 99.9% uptime guarantee. Your credentials and data stay locked down — which matters a lot when you're piping financial data through the system.
📖 Docs: Paradime Help Docs | Why Paradime
What Is OpenClaw?
OpenClaw is an open-source autonomous AI agent that runs on your own hardware. It connects to LLMs like Claude or GPT via API and uses skills to take action — reading emails, browsing the web, running scripts, managing files.
Think of it as a local AI assistant that actually does things instead of just chatting about them.
Key characteristics:
Self-hosted: Runs on Mac, Linux, or Windows (WSL2). Your data stays on your machine.
Multi-channel: Interacts via WhatsApp, Telegram, Slack, Discord, or the built-in dashboard.
Extensible: Community skills, custom scripts, and a Python SDK (
openclaw-sdk) for programmatic control.Built-in cron: The Gateway has a native scheduler that persists jobs and supports delivery to chat channels.
For our use case, we care about OpenClaw's ability to authenticate with Gmail, parse email content using an LLM, extract structured data, and write to Google Sheets — all orchestrated via the openclaw-sdk.
📖 Docs: OpenClaw Getting Started | GitHub
Setup: openclaw-sdk + Gmail API + Google Sheets API
Let's get the infrastructure wired up. There are three pieces: installing the OpenClaw SDK, enabling the Google APIs, and connecting everything with credentials.
Figure 1: Setup flow — from SDK installation to credential verification.
Step 1: Install OpenClaw and the Python SDK
First, install the OpenClaw runtime (if you haven't already):
Then install the Python SDK:
Verify your gateway is running:
Step 2: Enable Gmail API and Google Sheets API
Head to the Google Cloud Console:
Create a new project (or use an existing one).
Navigate to APIs & Services → Library.
Search for and enable Gmail API.
Search for and enable Google Sheets API.
Go to APIs & Services → Credentials.
Create an OAuth 2.0 Client ID (for user-context access) or a Service Account (for server-to-server).
Download the credentials JSON file.
⚠️ Security note: Never commit your credentials file to version control. We'll store it as an environment variable next.
Step 3: Install Python dependencies
Environment Variables: GOOGLE_CREDENTIALS_JSON and OPENCLAW_API_KEY
This is where most tutorials fall apart — they tell you to drop a JSON file in your project directory and call it a day. Don't do that.
Both Paradime and OpenClaw support proper environment variable management. Here's the secure approach:
Local development (OpenClaw)
Create a .env file in your OpenClaw home directory (~/.openclaw/.env):
OpenClaw loads environment variables in this precedence order:
Process environment (parent shell)
.envin current working directoryGlobal
.envat~/.openclaw/.envConfig
envblock in~/.openclaw/openclaw.json
You can also use the config block with secret references:
Production (Paradime Bolt)
In Paradime, environment variables for Bolt schedules are managed through the UI:
Click Settings in the Paradime app.
Navigate to Workspaces → Environment Variables.
In the Bolt Schedules section, click Add New.
Add
GOOGLE_CREDENTIALS_JSONwith your service account JSON as the value.Add
OPENCLAW_API_KEYwith your API key.Click Save (💾).
Paradime also supports bulk upload via CSV and schedule-level overrides — so you can use different credentials for different environments without touching code.
📖 Docs: Paradime Bolt Env Variables | OpenClaw Environment Variables
Figure 2: Credential management — local development vs. Paradime production.
The Script: Scan Inbox, Extract Data, Compile Report
Here's where the pieces come together. This Python script uses the openclaw-sdk to orchestrate an AI agent that:
Connects to Gmail and searches for receipts/invoices.
Extracts vendor, amount, date, and category from each email.
Compiles the results into a monthly expense report.
Writes the report to a Google Sheet.
Figure 3: End-to-end data flow — from inbox scan to completed expense report.
Bolt Schedule: Cron at End of Month
Now let's make this run automatically. Paradime's Bolt scheduler gives you two options: the UI or YAML-as-code.
Option A: UI-Based Schedule (Point and Click)
Navigate to Bolt from the Paradime home screen.
Click + New Schedule → + Create New Schedule.
Fill in the fields:
Field | Value |
|---|---|
Name |
|
Commands |
|
Git Branch |
|
Owner Email |
|
Trigger Type | Cron Schedule |
Cron Schedule |
|
Slack Notify On |
|
Slack Channel |
|
Click Save.
That's it. No Airflow DAGs, no GitHub Actions YAML, no crontab entries that break silently.
Option B: Schedules as Code (YAML)
If you prefer version-controlled config, create paradime_schedules.yml in the root of your dbt™ project:
Paradime auto-refreshes schedules from the YAML file every 10 minutes, or you can manually trigger a parse via Bolt → Parse Schedules.
Pro tip: Use
schedule: 'OFF'to disable the schedule without deleting the config — handy for staging environments.
📖 Docs: Creating Bolt Schedules | Schedules as Code
Bonus: OpenClaw Native Cron (for Non-Paradime setups)
If you're not using Paradime, you can schedule directly through OpenClaw's built-in cron:
Or programmatically via the SDK:
Monitoring and Debugging
Once the schedule is live, you need visibility. This is where Paradime's Bolt UI really shines — and honestly, this is the feature that makes the whole setup worth it over raw cron jobs.
Bolt Monitoring Dashboard
From the Bolt home screen, you get an at-a-glance view of all schedules:
Column | What It Shows |
|---|---|
Status | ✅ Passed, ❌ Error, ⏳ Running |
Last Run | When it last executed |
Next Run | When it's scheduled to fire next |
Duration | How long the last run took |
Owner | Who's responsible for this schedule |
Click into any schedule to see the Run History — a full list of every execution with status, trigger type, branch, commit, and run ID.
Three Layers of Logs
When something goes wrong (and it will), Paradime gives you three log types for every run:
Log Type | Description | When to Use |
|---|---|---|
Summary Logs | DinoAI-generated overview with AI-suggested fixes | First stop — quick triage |
Console Logs | Detailed chronological execution output | Finding specific error messages |
Debug Logs | System-level operations and internals | Deep performance investigation |
DinoAI is Paradime's built-in AI assistant. It reads your execution logs and generates a human-readable summary like:
This cuts your debugging time dramatically. Instead of scrolling through hundreds of log lines, you get the answer in seconds.
OpenClaw-Side Monitoring
On the OpenClaw side, use these commands to verify the agent health:
Figure 4: Debugging workflow — from error detection to resolution.
📖 Docs: Viewing Run History | Debugging Failed Runs
Troubleshooting Common Issues
Here are the problems you'll hit — and how to fix them fast.
1. Gmail API Returns No Emails
Symptom: The script runs, finds 0 emails, and exits silently.
Fixes:
Check your query string. The Gmail search syntax is specific. Test it directly in Gmail first:
after:2026/03/01 (subject:receipt OR subject:invoice).Service account delegation. If using a service account, you must enable domain-wide delegation in Google Admin Console and set the
subjectparameter to the target user's email.Scopes. Ensure
https://www.googleapis.com/auth/gmail.readonlyis authorized in the OAuth consent screen.
2. OpenClaw Agent Timeout or No Response
Symptom: openclaw-sdk hangs or returns an empty result.
Fixes:
Run
openclaw status— make sure the gateway is running.Run
openclaw doctor— this catches 90% of config issues.Check your API key: ensure
OPENCLAW_API_KEYor the relevant LLM key (OPENAI_API_KEY,ANTHROPIC_API_KEY) is set correctly.Increase the SDK timeout if processing many emails:
3. Google Sheets Permission Denied
Symptom: gspread.exceptions.APIError: 403 PERMISSION_DENIED
Fixes:
Share the Google Sheet with the service account email (the one ending in
@project-id.iam.gserviceaccount.com).Make sure both
spreadsheetsanddrivescopes are included in your credentials.
4. GOOGLE_CREDENTIALS_JSON Parsing Errors
Symptom: json.JSONDecodeError when loading credentials.
Fixes:
In
.envfiles, wrap the JSON in single quotes.In Paradime's Bolt UI, paste the raw JSON directly — the UI handles escaping.
Validate the JSON:
echo $GOOGLE_CREDENTIALS_JSON | python -m json.tool
5. Cron Schedule Not Firing
Symptom: Nothing happens at the expected time.
For Paradime Bolt:
Check the schedule status in the Bolt UI — is it enabled?
Verify the cron expression at crontab.guru.
Remember: Bolt cron is UTC-based unless you specify a timezone in the YAML.
For OpenClaw:
Run
openclaw cron listto see if the job exists.Check for
"cron: scheduler disabled"in logs — ensurecron.enabled: truein your config.Verify that your gateway isn't in quiet hours: check
openclaw logs --followfor"heartbeat skipped reason=quiet-hours".
6. openclaw Command Not Found
Symptom: Terminal says openclaw: command not found after installation.
Fix:
Wrapping Up
Here's what you've built:
Figure 5: The complete automated expense report pipeline.
A fully automated expense report pipeline that:
Scans your Gmail inbox for receipts and invoices using the Gmail API.
Extracts vendor names, amounts, dates, and categories using OpenClaw's AI agent with structured output.
Compiles a clean monthly expense report in Google Sheets.
Runs on a cron schedule via Paradime Bolt — no infrastructure to manage.
Monitors itself with DinoAI-powered log summaries and Slack/email alerts.
The combination of Paradime and OpenClaw eliminates the two biggest pain points in this kind of automation: credential management and scheduling reliability. Paradime handles your secrets through a proper UI with role-based access. Bolt gives you cron scheduling with built-in monitoring, alerting, and AI-assisted debugging. OpenClaw handles the messy AI orchestration layer — talking to LLMs, parsing unstructured email content into clean data.
If you're managing expenses across multiple business units, extend this by:
Adding schedule-level environment variable overrides in Paradime for different Google accounts.
Using OpenClaw's pipeline feature to chain multiple agents (e.g., one for receipt extraction, one for categorization, one for anomaly detection).
Piping the extracted data into your dbt™ models for deeper financial analytics.
The days of manual expense reports are over. Set it up once, validate the first run, and let it run.
📖 Get started: Paradime | OpenClaw | openclaw-sdk | Paradime Bolt Docs

