How to Generate Birthday and Anniversary Reminders with OpenClaw in Paradime

Feb 26, 2026

Table of Contents

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

pyenv install 3.10 or system package

Poetry

Dependency management (required by Paradime Bolt)

pip install poetry

gspread + oauth2client

Read Google Sheets

poetry add gspread oauth2client

openclaw-sdk

Call OpenClaw AI agent

poetry add openclaw-sdk

requests

Post to Slack incoming webhook

poetry add requests

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

  1. Go to the Google Cloud ConsoleAPIs & ServicesCredentials.

  2. Create a Service Account, download the JSON key file.

  3. Share your birthday spreadsheet with the service account email (e.g., birthday-bot@project.iam.gserviceaccount.com).

  4. Store the entire JSON key as a single environment variable: GOOGLE_CREDENTIALS_JSON.

Step 3 — Create a Slack Incoming Webhook

  1. Go to api.slack.com/appsCreate New App.

  2. Under Incoming Webhooks, toggle Activate, then click Add New Webhook to Workspace.

  3. Select your #celebrations channel and authorize.

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

GOOGLE_CREDENTIALS_JSON

Full JSON service-account key (stringified)

Google Cloud Console → IAM → Service Accounts → Keys

OPENCLAW_API_KEY

API key for the OpenClaw SDK

OpenClaw Dashboard or ~/.openclaw/openclaw.json

SLACK_WEBHOOK_URL

Incoming webhook URL for your Slack channel

Slack App Settings → Incoming Webhooks

Configuring Variables in Paradime

  1. From any page in Paradime, click Settings.

  2. Navigate to Workspaces → Environment Variables.

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

  4. Enter the Key (e.g., GOOGLE_CREDENTIALS_JSON) and the corresponding Value.

  5. Click the Save icon (💾).

💡 You can also bulk upload variables via CSV. The CSV must have a header row with columns Key and Value.

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

commands

poetry install sets up the virtual environment; the second command runs the script

schedule

Standard cron expression — 0 9 * * * means "at minute 0 of hour 9, every day"

timezone

Overrides the default UTC so 9 AM matches your team's local time

sla_minutes

Alerts you if the run takes longer than 10 minutes (it shouldn't)

notifications

Sends failure alerts to both email and a Slack channel

Paradime checks for paradime_schedules.yml changes 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:

  1. Navigate to Bolt from the Paradime Home Screen.

  2. Click + New Schedule → + Create New Schedule.

  3. Set Schedule Type to Standard.

  4. Under Command Settings, add:

  5. Under Trigger Types, select Scheduled Run and enter the cron expression 0 9 * * *.

  6. Configure Notification Settings for failure alerts.

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

  1. Click Debug with DinoAI.

  2. DinoAI reads the error logs, identifies the failing command, and proposes a fix.

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

Docs → Viewing Run Log History · Paradime Python SDK - Bolt

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-sdk is in your pyproject.toml and poetry install runs before the script.

  • Verify OPENCLAW_API_KEY is 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 #celebrations

Production-grade monitoring

Bolt run history, SLA alerts, DinoAI debugging

Version-controlled infrastructure

paradime_schedules.yml + reminder_bot.py in Git

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.

Resources

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.