How to Automate Email Triage with OpenClaw in Paradime

Feb 26, 2026

Table of Contents

How to Build an AI Email Triage Pipeline with Paradime, OpenClaw, and Slack

Every morning, analytics engineers face the same silent productivity killer: an inbox overflowing with alerts, stakeholder requests, vendor notifications, and genuine emergencies—all undifferentiated. The result? Critical data pipeline failures get buried under marketing emails, and urgent Slack messages from stakeholders go unanswered for hours.

What if an AI agent could scan your inbox every hour, classify each message by urgency, and post only the truly critical items to a Slack channel—all orchestrated by the same platform you already use for dbt™ scheduling?

In this guide, you'll build exactly that. We'll connect Paradime's Bolt scheduler with OpenClaw's AI email triage skill and a Slack webhook to create a fully automated, repeatable email triage pipeline. You'll follow a concrete workflow: measure inbox volume → identify urgent items with AI classification → fix notification gaps by routing to Slack → validate time savings with monitoring.

What Is Paradime?

Paradime is an all-in-one AI platform that replaces dbt Cloud™. It provides a dbt™-native workspace where analytics teams can code, ship, fix, and scale data pipelines for analytics and AI—from a single platform.

Paradime consists of three core pillars:

Pillar

What It Does

Code IDE

An AI-native IDE for dbt™ and Python development, cutting coding time by up to 83%. Includes DinoAI for context-aware AI-assisted coding.

Bolt

Production-grade orchestration for dbt™ jobs with cron scheduling, CI/CD, event-driven triggers, and built-in notifications to Slack, email, and Microsoft Teams.

Radar

FinOps tooling that reduces Snowflake and BigQuery warehouse costs, using AI agents for automated cost optimization.

For this tutorial, we'll leverage Bolt's cron scheduler and environment variables to orchestrate our email triage automation on a recurring hourly schedule.

Docs: Paradime Help Docs · Bolt Scheduling

What Is OpenClaw?

OpenClaw is an open-source personal AI assistant that runs on your own machine (Mac, Windows, or Linux). It connects to LLMs like Anthropic's Claude or OpenAI's GPT models and operates across channels you already use—Slack, WhatsApp, Telegram, Discord, and more.

Key capabilities relevant to this build:

  • Email triage skill — Scans unread emails via IMAP, classifies them by urgency using AI (with a heuristic fallback), and surfaces only what matters.

  • Cron jobs — Built-in scheduler that persists jobs and wakes the agent at the right time.

  • Slack integration — Native support for posting messages, summaries, and alerts to Slack channels.

  • Persistent memory — Remembers context across sessions so classification improves over time.

OpenClaw's email triage skill classifies messages into four categories:

Docs: OpenClaw Getting Started · OpenClaw Cron Jobs

Architecture Overview

Before we dive into setup, let's visualize the end-to-end flow:

Figure 1: End-to-end email triage pipeline — Bolt triggers OpenClaw every hour, which fetches, classifies, and routes urgent emails to Slack.

Setup: OpenClaw + Gmail OAuth + Slack Webhook

Prerequisites

  • Node.js 22+ (Node 24 recommended)

  • Python 3.10+ (for the email triage skill)

  • A Google Cloud project with Gmail API enabled

  • A Slack workspace where you can create incoming webhooks

  • A Paradime account with Bolt access

Step 1: Install OpenClaw

Step 2: Configure Gmail OAuth 2.0

You need OAuth credentials to let OpenClaw read your inbox securely.

Figure 2: Gmail OAuth 2.0 setup flow — from Google Cloud project creation to token persistence.

Detailed steps:

  1. Create a Google Cloud project — Go to Google Cloud Console, click "New Project," and name it (e.g., OpenClaw Email Triage).

  2. Enable the Gmail API — Navigate to APIs & Services → Enable APIs and Services, search for "Gmail API," and click Enable.

  3. Configure the OAuth consent screen — Select "External," fill in the app name, support email, and developer contact. Add these scopes:

  4. Create OAuth credentials — Go to Credentials → Create Credentials → OAuth client ID. Select "Desktop app." Copy the Client ID and Client Secret.

  5. Store credentials securely:

  6. Authorize on first run — When the triage skill runs for the first time, a browser window opens for you to grant permissions. The resulting token is saved to ~/.openclaw/tokens/gmail.json. Add this path to .gitignore.

⚠️ Security tip: Grant only the minimum required scopes (gmail.readonly and gmail.modify). Never grant gmail.send unless your workflow explicitly requires sending email. Rotate credentials periodically.

