Email Campaigns
Email campaigns are intentional one-to-many sends — newsletters, announcements, promotions, recap emails — composed by you and delivered to a chosen audience. ClientCove handles segmentation, batch processing, open/click tracking, and unsubscribe management.
What Campaigns Are For
Use campaigns when you need to send the same email to many people:
- Monthly portal newsletter
- Feature announcement
- Holiday hours notice
- Service-status update affecting all clients
- Welcome series to new accounts (manually triggered, not auto-sequenced)
- Account-status check-ins
- Client appreciation messages
Don't use campaigns for:
- One-off emails to a single person (use the messaging feature instead)
- Service-related auto-emails (use Transactional Emails)
- Spam or unsolicited marketing to non-portal users (campaigns target your portal users only)
The Campaigns Dashboard
Open /email-campaigns/ (admin / editor / approved representative). The dashboard shows:
Top toolbar
- Page title with megaphone icon
- Breadcrumb (Home → Email Campaigns)
- Email Templates button — opens the Email Designer
- Create Campaign button — opens the create modal
Filters
- Search — matches campaign name and subject
- Status dropdown — All / Draft / Scheduled / Sending / Sent / Paused / Cancelled
- Live count of filtered campaigns
Table
Columns: Campaign Name, Subject, Audience, Status, Scheduled/Sent Date, Stats, Actions
Each row is clickable to open the campaign details. Stats column shows recipients / opens / clicks at a glance.
Stats summary
At the top of the dashboard, summary cards show:
- Total campaigns sent (lifetime)
- Total recipients reached
- Average open rate
- Average click rate
Campaign Statuses
A campaign moves through these states:
| Status | Meaning |
|---|---|
| Draft | Created but not scheduled or sent — fully editable |
| Scheduled | Configured to send at a future date/time — waiting in the queue |
| Sending | Cron is actively processing batches |
| Sent | All batches completed — final stats available |
| Paused | Mid-send pause — batches stopped, can be resumed |
| Cancelled | Manually cancelled before completion — partial sends count |
Status transitions:
- Draft → Scheduled when you set a future send date and save
- Draft → Sending when you click "Send Now"
- Scheduled → Sending when the scheduled time arrives
- Sending → Sent when all batches complete
- Sending → Paused when you click Pause
- Paused → Sending when you click Resume
- Any → Cancelled when you click Cancel
Creating a Campaign
- Click Create Campaign in the dashboard toolbar
- The Create Campaign modal opens
- Fill in the fields below
- Save as Draft, or Schedule, or Send Now
Campaign Name (required)
Internal name for your reference. Recipients don't see this. Examples:
- "May 2026 Monthly Newsletter"
- "New Feature Announcement — Resource Library"
- "Q2 Client Check-In"
Email Subject (required)
The subject line recipients see. Best practices:
- Keep under 50 characters (mobile previews truncate)
- Front-load the most important word
- No "FW:" or "RE:" prefixes (they look like spam)
- Avoid all-caps or excessive punctuation
Email Template (required)
Pick from your Email Designer templates. The dropdown shows all templates marked as Marketing or Daily Digest type, plus any Transactional template you want to repurpose.
If no templates appear, create one first in the Email Designer (button in the toolbar).
From Name (required)
The sender name shown in the recipient's inbox. Typically your portal name or a specific person ("Jane from Acme Portal").
From Email (required)
The sender email. Must be an address you've authorized in your SMTP provider's verified senders list — otherwise emails will fail to deliver.
Audience Segment (required)
See Audience Segments below for the options.
Schedule
- Send Now (default for Save and Send button)
- Send Later — pick a date and time
Audience Segments
ClientCove offers three segment types:
All Users
Sends to every user with a portal account who hasn't unsubscribed. Useful for portal-wide announcements (security updates, major feature launches, holiday hours).
Specific Clients
Sends to all users assigned to one or more selected clients. The dropdown lists every client; pick one or many. Useful for:
- Client-tier-specific announcements
- Account check-ins for specific accounts
- Notices to enterprise vs SMB clients
Custom Users
Manually pick specific user IDs. Useful for:
- VIP communications to specific people
- Test sends to a small group before broader rollout
- Targeted messages based on criteria not covered by other segments
The segment configuration is stored as JSON in the campaign_segment_data field. The structure varies:
- All Users: empty / not used
- Specific Clients: array of client post IDs
- Custom Users: array of user IDs
Recipient resolution
At send time (not creation time), ClientCove resolves the segment to actual user records:
- Apply the segment criteria
- Filter out users who've unsubscribed
- Filter out users without valid email addresses
- Return the final recipient list
This means if you create a campaign on Monday targeting "all users" and 5 new users sign up on Tuesday, the Tuesday users WILL be included if the campaign sends on Wednesday.
Scheduling
When you save a campaign with a future date/time:
- Status flips to Scheduled
- The
campaign_scheduled_atfield stores the timestamp - A WordPress cron (hourly) checks for due campaigns
- When the scheduled time arrives, the campaign moves to Sending
- Batches start processing
Cron requirements
For accurate scheduling, WordPress cron must fire reliably. For low-traffic portals, set up a system cron:
* * * * * curl -s https://yourportal.com/wp-cron.php?doing_wp_cron > /dev/null
Without this, scheduled campaigns may send late on quiet days when no one is hitting the site.
Time zones
Campaign scheduling uses your WordPress timezone setting. Verify under Settings → General that the timezone matches where you (and most of your team) work. Scheduling for "9 AM tomorrow" sends at 9 AM in your portal's timezone.
Sender Identity
The From Name and From Email on campaigns are per-campaign — different from the global transactional defaults. This lets you:
- Send from "Marketing Team" for newsletters
- Send from "Customer Success" for check-ins
- Send from a specific staff member's name for personal-feeling outreach
Authentication still applies
Whatever From email you use must be authorized in your SMTP provider. If your SMTP only authorizes *@yourdomain.com, you can't send from external-vendor@othersite.com even if you put it in the From Email field.
Reply-To
Replies go to the From Email by default. To redirect replies to a different inbox, configure Reply-To in your SMTP plugin or override it in the campaign template's HTML headers.
Sending in Batches
ClientCove sends campaigns in batches rather than blasting all recipients at once. Why:
- Avoid SMTP rate limits
- Distribute load on your server
- Allow pause/resume mid-send
- Improve deliverability (huge bursts trigger spam filters)
Batch size
Default: 100 recipients per batch, configurable per campaign via campaign_batch_size.
A campaign to 1,000 recipients with batch size 100 sends 10 batches. With WordPress cron firing every few minutes, the full send completes in 30-60 minutes.
How batches process
- The
clientcove_process_campaign_batchcron action fires - Loads the next batch of pending recipients
- Renders the email for each (with merge tags filled in)
- Sends each email via
wp_mail() - Records the send in the campaign's send log
- Updates the campaign's stats counters
- Schedules the next batch
If a batch fails entirely (e.g. SMTP outage), it's retried on the next cron run. Individual recipient failures (bad email, bounce) are logged but don't block the rest of the batch.
Send pacing
For very large lists or rate-limited providers, increase the time between batches:
- Custom batch size (e.g. 50 instead of 100)
- Manual pause/resume to spread sends over hours
- Schedule the campaign to start during off-peak hours
Open & Click Tracking
ClientCove tracks two engagement metrics:
Open tracking
A 1×1 invisible image (tracking pixel) is embedded in every campaign email. When the recipient opens the email, their email client loads the image, which hits ClientCove's tracking endpoint and logs the open.
URL pattern:
/?ccove_track=open&h=<tracking_hash>
The tracking_hash is unique per recipient per campaign, so opens are recorded individually.
Click tracking
Every link in the email body is rewritten at send time to route through a tracking redirect:
Original:
<a href="https://example.com/feature">
Becomes:
<a href="https://yourportal.com/?ccove_track=click&h=<hash>&url=<encoded-url>">
When the recipient clicks:
- They hit the tracking URL
- ClientCove logs the click with timestamp
- ClientCove redirects to the original URL
- The recipient lands on the intended destination
Skipped from tracking (don't get rewritten):
- Unsubscribe links (always go directly to the unsubscribe page)
- Mailto links (
mailto:) - Anchor links (
#section) - Already-tracking links (avoid double-wrapping)
Privacy considerations
Open tracking via pixel is widely used but has limitations:
- Email clients with image-blocking (Outlook by default in some versions) won't fire the pixel
- Apple Mail's Privacy Protection feature pre-loads images, so all opens look like immediate opens
- Some recipients block tracking pixels deliberately
Click tracking is more reliable but introduces a slight redirect delay.
Campaign Stats
For each sent campaign, the dashboard shows:
| Metric | What it counts |
|---|---|
| Total Recipients | Resolved audience size at send time |
| Total Sent | Successful email deliveries |
| Total Opened | Unique opens (one open counted per recipient even if they open multiple times) |
| Total Clicked | Unique clicks (one click counted per recipient per link) |
| Total Failed | Delivery failures (bad email, bounces, SMTP errors) |
Calculated rates:
- Delivery rate = Sent / Recipients
- Open rate = Opened / Sent
- Click rate = Clicked / Sent
- Click-to-open rate (CTOR) = Clicked / Opened
Click into a campaign to see:
- Per-recipient send status (Sent / Opened / Clicked / Failed)
- Timeline of opens and clicks
- Most-clicked links
Stats are post-send
Stats start populating as soon as the first batch sends. They update in near-real-time as recipients open and click. For large campaigns, expect stats to be incomplete until the full send completes.
Pausing & Cancelling
Mid-send actions:
Pause
- Open a campaign in Sending status
- Click Pause
- The current batch finishes; subsequent batches are skipped
- Status flips to Paused
Use Pause when:
- You spotted a typo or mistake
- Your SMTP is hitting rate limits
- You want to spread the send over more time
Resume
- Open the paused campaign
- Click Resume
- Pending batches restart from where they left off
Cancel
- Open the campaign (Draft, Scheduled, Sending, or Paused)
- Click Cancel
- Confirm
Cancelled campaigns:
- Stop sending
- Already-sent emails can't be unsent (recipients already received them)
- Status flips to Cancelled
- Partial stats are preserved
- The campaign stays in the database for record
Unsubscribe Handling
Every campaign email includes an unsubscribe link in the footer (the Email Designer's footer block adds it automatically for marketing templates).
When a recipient clicks unsubscribe:
- They land on a confirmation page
- ClientCove records the unsubscribe in their user profile
- They're filtered out of all future campaigns
- Transactional emails still send (functional, can't be opted out of)
Per-category opt-out
Future ClientCove versions may allow per-category unsubscribes (unsubscribe from newsletters but keep service emails). Currently, unsubscribe is global for marketing campaigns.
Re-subscribing
Users can re-subscribe by:
- Going to their portal profile → Notification Preferences
- Toggling "Receive marketing emails" back on
There's no separate re-subscribe link in emails (unsubscribed users won't get more emails to click on).
Compliance
Email campaigns must follow anti-spam regulations:
CAN-SPAM (United States)
- Don't use false or misleading header information
- Don't use deceptive subject lines
- Identify the message as an ad (when applicable)
- Tell recipients where you're located (physical postal address)
- Tell recipients how to opt out
- Honor opt-out requests promptly (within 10 business days)
- Monitor what others are doing on your behalf
CASL (Canada)
- Express consent required (no implied opt-in)
- Clear identification of sender
- Unsubscribe mechanism that works for at least 60 days
GDPR (Europe)
- Lawful basis for processing (consent, legitimate interest)
- Clear privacy disclosure
- Right to access, rectify, erase data
- Unsubscribe must be as easy as subscribing
ClientCove's compliance support
- Unsubscribe links auto-included in marketing templates
- User preferences stored and respected
- Audit log of who unsubscribed when
- Can export user data on request (admin function)
For specific compliance requirements in your jurisdiction, consult your legal counsel — these are general guidelines, not legal advice.
Campaigns are powerful — and easy to misuse. Sending too many marketing emails causes unsubscribes and damages your sending reputation. Established best practice is to send marketing emails sparingly (monthly newsletter at most for B2B, weekly at most for B2C), to clear segments who actually want them, with content that's genuinely useful. The campaigns feature is the tool; restraint and quality content are what make it work.