# Send Campaign Orchestrator to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "campaign-orchestrator",
    "name": "Campaign Orchestrator",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/kesslerio/campaign-orchestrator",
    "canonicalUrl": "https://clawhub.ai/kesslerio/campaign-orchestrator",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/campaign-orchestrator",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=campaign-orchestrator",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md",
      "campaign.py",
      "post-demo.md",
      "primary.md",
      "re-engagement.md",
      "secondary.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/campaign-orchestrator"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/campaign-orchestrator",
    "downloadUrl": "https://openagent3.xyz/downloads/campaign-orchestrator",
    "agentUrl": "https://openagent3.xyz/skills/campaign-orchestrator/agent",
    "manifestUrl": "https://openagent3.xyz/skills/campaign-orchestrator/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/campaign-orchestrator/agent.md"
  }
}
```
## Documentation

### Campaign Orchestrator Skill

Multi-channel follow-up campaign orchestrator for ShapeScale sales. Executes scheduled SMS + Email sequences with CRM integration and auto-termination on replies.

### Overview

A Campaign is a defined sequence of steps (SMS/Email) that executes over time. When a lead replies to any message, the campaign automatically terminates.

### Key Features

Multi-channel: SMS (Dialpad) + Email (Gmail)
Scheduled: Cron-based execution with configurable delays
Personalized: Templates filled from Attio CRM data
Auto-terminating: Replies stop all future scheduled steps
Logged: All activities recorded in Attio

### Setup

Environment variables required:

DIALPAD_API_KEY=your_dialpad_api_key
ATTIO_API_KEY=your_attio_api_key
GOG_KEYRING_PASSWORD=your_google_password  # For Gmail access

Also ensure:

Dialpad webhook is configured to hit this server
Attio has company/contact records for leads
Gmail API access enabled for sales email

### Start a Campaign

# Start primary follow-up campaign for a lead
python3 campaign.py start "primary" --lead "Apex Fitness"

# Start with custom delay override (hours)
python3 campaign.py start "primary" --lead "Apex Fitness" --delay 2

# Start with Attio deal/company ID
python3 campaign.py start "post-demo" --lead "Apex Fitness" --attio-id "deal-uuid"

### Pre-Campaign Checklist (MANDATORY)

Before starting ANY campaign, verify:

Customer Status Check

Search memory/CRM for "already a customer" or "purchased" flags
Check exclusion list in campaigns.json
Verify email domain not in customer database



Email Formatting Check (for email steps)

Preview template renders as proper paragraphs
2-4 sentences per paragraph, blank line between
No single-sentence orphan paragraphs
No hard line breaks mid-paragraph



Tone Check

No apologetic language ("no worries", "sorry to bother")
No easy outs ("if not relevant, no problem")
Professional, not needy

NEVER campaign to existing customers unless explicitly requested for upsell.

### Check Campaign Status

# Status for specific lead
python3 campaign.py status "Apex Fitness"

# All active campaigns
python3 campaign.py list

### Stop a Campaign

# Manual termination (lead replied, not interested, etc.)
python3 campaign.py stop "Apex Fitness" --reason "replied_interested"

### Remove a Lead

# Remove lead from campaigns (opted out, not interested)
python3 campaign.py remove "Apex Fitness"

### Check for Responses

# Check if lead has responded to any prior messages
python3 campaign.py check "Apex Fitness"
# Shows response status for each completed step
# Warns if responses detected (safe to proceed or terminate)

### View Pending Steps

# Show all pending campaign steps sorted by time
python3 campaign.py pending
# Useful for seeing what's due soon across all campaigns

### Template Management

# List available templates
python3 campaign.py templates

# Preview a template
python3 campaign.py preview "primary"

### Campaign Templates

TemplateTimingChannelPurposeprimary+4 hoursSMSRecap demo, share recordingsecondary+1 dayEmailPricing, detailed ROItertiary+4 daysSMSQuick check-inquaternary+7 daysEmailFinal follow-up, case studypost-demo+0 hoursSMSImmediate thank you

### Template Variables

Templates support variable substitution:

{name}      - Lead first name
{company}   - Company name
{deal_value} - Deal value from Attio
{owner}     - Sales owner name
{demo_notes} - Notes from demo conversation
{checkout_link} - Personalized checkout URL

### Architecture

campaign-orchestrator/
├── SKILL.md              # This file
├── campaign.py           # Main CLI (start, stop, status, list)
├── webhook_handler.py    # Processes reply → termination
├── primary.md            # SMS follow-up template
├── secondary.md          # Email template
├── post-demo.md          # Immediate follow-up template
└── state/
    └── campaigns.json    # Campaign state persistence

### State Management

Campaign state is stored in <workspace>/state/campaigns.json:

{
  "campaigns": {
    "Apex Fitness": {
      "template": "primary",
      "attio_id": "deal-uuid",
      "started": "2026-01-27T13:00:00Z",
      "steps_completed": ["sms_primary"],
      "next_step": "email_secondary",
      "next_scheduled": "2026-01-28T13:00:00Z",
      "status": "active"
    }
  },
  "templates": {
    "primary": {...},
    "secondary": {...}
  }
}

### Cron Integration

Campaign steps are executed via Clawdbot's cron system:

Executor job: Runs every 5 minutes to check for due steps
Per-campaign jobs: Created for each scheduled step

The scheduler script creates and manages these jobs automatically.

### Webhook Handling

When Dialpad receives a reply to a campaign message:

Dialpad sends webhook to server
webhook_handler.py parses the reply
Looks up which campaign the original message belonged to
Marks campaign as terminated
Logs the reply to Attio

### Dialpad SMS

python3 /home/art/niemand/skills/dialpad/send_sms.py --to "+14155551234" --message "..."

### Gmail (via gog)

gog-shapescale --account martin@shapescale.com send-email --to "lead@company.com" --subject "..." --body "..."

### Attio CRM

attio note companies "company-uuid" "Campaign message sent: {message}"

### Full Campaign Workflow

# 1. After demo, start campaign
/campaign start "post-demo" --lead "Dr. Smith's Clinic"

# 2. Check status next day
/campaign status "Dr. Smith's Clinic"
# Output: Step 1 sent, Step 2 scheduled for tomorrow

# 3. Lead replies "interested"
# Webhook automatically terminates campaign
# Logs reply to Attio

# 4. Manual follow-up if needed
/campaign start "secondary" --lead "Dr. Smith's Clinic" --delay 0

### Monitoring Active Campaigns

# List all active
/campaign list

# Output:
# Active Campaigns:
# - Apex Fitness (primary) - Step 2/4, next: email
# - Dr. Smith's Clinic (post-demo) - Complete
# - Wellness Center (tertiary) - Step 1/3, next: sms

### Troubleshooting

Campaign not sending:

Check cron is running: crontab -l
Check logs: journalctl -u moltbot or campaign logs
Verify API keys: echo $DIALPAD_API_KEY

Webhook not terminating:

Verify Dialpad webhook URL is configured
Check webhook handler is running
Check campaigns.json for matching lead

Template variables not filling:

Verify lead exists in Attio with required fields
Check template syntax: {variable} not { variable }

### License

Part of shapescale-moltbot-skills. See parent repository.
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: kesslerio
- Version: 1.0.0
## Source health
- Status: healthy
- Source download looks usable.
- Yavira can redirect you to the upstream package for this source.
- Health scope: source
- Reason: direct_download_ok
- Checked at: 2026-04-30T16:55:25.780Z
- Expires at: 2026-05-07T16:55:25.780Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/campaign-orchestrator)
- [Send to Agent page](https://openagent3.xyz/skills/campaign-orchestrator/agent)
- [JSON manifest](https://openagent3.xyz/skills/campaign-orchestrator/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/campaign-orchestrator/agent.md)
- [Download page](https://openagent3.xyz/downloads/campaign-orchestrator)