Step 3: Create a Slack Incoming Webhook

  1. Go to Slack API: Apps and click Create New App → From scratch.

  2. Name it (e.g., Email Triage Bot) and select your workspace.

  3. Navigate to Incoming Webhooks → toggle Activate Incoming Webhooks to On.

  4. Click Add New Webhook to Workspace and select the target channel (e.g., #urgent-emails).

  5. Copy the webhook URL:

Script: Scan Unread Emails, Classify by Urgency, Post Urgent Items to Slack

OpenClaw's community email-triage skill provides a battle-tested Python script that handles the heavy lifting. Here's the core workflow and how to extend it with Slack notifications.

Install the Email Triage Skill

Core Triage Commands

How Classification Works

Figure 3: Classification pipeline — LLM-powered with heuristic fallback, deduplication, and selective routing.

The skill:

  1. Connects to IMAP over SSL and fetches unread messages (up to 20 per scan).

  2. Deduplicates by Message-ID (or hash of subject + sender as fallback).

  3. Classifies each email using an LLM (Ollama by default) or falls back to keyword heuristics.

  4. Stores state in a local JSON file — tracks category, reason, and surfaced status.

  5. Auto-prunes state to the most recent 200 entries.

Adding the Slack Webhook Notification

Create a wrapper script that calls the triage skill and posts urgent items to Slack:

Make it executable:

Environment Variables

The pipeline requires three categories of environment variables. Here's the complete reference:

Variable

Required

Description

GOOGLE_CREDENTIALS_JSON

Path to your Google OAuth credentials JSON file (or the JSON content itself)

OPENCLAW_API_KEY

Your Anthropic or OpenAI API key used by OpenClaw for LLM classification

SLACK_WEBHOOK_URL

Slack incoming webhook URL for posting urgent email notifications

IMAP_HOST

IMAP server hostname (e.g., imap.gmail.com)

IMAP_PORT

Optional

IMAP port, defaults to 993

IMAP_USER

Your Gmail address

IMAP_PASS

Gmail app password (requires 2-Step Verification enabled)

OLLAMA_URL

Optional

Ollama endpoint for local LLM classification (default: http://127.0.0.1:11434)

OLLAMA_MODEL

Optional

Model name for Ollama (default: qwen2.5:7b)

Configuring in Paradime Bolt

In Paradime, environment variables for Bolt schedules are configured at the workspace level:

  1. Click Settings from any page in Paradime.

  2. Navigate to Workspaces → Environment Variables.

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

  4. Enter each key-value pair and click the Save icon (💾).

You can also bulk upload via CSV with Key and Value columns.

For schedule-specific overrides (e.g., using a different SLACK_WEBHOOK_URL for a staging schedule), configure overrides directly in the Bolt schedule's Environment Variables Override section.

Docs: Bolt Environment Variables

Configuring in OpenClaw

For the OpenClaw Gateway, set environment variables in your shell profile or .env file:

Docs: OpenClaw Environment Variables

Bolt Schedule: Cron Every Hour

Now let's wire everything together with a Paradime Bolt schedule that triggers the triage pipeline every hour.

Option A: Schedules as Code (YAML)

Create a paradime_schedules.yml file in the root of your dbt™ project:

The file sits alongside your dbt_project.yml:

Paradime checks for changes to paradime_schedules.yml on your default branch every 10 minutes, or you can manually trigger a refresh via the Bolt interface by clicking Parse Schedules.

Tip: Validate your cron expression at crontab.guru. The expression 0 * * * * runs at minute 0 of every hour.

Option B: Bolt UI Configuration

  1. Navigate to Bolt in Paradime.

  2. Click Create Schedule.

  3. Set the Schedule Type to Standard.

  4. Under Trigger Type, select Scheduled Run and enter the cron expression: 0 * * * *.

  5. Under Command Settings, add: bash scripts/email/triage-and-notify.sh.

  6. Under Notification Settings, add a Slack destination for failure alerts so you know if the triage script itself breaks.

  7. Click Deploy.

Option C: OpenClaw Native Cron (Alternative)

If you prefer running the schedule entirely within OpenClaw's built-in cron (without Paradime Bolt), you can use:

Or via the tool-call JSON format:

Docs: OpenClaw Cron Jobs · Bolt Trigger Types

Monitoring and Debugging

A pipeline is only as good as your ability to know when it breaks. Here's how to monitor both layers.

Monitoring the Bolt Schedule

Figure 4: Bolt monitoring flow — failure notifications trigger a diagnostic workflow through three log levels.

Set up failure notifications:

  1. In the Bolt UI, select your email-triage-hourly schedule.

  2. Click Edit → Notification Settings → Add destination.

  3. Add a Slack destination for the #data-ops channel.

  4. Enable notifications for: Failure and SLA (set SLA threshold to, e.g., 5 minutes).

  5. Click Deploy.

Reviewing failed runs:

  1. Navigate to Bolt and find your schedule.

  2. Look for runs with "Error" status in the Run History section.

  3. Click into the failed run and review:

Docs: Debugging Failed Runs

Monitoring OpenClaw

Run these commands to inspect the health of your OpenClaw instance:

Validating Savings

The whole point of this pipeline is to save time. Track your results:

This shows you:

  • Total emails scanned

  • Breakdown by category (urgent, needs-response, informational, spam)

  • Number of emails surfaced to Slack vs. archived

Measure → Identify → Fix → Validate loop:

Figure 5: The repeatable optimization loop — measure inbox metrics, identify classification gaps, fix rules, validate improvements.

Troubleshooting Common Issues

Gmail / IMAP Connection Failures

Symptom

Cause

Fix

IMAP login failed

App Password not configured

Enable 2-Step Verification in Google Account, then generate an App Password under Security → App passwords.

Connection refused on port 993

IMAP not enabled

Go to Gmail Settings → See all settings → Forwarding and POP/IMAP → Enable IMAP.

OAuth token expired

Token refresh failed

Delete ~/.openclaw/tokens/gmail.json and re-run the skill to trigger a fresh auth flow.

Scope error

Missing API scope

Ensure gmail.readonly and gmail.modify are added to OAuth consent screen.

OpenClaw Gateway Issues

Symptom

Cause

Fix

Command not found: openclaw

npm global bin not in PATH

Run export PATH="$(npm config get prefix)/bin:$PATH" and add to ~/.bashrc.

EADDRINUSE on port 18789

Port conflict

Check with ss -tlnp | grep 18789. Stop conflicting process or change port: openclaw config set gateway.port 18790.

Cron job doesn't fire

Gateway not running

OpenClaw cron runs inside the Gateway process. Ensure it's running 24/7 via openclaw gateway status. Consider running as a systemd service.

cron: scheduler disabled

Cron disabled in config

Check that cron.enabled is true in your config and OPENCLAW_SKIP_CRON is not set.

Slack Webhook Failures

Symptom

Cause

Fix

curl: (6) Could not resolve host

Invalid webhook URL

Verify the SLACK_WEBHOOK_URL env var is correctly set. Test with: curl -X POST -H 'Content-Type: application/json' -d '{"text":"test"}' "$SLACK_WEBHOOK_URL"

HTTP 403 from Slack

Webhook revoked or app uninstalled

Re-create the webhook in your Slack app settings.

HTTP 400 from Slack

Malformed JSON payload

Validate your JSON payload at jsonlint.com. Ensure no trailing commas or unescaped characters in email subjects.

Paradime Bolt Issues

Symptom

Cause

Fix

Schedule not appearing

YAML not on default branch

Ensure paradime_schedules.yml is merged to main. Click Parse Schedules in Bolt UI to force refresh.

Env vars not available

Not configured for Bolt

Environment variables must be added under Settings → Workspaces → Environment Variables → Bolt Schedules section. Code IDE vars are separate.

Run fails with permission denied

Script not executable

Run chmod +x scripts/email/triage-and-notify.sh and commit the change.

Running Diagnostics

Wrapping Up

You've now built a complete, production-ready AI email triage pipeline that:

  1. Measures — Scans your inbox every hour using OpenClaw's email triage skill.

  2. Identifies — Classifies each email into urgent, needs-response, informational, or spam using LLM-powered classification (with heuristic fallback).

  3. Fixes — Routes only urgent and needs-response items to a dedicated Slack channel, eliminating notification noise.

  4. Validates — Tracks classification statistics and surfaces metrics to confirm the pipeline is saving time.

Figure 6: Before vs. after — from 45 minutes of daily manual triage to fully automated, zero-touch email routing.

Next Steps

  • Tune classification accuracy — Maintain a VIP sender list in your OpenClaw config. Adjust keyword heuristics for your domain (e.g., add "pipeline failed," "SLA breach," "data freshness" as urgent keywords).

  • Add more channels — Route needs-response emails to a separate #action-required Slack channel for asynchronous follow-up.

  • Integrate with Paradime Radar — Use Radar's cost monitoring to alert on warehouse cost spikes alongside your email triage alerts.

  • Scale with Bolt triggers — Chain your email triage schedule with downstream dbt™ jobs using Bolt's On Run Completion trigger so that urgent data quality alerts from email automatically kick off remediation runs.

The repeatable workflow—measure → identify → fix → validate—applies far beyond email. Use the same pattern for Slack alert fatigue, PagerDuty noise reduction, or any scenario where signal-to-noise ratio determines how fast your team can respond.

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.