OpenClaw agent config + skills for Testlify sales outreach. Runs on OpenClaw.cloud.
Replaces: Mac Studio (Mac Mini M1 Max) running local Ollama.
| Problem | Fix |
|---|---|
| Hallucinations (local Ollama 8b) | GLM-4-plus via ZhipuAI API — much stronger, cloud-hosted |
| Electricity outages | OpenClaw.cloud VM — always on |
| Duplicate LinkedIn sends | File-based dedup: ~/.openclaw/workspace/.deduplication/sent_tasks.json |
| Half-written emails | Content validation in skill (min 50 chars, not truncated) |
| Too slow | Cloud API inference vs local 8b |
skills/
testlify-outreach/SKILL.md # Gmail + LinkedIn send logic (improved)
testlify-reply-monitor/SKILL.md # Inbox monitoring (from Mac Studio)
testlify-report/SKILL.md # HubSpot reports (from Mac Studio)
config/
openclaw.json.template # GLM-4 provider + browser profiles + cron
scripts/
fetch-tasks.sh # Helper to check task queue
setup.sh # Install skills + inject GLM key
transfer-profiles.sh # Migrate Chrome profiles from Mac Studio
Sign up at open.claw.cloud. Recommended: Plus plan ($9.99/mo).
ssh openclaw@<your-vm-ip>
# IP available at: Settings → SSH Access in OpenClaw dashboardcd ~
git clone https://github.com/testlify/testlify-openclaw.git
cd testlify-openclaw
GLM_API_KEY=your-zhipuai-key bash setup.shGet your ZhipuAI key at open.bigmodel.cn.
In the OpenClaw.cloud dashboard:
- Go to Settings → Models
- Set default model to GLM-4 Plus (
zhipuai/glm-4-plus) - Outreach cron uses
glm-4-plus(smart), reply monitor usesglm-4-flash(fast)
Browser profiles have logged-in Gmail + LinkedIn sessions. Transfer them so reps don't have to log in again:
# Run from your local machine (has SSH to both)
MAC_STUDIO_HOST=100.80.23.119 \
CLOUD_VM_HOST=<your-vm-ip> \
bash transfer-profiles.shIf you'd rather log in fresh on the cloud VM, use the OpenClaw browser UI (accessible in their dashboard) to log into each rep's Gmail and LinkedIn.
In OpenClaw dashboard → Schedule:
testlify-outreach— every 30min — model:glm-4-plustestlify-reply-monitor— every 15min — model:glm-4-flash
If crons aren't there, add them manually with the payloads from config/openclaw.json.template.
# Manually trigger once
openclaw run testlify-outreachWatch the output — should see: fetch task → validate → browser navigate → send → report result → update dedup file.
| Task | Model | Why |
|---|---|---|
| Outreach execution (browser reasoning) | glm-4-plus |
Needs to read page snapshots accurately |
| Reply monitoring (14 profiles) | glm-4-flash |
Speed matters, decisions are simpler |
| Email content | Pre-generated by webhook-runner (OpenAI) | No change needed |
| Job | Interval | Model |
|---|---|---|
| testlify-outreach | every 30min | glm-4-plus |
| testlify-reply-monitor | every 15min | glm-4-flash |
Sent tasks stored at ~/.openclaw/workspace/.deduplication/sent_tasks.json.
Reply dedup at ~/.openclaw/workspace/.deduplication/replies.json.
Both files persist across agent restarts. If you need to re-process a task, remove its taskId from sent_tasks.json.
# Pull latest from repo
cd ~/testlify-openclaw && git pull
# Re-deploy
bash setup.shNo restart needed — OpenClaw reads SKILL.md at runtime.