Campaigns
Outbound email campaigns with prospect tracking, email sequences, and performance analytics. A lightweight CRM for AI-powered outreach.
Overview
Campaigns let you run outbound email sequences with prospect tracking. Each campaign is a folder containing configuration, prospect list, email templates, and activity logs.
Quick Start: AI-Guided Setup
The fastest way to create a campaign is with the AI-guided setup. It walks you through a discovery session to capture your goals, target audience, and messaging strategy.
$ pontius campaign setup my-outreachYour AI will ask about:
- Goals — What success looks like (demos booked, replies, signups)
- Target audience — Who you're reaching, their pain points, what they care about
- Value proposition — Why they should care, what makes you different
- Tone & approach — How emails should sound, length, phrases to use or avoid
- Personalization hooks — Research sources, what angles work best
- Call-to-action — What you're asking for
The AI saves everything to a strategy.json file in your campaign folder. This gives it the context needed to write genuinely personalized emails for each prospect — not just mail-merge with {name} placeholders.
pontius campaign setup even if you plan to customize manually. The strategy file becomes your AI's cheat sheet for the entire campaign.Manual Setup
If you prefer to set things up manually:
- Create a campaign folder — Copy
_example-campaign/and rename it - Add your prospects — Import or manually add to
prospects.csv - Customize sequences — Edit
templates.jsonwith your email copy - Configure settings — Set limits, timing, persona in
config.json - Run with AI — "Send next batch for [campaign]" or "Check campaign status"
Folder Structure
~/.config/pontius/knowledge/campaigns/├── README.md # Documentation├── _example-campaign/ # Copy this to start│ ├── config.json # Campaign settings│ ├── prospects.csv # Target list│ ├── templates.json # Email sequences│ └── log.json # Activity log└── your-campaign-name/ # Your actual campaigns ├── config.json ├── prospects.csv ├── templates.json └── log.jsonCampaign Configuration
{ "id": "q1-outreach", "name": "Q1 Sales Outreach", "description": "Enterprise prospects from SaaStr", "status": "active", "account_id": "work-uuid", "persona": { "name": "Stuart", "role": "Founder", "company": "Pontius", "tone": "casual-professional", "signature": "Best,\nStuart" }, "settings": { "daily_limit": 25, "min_delay_hours": 24, "send_window": { "start": "09:00", "end": "17:00", "timezone": "America/New_York" }, "followup_sequence": ["initial", "followup-1", "followup-2", "breakup"], "stop_on_reply": true, "pause_on_bounce": true }}Status values: draft, active, paused, completed
Prospects CSV
email,name,company,role,status,last_contacted,last_response,sequence_position,notes,source[email protected],Alex Chen,TechCorp,CTO,pending,,,0,Met at SaaStr,linkedin[email protected],Jordan Lee,Startup.io,Founder,contacted,2026-01-05,,1,Interested in API,referral[email protected],Sam Rivera,Acme Corp,VP Sales,replied,2026-01-06,2026-01-07,1,Asked for pricing,coldProspect Status Values
| Status | Meaning |
|---|---|
pending | Not yet contacted |
contacted | Email sent, awaiting reply |
replied | Got a response (handle manually) |
interested | Positive response, in conversation |
converted | Goal achieved (meeting booked, sale made) |
not_interested | Declined, do not contact further |
unsubscribed | Opted out explicitly |
bounced | Email failed to deliver |
Email Sequences
{ "sequences": [ { "id": "initial", "name": "Initial Outreach", "subject": "quick question about {company}", "body": "Hi {name},\n\n{personalized_opener}\n\n{value_prop}\n\n{cta}\n\n{signature}", "delay_days": 0 }, { "id": "followup-1", "name": "First Follow Up", "subject": "Re: {original_subject}", "body": "Hi {name},\n\nJust wanted to bump this...\n\n{signature}", "delay_days": 3 }, { "id": "breakup", "name": "Breakup Email", "subject": "closing the loop", "body": "Hi {name},\n\nI haven't heard back, so I'll assume now isn't the right time...\n\n{signature}", "delay_days": 14 } ]}Activity Log
{ "entries": [ { "timestamp": "2026-01-05T10:30:00Z", "prospect_email": "[email protected]", "action": "sent", "sequence_id": "initial", "subject": "Quick question about TechCorp" } ], "stats": { "total_sent": 45, "total_replied": 12, "total_converted": 3, "reply_rate": 0.267, "conversion_rate": 0.067 }}Writing Effective Outreach
Subject Lines
What works:
- Short (3-7 words)
- Personalized with company name or reference
- Curiosity or relevance, not clickbait
- Lowercase often outperforms Title Case
Examples:
quick question about {company}{name} - saw your post on {topic}idea for {company}'s {specific_thing}
Email Body Structure
- Hook (1 line) — Why you're reaching out, personalized
- Value (2-3 lines) — What's in it for them
- Credibility (1 line) — Why they should trust you
- CTA (1 line) — Single, clear ask
Keep it short: 50-125 words max. Mobile-friendly.
Follow-up Strategy
| Sequence | Timing | Purpose |
|---|---|---|
| Initial | Day 0 | Introduce, provide value |
| Follow-up 1 | Day 3-4 | Gentle bump, add new value |
| Follow-up 2 | Day 7-8 | Different angle or social proof |
| Breakup | Day 14 | Final attempt, permission to close loop |
Benchmarks
| Metric | Poor | Average | Good | Excellent |
|---|---|---|---|---|
| Reply rate | <2% | 2-5% | 5-10% | >10% |
| Positive reply rate | <1% | 1-3% | 3-5% | >5% |
| Conversion rate | <0.5% | 0.5-2% | 2-5% | >5% |
Sending Limits
| Account Age | Daily Limit | Spacing |
|---|---|---|
| New (<30 days) | 10-15/day | 5-10 min between |
| Established (1-3 months) | 20-30/day | 3-5 min between |
| Mature (3+ months) | 40-50/day | 1-3 min between |
CLI Commands
Manage campaigns directly from the command line:
# AI-guided campaign strategy discovery (start here!)$ pontius campaign setup my-outreach# List all campaigns$ pontius campaign list NAME STATUS SENT REPLIED PENDING q1-outreach active 45 12 155 partner-reach paused 20 5 80# Check campaign status and stats$ pontius campaign status q1-outreachCampaign: Q1 Sales OutreachStatus: activeSent: 45 | Replied: 12 | Pending: 155Reply rate: 26.7%Next send window: 9:00 AM - 5:00 PM EST# Send next batch (rate-limited, max 50)$ pontius campaign send q1-outreachSending 25 emails (rate-limited: 15-20 sec gaps)...Sent 25/25. Next batch ready in 24 hours.# Send smaller batch$ pontius campaign send q1-outreach --limit 10# Pause/resume campaigns$ pontius campaign pause q1-outreach$ pontius campaign resume q1-outreachAI Workflow
During blitz sessions, tell the AI:
- "Send next batch for q1-outreach"
- "Check campaign status"
- "Show prospects who replied"
- "Pause the campaign"
The AI will check daily limits, send windows, personalize emails, and update logs.
File Location
~/.config/pontius/knowledge/campaigns/