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-outreach

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

Recommended
Start with 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:

  1. Create a campaign folder — Copy _example-campaign/ and rename it
  2. Add your prospects — Import or manually add to prospects.csv
  3. Customize sequences — Edit templates.json with your email copy
  4. Configure settings — Set limits, timing, persona in config.json
  5. 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.json

Campaign 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,cold

Prospect Status Values

StatusMeaning
pendingNot yet contacted
contactedEmail sent, awaiting reply
repliedGot a response (handle manually)
interestedPositive response, in conversation
convertedGoal achieved (meeting booked, sale made)
not_interestedDeclined, do not contact further
unsubscribedOpted out explicitly
bouncedEmail 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

  1. Hook (1 line) — Why you're reaching out, personalized
  2. Value (2-3 lines) — What's in it for them
  3. Credibility (1 line) — Why they should trust you
  4. CTA (1 line) — Single, clear ask

Keep it short: 50-125 words max. Mobile-friendly.

Follow-up Strategy

SequenceTimingPurpose
InitialDay 0Introduce, provide value
Follow-up 1Day 3-4Gentle bump, add new value
Follow-up 2Day 7-8Different angle or social proof
BreakupDay 14Final attempt, permission to close loop
Breakup Emails
The breakup email often gets the highest response rate. It signals you won't keep following up, which prompts action.

Benchmarks

MetricPoorAverageGoodExcellent
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

Deliverability
Space out your sends or risk email deliverability issues. Sudden spikes trigger spam filters.
Account AgeDaily LimitSpacing
New (<30 days)10-15/day5-10 min between
Established (1-3 months)20-30/day3-5 min between
Mature (3+ months)40-50/day1-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-outreach
Campaign: Q1 Sales Outreach
Status: active
Sent: 45 | Replied: 12 | Pending: 155
Reply rate: 26.7%
Next send window: 9:00 AM - 5:00 PM EST
# Send next batch (rate-limited, max 50)
$ pontius campaign send q1-outreach
Sending 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-outreach
Rate Limiting
Campaign sends are automatically rate-limited with 15-20 second gaps between emails to protect your email deliverability. Maximum 50 emails per batch.

AI 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/