How to Generate Product Description Copy with OpenClaw in Paradime
Feb 26, 2026
How to Automate SEO Product Descriptions with Paradime and OpenClaw
If you've ever stared at a spreadsheet full of product attributes — names, materials, colours, dimensions — and wondered how you'll turn them into hundreds of SEO-optimized descriptions without burning out your content team, you're not alone. The workflow we'll walk through in this guide connects Paradime's Bolt scheduler with OpenClaw's AI agent runtime so a single Python script can read product data from Google Sheets, generate high-quality descriptions through an AI model, and write the results back — on demand or on a daily schedule.
The article is written with an incident-friendly mindset: structured steps, decision trees, and a "time to first clue" philosophy so you can reproduce the setup quickly and fix problems with minimal effort.
What Is Paradime?
Paradime is an all-in-one, AI-native platform that replaces dbt Cloud™ for analytics and data engineering teams. Built on dbt Core™, it gives you:
Capability | What It Does |
|---|---|
Code IDE | AI-assisted dbt™ and Python development (DinoAI) — cuts development time by 83%+ |
Bolt | Production scheduling, CI/CD, and orchestration for dbt™ and Python scripts |
Radar | FinOps dashboard to cut Snowflake / BigQuery costs |
Integrations | Connects to warehouses, BI tools, Git, Slack, Jira, and more |
For this guide we care most about Bolt, Paradime's scheduler. Bolt lets you run arbitrary Python scripts alongside dbt™ commands, manage secrets through environment variables, and trigger runs on a cron schedule, on merge, or via API.
Why does this matter for product descriptions? Because Bolt treats your content-generation script as a first-class production job — with logging, retry visibility, SLA monitoring, and AI-powered debugging (DinoAI) — instead of a cron job you pray keeps running on someone's laptop.
What Is OpenClaw?
OpenClaw is an open-source, local-first AI agent gateway. It connects to 25+ messaging channels (WhatsApp, Telegram, Slack, Discord, etc.) and orchestrates AI models from multiple providers (Anthropic, OpenAI, Google Gemini, Ollama, and others) through a unified control plane.
Key OpenClaw concepts for this workflow:
Gateway — A long-running daemon (
openclaw gateway) that manages sessions, tools, cron jobs, and webhooks.Agent runtime (Pi) — The minimal coding agent that handles tool use, streaming, and multi-model routing.
openclaw-py— A Python package (pip install openclaw-py) that wraps the Gateway's OpenAI-compatible HTTP API (/v1/chat/completions) so your scripts can call it like any other LLM SDK.Skills — Markdown-defined capability plugins that extend what the agent can do (Google Workspace, browser, file I/O, etc.).
Because OpenClaw exposes an OpenAI-compatible endpoint, you don't need a bespoke SDK — the standard openai Python library works out of the box.
Architecture Overview
Before diving into code, here's how the pieces fit together:
Figure 1 — End-to-end flow: Bolt triggers the script, which reads from Google Sheets, generates descriptions via OpenClaw, and writes back.
Setup: openclaw-py + Google Sheets API
Prerequisites
Requirement | Version / Notes |
|---|---|
Python | ≥ 3.10 |
Node.js (for OpenClaw Gateway) | ≥ 22 LTS |
Paradime account | Free tier works; Bolt requires Growing or Scaling tier for Python scripts |
Google Cloud project | Service account with Sheets API & Drive API enabled |
LLM provider API key | Anthropic, OpenAI, Google Gemini, or any OpenAI-compatible provider |
Step 1 — Install OpenClaw
After onboarding, verify the Gateway is running:
Step 2 — Configure OpenClaw with Your LLM Provider
Edit ~/.openclaw/openclaw.json (or use openclaw configure):
Tip: Use
${VAR}substitution so you never hard-code secrets. OpenClaw resolves env vars at activation time (docs).
Step 3 — Create a Google Cloud Service Account
Go to Google Cloud Console → APIs & Services → Credentials.
Create a Service Account and download the JSON key file.
Enable the Google Sheets API and Google Drive API.
Share your target spreadsheet with the service account's
client_email.
Step 4 — Set Up Your Paradime Project
In your dbt™ project repository, add the Python dependencies. Paradime Bolt uses Poetry for dependency management:
The Script: Read → Generate → Write Back
Here's the complete Python script that ties everything together. Save it as scripts/generate_descriptions.py in your dbt™ project:
What the Script Does — Step by Step
Figure 2 — Decision tree for the generate_descriptions.py script. Non-zero exit codes surface as failures in Bolt.
Environment Variables
The script relies on environment variables for all secrets and configuration. Here's the full list:
Variable | Required | Description |
|---|---|---|
| ✅ | Full JSON string of the Google service account key |
| ✅ | API key for OpenClaw Gateway authentication |
| ❌ | Override Gateway URL (default: |
| ❌ | Name of the Google Sheet (default: |
| ❌ | Tab name inside the spreadsheet (default: |
| ❌ | Header of the column to write descriptions into (default: |
| ❌ | Model identifier (default: |
Setting Env Vars in Paradime Bolt
Navigate to Settings → Workspaces → Environment Variables.
In the Bolt Schedules section, click Add New.
Enter the Key (e.g.,
GOOGLE_CREDENTIALS_JSON) and paste the Value.Click the Save icon.
You can also bulk upload via CSV with columns Key and Value (docs).
Security note: Paradime stores Bolt environment variables encrypted at rest. Individual schedules can override workspace-level defaults if you need different credentials per schedule (docs).
Bolt Schedule: On-Demand or Daily
Creating the Bolt Schedule
Figure 3 — Bolt schedule creation flow. The first command must always be poetry install for Python scripts.
Step-by-Step in the Paradime UI
Go to Bolt → + New Schedule → Create New Schedule.
Select Standard schedule type.
Set a descriptive name:
product-descriptions-gen.Choose branch:
main.Under Command Settings, add two commands:
Under Trigger Types, pick your pattern:
Pattern | Trigger Configuration |
|---|---|
On-demand only | Select "Scheduled Run" → set cron to OFF. Trigger manually from the UI or via Bolt API. |
Daily at 6 AM UTC | Select "Scheduled Run" → cron: |
After a dbt™ run completes | Select "On Run Completion" → choose the upstream schedule → trigger on "Passed". |
Set up Notifications (Slack, email, or Microsoft Teams) for failure events.
Save the schedule.
Triggering via Bolt API (Programmatic)
Monitoring and Debugging
Paradime Bolt provides multiple layers of observability for your Python script runs. Here's how to use them with a "time to first clue" mindset:
The Monitoring Decision Tree
Figure 4 — Debugging decision tree. Start with the Summary tab; escalate through Console → Debug → Integration logs.
Run Log Tabs Explained
Tab | What It Shows | When to Use |
|---|---|---|
Summary | High-level status, duration, warnings, errors, suggested fixes | Always check first — fastest "time to first clue" |
Console Logs | Line-by-line stdout/stderr from | When you need the Python traceback |
Debug Logs | System-level details: thread usage, resource allocation, connection status | Advanced diagnostics (e.g., timeouts, memory issues) |
Integration Logs | Payloads sent to connected integrations (Slack, Jira) after the run | Verify notification delivery |
Additional Monitoring Capabilities
Execution Time History — Spot performance degradation over 30 days. If your 200-product run suddenly takes 3× longer, the LLM provider may be throttling you.
DinoAI Debugging — Paradime's AI assistant can analyze failed runs and suggest fixes directly in the UI.
Artifacts — Every run produces
run_results.jsonand console output files that you can download for offline analysis.SLA Monitoring — Set an expected completion time; Bolt alerts you if the run exceeds it.
Troubleshooting Common Issues
Quick-Reference Decision Matrix
Symptom | First Check | Likely Cause | Fix |
|---|---|---|---|
| Is the sheet shared with the service account email? | Missing share permission | Share the spreadsheet with the |
| Is | Missing or incorrect API key | Re-add the key in Settings → Env Variables → Bolt Schedules |
| Is the OpenClaw Gateway running? | Gateway not started or wrong port | Run |
| Is | Truncated or improperly escaped value | Paste the full JSON; ensure no line breaks were stripped |
Script exits with code 1, partial descriptions written | Check Console Logs for per-product errors | LLM rate limiting or token exhaustion | Add retry logic with exponential backoff; check provider quota |
| Is | Missing dependency file | Commit |
Descriptions are blank / low quality | Check the | Insufficient context in prompt | Add more product attributes; refine the system prompt |
Google Sheets API 429 (rate limit) | How many products are you processing? | Too many API calls in a short window | Use |
Detailed Troubleshooting Scenarios
Scenario 1: OpenClaw Gateway Won't Start
If openclaw doctor reports risky configs, run openclaw doctor --fix to auto-repair.
Scenario 2: Descriptions Generate Locally but Fail in Bolt
This almost always comes down to environment variable differences between your local machine and the Bolt runner:
Verify all required env vars are set in Settings → Workspaces → Environment Variables → Bolt Schedules.
Check for schedule-level overrides that might be masking values.
Confirm the Bolt runner can reach your OpenClaw Gateway. If the Gateway runs on your local machine, Bolt's cloud runner cannot reach
127.0.0.1. You'll need to either:
Scenario 3: Partial Failures (Some Products Fail)
The script is designed to continue past individual product failures, inserting an empty string to preserve row alignment. To improve resilience:
PARA Error Codes to Watch For
If you encounter Paradime-specific errors in Bolt, here are the most relevant ones for this workflow:
Error Code | Meaning | Action |
|---|---|---|
PARA-1000 | Missing production warehouse connection | Not directly related to Python scripts, but Bolt requires an active production connection. Add one in Account Settings → Connections. |
PARA-1003 | Cannot read from remote Git repository | Check GitHub Status. If intermittent, re-trigger the run manually. |
PARA-1008 | Cannot connect to Git repository | Verify the repo exists and your SSH key is valid. Reset the Git connection if needed. |
Before vs. After: Manual vs. Automated Descriptions
Figure 5 — Manual vs. automated product description workflow. Time savings scale linearly with catalog size.
Wrapping Up
Here's what you've built:
A reproducible, scheduled pipeline — Paradime Bolt treats your content generation script as a production job with logging, monitoring, SLA alerts, and AI-powered debugging.
An AI-powered description engine — OpenClaw routes your prompts to the best available LLM, with model fallbacks and local-first control over your data.
A zero-touch Google Sheets integration —
gspreadreads product attributes and writes descriptions back, keeping your product team in their comfort zone.An incident-ready setup — Structured logging, clear exit codes, environment variable validation, and a debugging decision tree mean you spend minutes, not hours, diagnosing failures.
Quick Checklist Before Going Live
Service account JSON is valid and stored in Bolt env vars
Spreadsheet is shared with the service account's
client_emailOpenClaw Gateway is reachable from the Bolt runner (or you're calling a hosted API directly)
poetry installis the first command in your Bolt scheduleNotifications are configured for failure events
You've tested with a small sheet (10 products) before running the full catalog
Next Steps
Refine your system prompt — Experiment with different tones, lengths, and keyword strategies per product category.
Add a quality gate — Use dbt™ tests or a separate validation script to flag descriptions that are too short, duplicated, or missing keywords.
Scale with Bolt's "On Run Completion" trigger — Chain description generation after your nightly dbt™ run so descriptions always reflect the freshest product data.
Monitor costs with Radar — Track LLM API spend alongside your warehouse costs in one place.
With Paradime and OpenClaw working together, your product catalog stays fresh, SEO-optimized, and maintainable — without a single manual copy-paste.

