Campaign Data Model
Each campaign includes:- ID: Unique numeric identifier
- UUID: Unique universal identifier for tracking
- Name: Campaign name for internal reference
- Subject: Email subject line (supports template variables)
- From Email: Sender email address
- Body: Campaign content (format depends on content type)
- Body Source: Source content for visual editor campaigns
- Alt Body: Plain text alternative for HTML emails
- Content Type:
richtext,html,plain,markdown, orvisual - Status:
draft,running,scheduled,paused,cancelled, orfinished - Type:
regularoroptin - Send At: Scheduled send time (optional)
- Headers: Custom email headers (JSONB array)
- Attribs: Campaign attributes (JSONB)
- Tags: Array of tags for organization
- Messenger: Backend messenger ID (e.g.,
email,email-0) - Template ID: Reference to template
- Lists: Target list IDs
- Archive: Enable public archive viewing
- Archive Slug: Custom URL slug for archive
Creating Campaigns
Basic Information
Configure campaign essentials:
- Name: Internal identifier (1-500 characters)
- Subject: Email subject line (up to 5000 characters, supports templates)
- From Email: Sender address (defaults to
app.from_email)
Select Lists
Choose one or more target lists. Campaign will be sent to subscribers with:
- Subscriber status:
enabled - Subscription status:
confirmed(for regular campaigns) - Or
unconfirmed(for opt-in campaigns)
Campaign Types
- Regular
- Opt-in
Regular Campaigns
Standard email campaigns sent to confirmed subscribers.Characteristics:- Sent to subscribers with
confirmedsubscription status - Most common campaign type
- Full tracking and analytics
- Supports all content types
- Newsletters
- Product announcements
- Marketing campaigns
- Weekly digests
Content Types
Rich Text
WYSIWYG editor with formatting toolbar
- Easy to use for non-technical users
- Basic formatting (bold, italic, lists)
- Image insertion
- Link creation
HTML
Raw HTML editor for custom designs
- Full HTML control
- Custom styling
- Advanced layouts
- Template variables supported
Markdown
Write in Markdown, rendered to HTML
- Simple syntax
- Converts to HTML automatically
- Good for text-heavy content
- Supports template variables
Plain Text
Unformatted text emails
- Maximum deliverability
- No HTML formatting
- Best for transactional emails
- Template variables supported
Visual
Visual drag-and-drop editor
- Block-based editing
- Source stored in
body_source - Rendered HTML in
body - Template variables supported
Converting Content Types
Convert between formats using the API:Campaign Statuses
Draft
Initial state. Campaign can be edited freely.
- Not sending
- Can modify all properties
- Can be deleted
- Can transition to: scheduled, running
Scheduled
Campaign set to send at future time (
send_at).- Waiting for scheduled time
- Can be edited or cancelled
- Can transition to: running (at send time), paused, cancelled, draft
Running
Campaign currently sending.
- Actively dispatching emails
- Cannot be edited
- Progress tracked (
sent/to_send) - Can transition to: paused, cancelled, finished
Paused
Temporarily stopped during sending.
- Can be resumed (transitions to running)
- Can be edited while paused
- Retains sending progress
- Can transition to: running, cancelled
Cancelled
Manually stopped, will not resume.
- Permanently stopped
- Cannot be restarted
- Partial send statistics preserved
- Final state
Scheduling Campaigns
Schedule campaigns for future delivery:- Appear in running campaigns list
- Show countdown until send time
- Can be edited or cancelled before send time
- Automatically transition to
runningat scheduled time
Template Variables
Use template variables in subject and body:Subscriber Variables
Campaign Variables
Tracking Variables
Unsubscribe Variables
Template Functions
listmonk uses Go templates with Sprig functions:Testing Campaigns
Send test emails before launching:Test emails use actual subscriber data if the email exists in the database
Campaign Preview
Preview campaign rendering:- Preview in Browser: Renders campaign with dummy subscriber data
- Template Preview: Shows how content appears in selected template
- Archive Preview: Shows public archive page appearance
Campaign Analytics
Real-time Statistics
For running campaigns:- To Send: Total recipients
- Sent: Messages delivered
- Rate: Current sending rate (messages/minute)
- Net Rate: Average rate since campaign start
- Progress: Percentage complete
Post-Campaign Analytics
After campaign completes:Views
Track campaign opens
- Total views
- Unique views
- Views over time
- Per-subscriber views
Clicks
Track link clicks
- Total clicks
- Unique clicks
- Click rate
- Top links
Bounces
Monitor delivery failures
- Soft bounces
- Hard bounces
- Complaints
- Bounce rate
Timeline
View engagement over time
- Views by date
- Clicks by date
- Peak engagement times
Analytics API
Campaign Archives
Public archive feature for past campaigns:Enabling Archives
Archive Settings
- archive: Enable/disable public viewing
- archive_slug: Custom URL (auto-generated if empty)
- archive_template_id: Template for archive view
- archive_meta: Additional metadata (JSONB)
Enable public archives via Settings → App →
enable_public_archive/archive/{archive_slug} or /archive/{campaign_uuid}
Custom Headers
Add custom email headers:Reply-To: Set reply addressX-*: Custom headers for filtering/trackingList-ID: Mailing list identifier
Messengers
Campaigns can use different sending backends:- email: Default SMTP messenger
- email-0, email-1, etc.: Specific SMTP servers
- Custom messengers (webhooks, SMS, etc.)
Media Attachments
Attach media files to campaigns:- Embedded in email templates
- Accessible via template variables
- Tracked in
campaign_mediatable
Bulk Operations
Delete Multiple Campaigns
Query Campaigns
Filter campaigns by:- Status: Draft, running, scheduled, etc.
- Tags: Organization tags
- Query: Search by name
- Order: Sort by name, created_at, updated_at
Performance Settings
Configure sending performance:- Concurrency: Number of concurrent workers (
app.concurrency) - Message Rate: Messages per second (
app.message_rate) - Batch Size: Subscriber query batch size (
app.batch_size) - Max Send Errors: Stop campaign after N errors (
app.max_send_errors) - Sliding Window: Advanced rate limiting (
app.message_sliding_window)
Database Schema
Best Practices
Test First
Always send test emails before launching to real subscribers
Use Templates
Create reusable templates for consistent branding
Monitor Progress
Watch running campaigns for errors and performance issues
Schedule Wisely
Send during optimal engagement times for your audience
Track Engagement
Enable tracking to measure campaign effectiveness
Segment Lists
Target specific audiences with relevant content