Campaign Model
| DB Table Name | {wp_db_prefix}_fc_campaigns |
|---|---|
| Schema | Check Schema |
| Source File | fluent-crm/app/Models/Campaign.php |
| Name Space | FluentCrm\App\Models |
| Class | FluentCrm\App\Models\Campaign |
Global Scope
This model has a global scope that filters by type = 'campaign'. Every query automatically includes WHERE type = 'campaign'. Submodels like FunnelCampaign override this with their own type.
Attributes
| Attribute | Data Type | Comment |
|---|---|---|
| id | Integer | |
| parent_id | Integer | |
| type | String | Auto-set to 'campaign' by global scope |
| title | String | |
| available_urls | Text | |
| slug | String | Auto-sanitized via mutator |
| status | String | draft | scheduled | working | sent | 0 (archived) |
| template_id | Integer | |
| email_subject | String | |
| email_pre_header | String | |
| email_body | Text | |
| recipients_count | Integer | Cast to int via accessor |
| delay | Integer | |
| utm_status | Boolean | |
| utm_source | String | |
| utm_medium | String | |
| utm_campaign | String | |
| utm_term | String | |
| utm_content | String | |
| design_template | String | |
| scheduled_at | Date Time | |
| settings | Text | Serialized array, auto serialize/unserialize via mutators |
| created_by | Integer | |
| created_at | Date Time | |
| updated_at | Date Time |
Virtual Attributes (Accessors)
| Attribute | Returns | Description |
|---|---|---|
rendered_body | String | Rendered HTML body via Template parser |
subject | String | First A/B Subject value, or email_subject fallback |
Usage
Please check Model Basic for Common methods.
Accessing Attributes
$campaign = FluentCrm\App\Models\Campaign::find(1);
$campaign->id; // returns id
$campaign->title; // returns title
$campaign->settings; // returns deserialized array (auto via accessor)
$campaign->subject; // returns A/B subject or email_subject
$campaign->rendered_body; // returns rendered HTML
.......Scopes
This model has the following scopes that you can use
ofType($status)
Filter campaign by status
- Parameters
- $status - string
Usage:
// Get all campaigns with published status
$campaigns = FluentCrm\App\Models\Campaign::ofType('published')->get();archived()
Filter archived campaigns (status = 0)
Usage:
// Get all archived campaigns
$campaigns = FluentCrm\App\Models\Campaign::archived()->get();Relations
This model has the following relationships that you can use
template
Access the associated template of a model
- return
FluentCrm\App\Models\TemplateModel
Example:
// Accessing Template
$campaignTemplate = $campaign->template;
// Get Campaigns which has post_status: publish
$campaigns = FluentCrm\App\Models\Campaign::whereHas('template', function($query) {
$query->where('post_status', 'publish');
})->get();emails
Access all the associated emails of a model (all email types)
- return
FluentCrm\App\Models\CampaignEmailModel Collections
Example:
// Accessing CampaignEmails
$campaignEmails = $campaign->emails;campaign_emails
Access only campaign-type emails (filtered by email_type = 'campaign')
- return
FluentCrm\App\Models\CampaignEmailModel Collections
Example:
// Accessing only campaign emails (excludes sequence emails)
$campaignEmails = $campaign->campaign_emails;subjects
Access all the A/B subject lines of a Campaign model
- return
FluentCrm\App\Models\SubjectModel Collections
Example:
// Accessing All the Subjects of campaign
$campaignSubjects = $campaign->subjects;labelsTerm
Access labels attached to this campaign via the fc_term_relations pivot table
- return
FluentCrm\App\Models\LabelModel Collections (BelongsToMany)
Example:
// Accessing labels via relationship
$labels = $campaign->labelsTerm;Methods
Along with Global Model methods, this model has these helper methods.
syncSubjects($subjects)
Create or update A/B subject lines for the campaign
- Parameters
- $subjects
array— array of['key' => weight, 'value' => text]items
- $subjects
- Returns
HasManyrelation
Usage
$campaign->syncSubjects([
['key' => 50, 'value' => 'Subject A'],
['key' => 50, 'value' => 'Subject B'],
]);subscribeBySegment($settings, $limit, $offset)
Subscribe contacts to a campaign based on segment settings
- Parameters
- $settings
array - $limit
boolean|intDefault: false - $offset
intDefault: 0
- $settings
- Returns
array—['result' => array, 'total_subscribed' => int, 'total_items' => int]
Usage
$response = $campaign->subscribeBySegment($settings, 10, 2);getSubscribersModel($settings)
Get Subscriber query builder by campaign settings
- Parameters
- $settings
array
- $settings
- Returns
Builderornull
Usage
$contactModel = $campaign->getSubscribersModel($settings);getSubscriberIdsBySegmentSettings($settings, $limit, $offset)
Get contact IDs by campaign settings (without creating CampaignEmail rows)
- Parameters
- $settings
array - $limit
boolean|intDefault: false - $offset
intDefault: 0
- $settings
- Returns
array—['subscriber_ids' => array, 'total_count' => int]
Usage
$result = $campaign->getSubscriberIdsBySegmentSettings($settings, 10, 2);getSubscriberIdsCountBySegmentSettings($settings, $status)
Get count of contacts matching segment settings
- Parameters
- $settings
array - $status
stringDefault: subscribed
- $settings
- Returns
int
Usage
$total = $campaign->getSubscriberIdsCountBySegmentSettings($settings, 'subscribed');subscribe($subscriberIds, $emailArgs, $isModel)
Enqueue campaign emails for subscribers
- Parameters
- $subscriberIds
arrayor Collection - $emailArgs
array— extra campaign_email fields - $isModel
boolean— if the $subscriberIds is a collection
- $subscriberIds
- Returns
array— inserted CampaignEmail IDs
Usage
$emailIds = $campaign->subscribe([1,2,5], [], false);unsubscribe($subscriberIds)
Remove contacts from a Campaign
- Parameters
- $subscriberIds
array
- $subscriberIds
- Returns
boolean
Usage
$result = $campaign->unsubscribe([1,2,3]);guessEmailSubject()
Select an A/B subject using weighted random selection
- Parameters
- none
- Returns
FluentCrm\App\Models\Subjectornull
Usage
$subject = $campaign->guessEmailSubject();getParsedText($text, $subscriber)
Parse SmartCode placeholders in text
- Parameters
- $text
string - $subscriber
Subscriber
- $text
- Returns
string
Usage
$parsed = $campaign->getParsedText('Hello {{contact.first_name}}', $subscriber);filterDuplicateSubscribers($subscriberIds, $subscribers)
Remove subscribers who already have a CampaignEmail for this campaign
- Parameters
- $subscriberIds
array - $subscribers
Collection
- $subscriberIds
- Returns
Collection
Usage
$unique = $campaign->filterDuplicateSubscribers([1,2,3], $subscribers);archive()
Archive a campaign (sets status to 0)
- Parameters
- none
- Returns
FluentCrm\App\Models\Campaign
Usage
$campaign->archive();getUtmParams()
Get UTM parameters if UTM tracking is enabled
- Parameters
- none
- Returns
array— non-empty UTM fields, or empty array
Usage
$utm = $campaign->getUtmParams();stats()
Get campaign statistics (total, sent, views, clicks, unsubscribers, revenue)
- Parameters
- none
- Returns
array
Usage
$campaignStats = $campaign->stats();getEmailCount()
Get raw email count for this campaign
- Parameters
- none
- Returns
int
Usage
$total = $campaign->getEmailCount();maybeDeleteDuplicates()
Remove duplicate CampaignEmail rows for this campaign
- Parameters
- none
- Returns
FluentCrm\App\Models\Campaign
Usage
$campaign->maybeDeleteDuplicates();getHash()
Get or generate a persistent campaign hash (stored in meta)
- Parameters
- none
- Returns
string
Usage
$hash = $campaign->getHash();deleteCampaignData()
Delete all associated data (emails, URL metrics, meta) but NOT the campaign itself
- Parameters
- none
- Returns
FluentCrm\App\Models\Campaign
Usage
$campaign->deleteCampaignData();rangedScheduleDates()
Get start/end dates for range-scheduled campaigns
- Parameters
- none
- Returns
array—['start' => 'Y-m-d H:i:s', 'end' => 'Y-m-d H:i:s']ornull
Usage
$dates = $campaign->rangedScheduleDates();getShareableUrl()
Get a public preview URL for the campaign
- Parameters
- none
- Returns
string— full URL
Usage
$url = $campaign->getShareableUrl();labels()
Get all labels attached to this campaign
- Parameters
- none
- Returns
CollectionofFluentCrm\App\Models\Label
Usage
$labels = $campaign->labels();getFormattedLabels()
Get labels in simplified format for API responses
- Parameters
- none
- Returns
Collectionof['id', 'slug', 'title', 'color']arrays
Usage
$labels = $campaign->getFormattedLabels();attachLabels($labelIds)
Attach labels to this campaign
- Parameters
- $labelIds
intorarray
- $labelIds
- Returns
FluentCrm\App\Models\Campaign
Usage
$campaign->attachLabels([1, 2, 3]);detachLabels($labelIds)
Remove labels from this campaign
- Parameters
- $labelIds
intorarray
- $labelIds
- Returns
FluentCrm\App\Models\Campaign
Usage
$campaign->detachLabels([1, 2]);getOpenTrackingStatus($globalFallback)
Get the campaign's open tracking setting
- Parameters
- $globalFallback
boolean— Defaulttrue. Falls back to site-wide setting
- $globalFallback
- Returns
stringornull—'yes','no','anonymous'
Usage
$status = $campaign->getOpenTrackingStatus();getClickTrackingStatus($globalFallback)
Get the campaign's click tracking setting
- Parameters
- $globalFallback
boolean— Defaulttrue. Falls back to site-wide setting
- $globalFallback
- Returns
stringornull
Usage
$status = $campaign->getClickTrackingStatus();