How to Generate Birthday and Anniversary Reminders with OpenClaw in Paradime
Feb 26, 2026
How to Automate Birthday and Anniversary Reminders with Paradime, OpenClaw, and Slack
Every growing team hits the same wall: important dates — birthdays, work anniversaries, onboarding milestones — live scattered across spreadsheets nobody checks, Slack threads that get buried, and the heads of a handful of people who "just remember." When those people go on vacation, switch teams, or leave the company, the knowledge vanishes with them.
This is a pattern data teams know all too well. Stale docs, missing context, and tribal knowledge don't just hurt analytics pipelines — they erode the small rituals that hold culture together.
In this guide, you'll build a fully automated birthday-and-anniversary reminder system that reads from a single Google Sheet, checks for upcoming dates within a 7-day window, and posts celebration reminders to Slack — all orchestrated on a daily cron schedule using Paradime Bolt and the OpenClaw SDK.
By the end you'll have near-100 % coverage of every important date on your team, with zero manual effort after setup.
What Is Paradime?
Paradime is an AI-native data platform that replaces dbt Cloud™. Teams use Paradime to code, ship, fix, and scale data pipelines for analytics and AI. Its three core pillars are:
Pillar | What It Does |
|---|---|
Code IDE | AI-assisted dbt™ and Python development (DinoAI), with lineage and data previews built in |
Bolt | Production scheduling, orchestration, CI/CD for dbt™ and Python scripts — including cron, on-merge, and API triggers |
Radar | FinOps tooling for Snowflake and BigQuery cost optimization |
For this project the star is Bolt. Bolt isn't limited to dbt run commands — it can execute arbitrary Python scripts with full dependency management via Poetry, making it the perfect scheduler for a birthday-reminder bot.
Docs → Paradime Bolt Overview · Creating Schedules · Python Scripts in Bolt
What Is OpenClaw?
OpenClaw is an open-source AI agent framework that runs locally on your hardware and orchestrates tasks across chat apps, files, the web, and your operating system. It's not an LLM itself — it connects to models like Claude or GPT via API and uses skills to act.
For automation workflows, OpenClaw exposes the openclaw-sdk (available on npm as openclaw-sdk and on PyPI as openclaw-sdk), which lets you programmatically create scheduled jobs, route messages, and call AI agents from your own scripts.
In this project, we use the OpenClaw SDK to enrich reminder messages with AI-generated celebration copy before posting to Slack.
Docs → OpenClaw Getting Started · OpenClaw Environment Variables
Architecture Overview
Before diving into code, here's how every piece fits together:
Figure 1 — End-to-end flow: Bolt triggers the Python script daily at 9 AM. The script reads from Google Sheets, asks OpenClaw to craft a message, and posts to Slack.
Setup: openclaw-sdk + Google Sheets API + Slack SDK
Prerequisites
Tool | Purpose | Install |
|---|---|---|
Python 3.10+ | Runtime |
|
Poetry | Dependency management (required by Paradime Bolt) |
|
| Read Google Sheets |
|
| Call OpenClaw AI agent |
|
| Post to Slack incoming webhook |
|
Step 1 — Initialize the Project Inside Your dbt™ Repo
Paradime Bolt executes scripts from your connected Git repository. Create a dedicated folder:
Step 2 — Set Up Google Sheets API Credentials
Go to the Google Cloud Console → APIs & Services → Credentials.
Create a Service Account, download the JSON key file.
Share your birthday spreadsheet with the service account email (e.g.,
birthday-bot@project.iam.gserviceaccount.com).Store the entire JSON key as a single environment variable:
GOOGLE_CREDENTIALS_JSON.
Step 3 — Create a Slack Incoming Webhook
Go to api.slack.com/apps → Create New App.
Under Incoming Webhooks, toggle Activate, then click Add New Webhook to Workspace.
Select your
#celebrationschannel and authorize.Copy the webhook URL (it will look like
https://hooks.slack.com/services/T00.../B00.../XXX...).
Step 4 — Get Your OpenClaw API Key
If you haven't already, install OpenClaw and authenticate:
Then retrieve or generate your API key from the OpenClaw dashboard (openclaw dashboard) or your ~/.openclaw/openclaw.json configuration file.
Figure 2 — Credential setup sequence: obtain keys from Google, Slack, and OpenClaw, then store them in Paradime Bolt environment variables.
The Script: reminder_bot.py
Here's the full Python script that ties everything together. It reads birthdays and anniversaries from a Google Sheet, checks for upcoming dates within 7 days, uses OpenClaw to generate a celebratory message, and sends a Slack notification.
Spreadsheet Format
Your Google Sheet should have this structure:
Name | Birthday | Anniversary | Department |
|---|---|---|---|
Alice Chen | 1992-03-22 | 2021-03-22 | Engineering |
Bob Patel | 1988-07-15 | 2019-07-01 | Data |
Carol Wu | 1995-12-01 | 2023-12-01 | Product |
The Code
How the Script Works
Figure 3 — Script execution flow: iterate through rows, check dates, generate AI messages, and batch-send to Slack.
Environment Variables
Three secrets power the entire workflow. Never hardcode them — store them as Paradime Bolt environment variables.
Variable | Description | Where to Get It |
|---|---|---|
| Full JSON service-account key (stringified) | Google Cloud Console → IAM → Service Accounts → Keys |
| API key for the OpenClaw SDK | OpenClaw Dashboard or |
| Incoming webhook URL for your Slack channel | Slack App Settings → Incoming Webhooks |
Configuring Variables in Paradime
From any page in Paradime, click Settings.
Navigate to Workspaces → Environment Variables.
In the Bolt Schedules section, click Add New.
Enter the Key (e.g.,
GOOGLE_CREDENTIALS_JSON) and the corresponding Value.Click the Save icon (💾).
💡 You can also bulk upload variables via CSV. The CSV must have a header row with columns
KeyandValue.
Docs → Bolt Schedule Environment Variables · Environment Variable Overrides
Bolt Schedule: Cron Daily at 9 AM
Paradime Bolt supports scheduling via the UI or as code through a paradime_schedules.yml file. We'll use the Schedules as Code approach so the configuration lives in Git alongside the script.
paradime_schedules.yml
What Each Field Does
Field | Purpose |
|---|---|
|
|
| Standard cron expression — |
| Overrides the default UTC so |
| Alerts you if the run takes longer than 10 minutes (it shouldn't) |
| Sends failure alerts to both email and a Slack channel |
Paradime checks for
paradime_schedules.ymlchanges on your default branch every 10 minutes, or you can click Parse Schedules in the Bolt UI for an immediate refresh.
Alternative: Schedule via the Bolt UI
If you prefer a visual approach:
Navigate to Bolt from the Paradime Home Screen.
Click + New Schedule → + Create New Schedule.
Set Schedule Type to Standard.
Under Command Settings, add:
Under Trigger Types, select Scheduled Run and enter the cron expression
0 9 * * *.Configure Notification Settings for failure alerts.
Click Save.
Docs → Schedules as Code · Trigger Types · Cron Help
Monitoring and Debugging
Once your schedule is live, Paradime Bolt provides several layers of observability.
Run History & Analytics
Navigate to Bolt → your schedule → Run History to see:
Execution Time History — a 30-day graph showing success/error rates, duration trends, and skipped runs.
Run History Table — each run with its ID, status (Success / Error / Skipped), trigger source, branch, commit, timestamp, and duration.
Click any Run ID to drill into command-level logs, stdout output, and artifacts.
AI-Powered Debugging with DinoAI
When a run fails, Paradime's DinoAI can analyze the error context and suggest fixes. From a failed run's detail view:
Click Debug with DinoAI.
DinoAI reads the error logs, identifies the failing command, and proposes a fix.
You can apply the suggestion directly from the IDE.
This is especially useful for transient issues like expired Google credentials or Slack webhook URL rotations.
Using the Paradime Python SDK for Programmatic Monitoring
You can also poll run status from external tooling:
Figure 4 — Monitoring decision tree: successful runs land in Slack, failures get AI-assisted debugging, and SLA breaches trigger alerts.
Troubleshooting Common Issues
1. gspread.exceptions.SpreadsheetNotFound
Cause: The service account email doesn't have access to the spreadsheet.
Fix: Open your Google Sheet → Share → paste the service account email (from the JSON key's client_email field) and grant Viewer access.
2. json.decoder.JSONDecodeError on GOOGLE_CREDENTIALS_JSON
Cause: The environment variable value is malformed — often due to newlines being stripped or quotes being escaped incorrectly.
Fix: When setting the variable in Paradime, paste the raw JSON. If using CSV bulk upload, ensure the value is wrapped in double-quotes and internal quotes are escaped:
3. requests.exceptions.HTTPError: 403 on Slack Webhook
Cause: The webhook URL has been revoked or the Slack app was removed from the channel.
Fix: Go to api.slack.com/apps → your app → Incoming Webhooks → generate a new webhook URL and update the SLACK_WEBHOOK_URL environment variable in Paradime.
4. openclaw_sdk Import Error or Connection Timeout
Cause: Missing dependency or expired API key.
Fix:
Ensure
openclaw-sdkis in yourpyproject.tomlandpoetry installruns before the script.Verify
OPENCLAW_API_KEYis set and valid. Test with:
5. Script Runs Successfully But No Slack Message
Cause: No upcoming dates within the 7-day window.
Fix: This is expected behavior! Check the run logs in Bolt — you should see No upcoming birthdays or anniversaries in the next 7 days. To test, temporarily add a row with a date in the next 7 days to your spreadsheet and trigger a manual run:
6. Poetry Install Fails in Bolt
Cause: The pyproject.toml is missing or not committed to the branch Bolt is running from.
Fix: Ensure pyproject.toml and poetry.lock are committed to your main branch. Bolt runs against the configured git_branch.
Figure 5 — Troubleshooting decision tree for the most common failure modes.
Wrapping Up
Here's what you've accomplished:
What | How |
|---|---|
Single source of truth for team dates | Google Sheets — everyone can edit, no tribal knowledge |
AI-generated celebration messages | OpenClaw SDK generates unique, fun copy every time |
Zero-touch daily reminders | Paradime Bolt cron schedule runs at 9 AM, every day |
Instant Slack notifications | Incoming webhook posts to |
Production-grade monitoring | Bolt run history, SLA alerts, DinoAI debugging |
Version-controlled infrastructure |
|
The beauty of this workflow is its extensibility. Need to add Slack mentions with @channel? Update the webhook payload. Want to include gift-card links? Add a column to the sheet and a few lines to the script. Expanding to multiple teams? Duplicate the schedule with different spreadsheet names and Slack channels using Bolt's environment variable overrides.
No more missed birthdays. No more "I thought someone else was tracking that." Just a reliable, automated system that makes your team feel seen.

