7.1 Overview

A Campaign organizes outbound telephone activity around a specific message, caller ID, Contact audience, human Agent, AI Agent, recording preference, concurrency level, retry policy, and launch schedule.

The standard Campaign process is:

Prepare Contacts
Create Campaign
Choose TTS, Audio, or AI Agent
Select Caller ID
Add Campaign Contacts
Configure message and variables
Save as Draft, Launch, or Schedule
Monitor Calls
Pause or Resume when necessary
Review results and follow up

AIUNIFY Call Center supports standard browser Campaign routes for creating, viewing, editing, launching, pausing, resuming, deleting, uploading Campaign Contacts, opening a manual Call Queue, and placing an On-Demand test Call.

Campaign Access

7.2 KYC Requirement

Campaign routes are protected by the Basic KYC middleware.

When KYC is enabled, a Customer generally requires:

Approved Basic KYC
or
Approved Business KYC

Administrators and Agents follow the KYC exceptions described in Chapter 2.

7.3 Campaign Permissions

Campaign access can require:

campaigns.view
campaigns.create
campaigns.edit
campaigns.delete
campaigns.execute
campaigns.analytics

A visible Campaign action does not guarantee that the backend will authorize it.

7.4 Administrator Scope

An Administrator can generally:

View all Campaigns
Create Campaigns
Edit Campaigns
Execute Campaigns
Delete eligible Campaigns
View Campaign Analytics
Assign active Agents

provided the corresponding permissions are assigned.

7.5 Customer Scope

A Customer can generally manage Campaigns whose:

user_id = Customer User ID

7.6 Agent Scope

An Agent can view and execute only Campaigns whose:

assigned_agent_id = Agent User ID

The Campaign policy does not permit Agents to edit or delete Campaigns.

7.7 Agent Interface Mismatch

The Campaign cards determine which buttons to display primarily from Campaign Status.

They do not consistently hide Edit and Delete according to the signed-in user’s permission.

An Agent assigned to a Draft Campaign can therefore see an Edit or Delete control that the backend later rejects.

Opening Campaigns

7.8 Campaign List

From the Sidebar:

Campaigns
→ All Campaigns

The page address is:

/campaigns

7.9 Campaign List Controls

The page contains:

Campaigns Help
Create Campaign
Status filters
Campaign cards
View
Edit
Launch
Pause
Resume
Delete

7.10 Campaign Page Size

The backend returns:

15 Campaigns per page

7.11 Missing Pagination Controls

Although the controller paginates Campaigns, the current Campaign index does not render its pagination links.

When more than fifteen Campaigns exist, only the first page may be accessible through the normal Campaign interface.

Campaign Statuses

7.12 Current Status Values

The Campaign model supports:

draft
scheduled
running
paused
completed
failed

7.13 Draft

A Draft Campaign is saved but has not entered normal automated processing.

A Draft can generally be:

Edited
Launched
Deleted

7.14 Scheduled

A Scheduled Campaign has a future scheduled_at value and is intended to begin automatically.

Current scheduling defects are explained later in this chapter.

7.15 Running

A Running Campaign is eligible for automated processing.

Campaign-processing jobs look for:

status = running

7.16 Paused

A Paused Campaign stops new Campaign-processing jobs from initiating additional Calls.

Already initiated provider Calls are not canceled merely because the Campaign Status changes to Paused.

7.17 Completed

A Completed Campaign has no remaining Pending or Queued Campaign Contacts and no active Campaign Call records.

A Campaign can complete even when some Contacts failed.

7.18 Failed

Failed indicates that the Campaign-processing job encountered a terminal job failure.

The model permits a Failed Campaign to transition back toward Draft, but the normal user interface does not provide a dedicated Restart or Reset-to-Draft control.

Campaign Status Filters

7.19 Visible Filters

The Campaign list displays filters for:

All
Draft
Running
Paused
Completed
Failed

7.20 Scheduled Filter Missing

The index does not include a Scheduled filter.

More importantly, its frontend Status configuration does not define scheduled.

Because the Campaign card directly reads the missing Scheduled configuration, the presence of a Scheduled Campaign can cause the Campaign list to render incorrectly or fail with a frontend error.

The Campaign Details page does recognize Scheduled Status, but the Campaign index currently does not.

Campaign Cards

7.21 Campaign Card Information

Each Campaign card displays:

Campaign Name
Campaign Type
Status
Progress
Total Contacts
Called count
Answer Rate
Actions

7.22 Progress Calculation

Progress is calculated as:

Total Called
÷
Total Contacts
×
100

7.23 Called Count Limitation

The platform increments total_called when a Call first reaches:

in-progress

A Call attempt that ends as Busy, No Answer, Failed, or Canceled without first reaching In Progress may not increase Total Called.

A Campaign can therefore finish while its visible progress remains below 100%.

7.24 Answer Rate

Answer Rate is calculated as:

Total Answered
÷
Total Called
×
100

7.25 Answered Count Limitation

Total Answered is incremented when:

Call Status = completed
and
Answered By is present and not unknown

A completed Call can fail to increase Total Answered when the provider does not supply a usable AnsweredBy value.

Creating a Campaign

7.26 Opening Create Campaign

Select:

Create Campaign

or open:

/campaigns/create

The page description is:

Set up a new voice calling campaign

7.27 Create Page Sections

The current form contains:

Start from a Template
Select Contact Lists
Assign to Agent
Basic Information
Caller ID / Phone Number
Campaign Message and Variables
Voice Settings
or Audio File
Campaign Settings
DTMF Settings
Campaign Launch

Campaign Templates

7.28 Starting from a Template

The template selector contains:

System Templates
Customer-created Templates

Template categories can include:

Promotional
Lead Qualification
Survey
Notification
Personalized
General

7.29 Template Application

Selecting a Template can prefill:

Campaign Name
Campaign Type
Message
Language
Voice
Recording setting
DTMF enabled state

7.30 Template Fields Not Applied

Although Template data can contain DTMF Actions, the current Create page does not copy those Actions when applying the Template.

It applies only the general DTMF enabled value.

7.31 Template Overwrites Current Values

Selecting another Template replaces portions of the current Campaign form.

Review the Campaign Name, message, voice, recording, and DTMF values after changing Templates.

Selecting Contact Lists

7.32 Contact List Selector

Existing Contact Lists appear with:

List Name
Description
Contact count
Selection checkbox

One or more Lists can be selected.

7.33 Contact Count Preview

The form adds the displayed Contact counts from each selected List.

This preview does not account for the same Phone Number appearing in more than one selected List.

The final Campaign import skips duplicate Phone Numbers within the Campaign.

7.34 Contact List Copy Behavior

When the Campaign is created, the system copies each selected master Contact into a Campaign Contact.

The copied information includes:

Phone Number
First Name
Last Name
Email
Status = pending
Call Attempts = 0

7.35 Information Not Copied from Lists

The current List attachment process does not copy:

Company
Website
Contact Tags
Contact Notes
Custom variables
Contact ID relationship
Opt-out state
Status
Time Zone

This can limit personalization and compliance traceability.

A selected List should be reviewed before use to confirm that only contactable people are included.

7.36 List Ownership Limitation

The form normally shows only the current user’s Contact Lists.

The backend validates that submitted List IDs exist, but it does not consistently verify that every selected List belongs to the Campaign owner.

Users should never modify submitted List IDs manually.

Assigning a Human Agent

7.37 Assign to Agent

A Customer can optionally select an active Agent belonging to that Customer.

An Administrator can select from active Agent-role users more broadly.

7.38 Unassigned Campaign

Leaving the Agent field blank creates an unassigned Campaign.

An unassigned Campaign can still run automatically.

7.39 Agent Assignment Purpose

The assignment controls:

Which Agent can see the Campaign
Which Agent can execute the Campaign
Whether the manual Campaign Call Queue button appears

It does not convert the automated Campaign into a human-only Campaign.

7.40 Clearing an Assignment

The form provides:

Clear assignment

on Create and Edit when an Agent has been selected.

Basic Information

7.41 Campaign Name

Campaign Name is required.

Maximum length:

255 characters

Use a descriptive Name such as:

August Customer Renewal Outreach

7.42 Campaign Type

The two standard types are:

Text to Speech
Voice to Voice

7.43 Text to Speech

Text to Speech converts the saved Campaign message into provider-generated speech.

It supports:

Message variables
Language selection
Voice selection
DTMF
Recording
AI-generated message assistance
Message variants

7.44 Voice to Voice

Voice to Voice plays a previously uploaded Audio File.

Despite its name, the current standard implementation is prerecorded audio playback rather than a live human voice conversation.

7.45 AI Agent Override

When the selected Phone Number is attached to an active AI Agent, the Campaign automatically stores that AI Agent.

During automated Campaign processing, the AI Agent path takes priority over:

Static TTS message
Prerecorded audio playback

Caller ID and Phone Number

7.46 Phone Number Requirement

A Phone Number is required before normal Campaign launch.

Selecting:

No Phone Number (Draft Only)

forces a newly created Campaign to Draft, even when the user selected Immediate or Scheduled launch.

7.47 Available Phone Numbers

The Create page currently retrieves Phone Number records that:

Belong to the signed-in user
and
Have a Twilio SID

SIP-only or BYOC-only numbers without a Twilio SID are not displayed in this selector.

7.48 Caller ID Information

The selector can display:

Formatted Phone Number
Friendly Name
Assigned AI Agent
AI Agent active state

7.49 Automatic AI Agent Assignment

When an active AI Agent has the exact selected Phone Number, the Campaign stores that Agent’s ID.

The page displays:

AI Agent Will Handle Calls

7.50 Changing the Phone Number

When editing and selecting a number with an active AI Agent, the Campaign is assigned to that Agent.

When selecting a number without an AI Agent, the update process clears the Campaign’s AI Agent.

7.51 Removing a Phone Number During Edit

When the Phone Number is changed to None, the Campaign’s phone_number_id can be cleared.

However, the current update logic does not reliably clear the previous:

from_number
ai_agent_id

when the submitted Phone Number is null.

The Campaign can therefore retain an old caller ID or AI Agent internally after the visible Phone Number is removed.

7.52 Phone Ownership Validation Limitation

The backend validates only that phone_number_id exists.

It does not explicitly confirm in the Campaign store/update validation that the Phone Number belongs to the Campaign owner.

Use only numbers displayed by the normal selector.

Campaign Messages

7.53 Message Requirement

A Text-to-Speech Campaign must have a Message before it can be launched through the normal Launch action.

7.54 Message Length

The backend limit is:

250 characters

The Message editor displays a counter but does not prevent typing beyond 250 characters.

A message longer than 250 characters is rejected when the form is submitted.

7.55 Character Counter

The counter changes emphasis as the Message approaches its limit:

Below 200:
Normal

200 or more:
Warning

240 or more:
Stronger warning

250 or more:
Red

7.56 Standard Contact Variables

Built-in Contact variables include:

{{first_name}}
{{last_name}}
{{email}}
{{company}}
{{phone_number}}

7.57 Campaign Variables

Campaign variables use one shared value across all Campaign Contacts.

Example:

{{offer_name}} = Summer Upgrade

{{discount}} = 20

7.58 Contact Variables

Contact variables can have a different value for each Campaign Contact.

Example:

{{account_manager}}
{{appointment_date}}
{{membership_level}}

The values normally come from Campaign Contact custom variables imported from CSV.

7.59 Variable Name Format

Custom variable names must begin with:

A lowercase letter
or
an underscore

and can contain:

Lowercase letters
Numbers
Underscores

Example:

account_manager
offer_2026

7.60 Message Syntax

Variables must use double braces:

{{variable_name}}

The AI Agent greeting system uses a different single-brace syntax for its own First Message:

{first_name}
{last_name}
{company}

Do not mix the two formats.

7.61 TTS Variable Replacement Order

The Campaign TTS handler replaces:

1. Campaign-level variables
2. Standard Campaign Contact fields
3. Custom Campaign Contact variables

7.62 Undefined Variables

The editor warns when a variable is used but not defined.

The normal Launch action does not independently reject every undefined Contact variable.

A missing variable can remain in the Message sent to the TTS processor.

7.63 Missing Campaign Variable Values

The Launch action checks Campaign variables used in the Message.

When a used Campaign variable has no value, launch is rejected with an error similar to:

Campaign variable '{{offer_name}}' is used in the message but has no value.
Please provide a value before launching.

7.64 Contact Variable Coverage

The interface can define expected Contact variables, but normal Launch does not verify that every Campaign Contact contains every expected value.

Review CSV data before launch.

7.65 Example Personalized Message

Hello {{first_name}}, this is a reminder from {{company_name}}
about your {{offer_name}} opportunity.

AI Message Assistance

7.66 Generate with AI

The Message editor offers:

Generate with AI

The user describes the intended message, and the application requests a generated version.

7.67 Enhance with AI

The editor also offers:

Enhance with AI

The service is instructed to preserve variables and remain within the 250-character limit.

7.68 Provider Requirement

AI Message assistance requires the configured AI messaging service.

When the provider or API key is unavailable, the dialog displays the returned error and does not replace the current Message.

7.69 Review AI Messages

Before using an AI-generated Message, confirm:

Campaign purpose
Factual accuracy
Brand wording
Legal disclosure
Variable syntax
Character count
Opt-out language where required

Message Variants

7.70 AI Variants

After a Text-to-Speech Campaign is created, its Edit page can offer AI-generated Message Variants.

The Create page describes five possible tones:

Professional
Friendly
Urgent
Educational
Direct

7.71 Variant Selection During Calls

When active Variants exist:

A selected winner is used exclusively
or
An active Variant is selected for A/B testing

The system initially favors random distribution and later applies a limited performance weighting.

7.72 Default Message Fallback

When no active Variant exists or Variant selection fails, the Campaign’s default Message is used.

Voice Settings

7.73 Language Options

Visible language choices include:

English — United States
English — United Kingdom
English — Australia
Spanish — Spain
Spanish — Mexico
French
German

7.74 Voice Options

Visible voices include:

Joanna
Matthew
Ivy
Joey
Justin
Kendra
Kimberly
Salli
Nicole
Russell
Amy
Emma
Brian

7.75 Voice and Language Compatibility

The interface does not automatically restrict each Voice to a matching Language.

Test the selected Voice and Language combination before production use.

Audio Campaigns

7.76 Selecting an Audio File

Voice-to-Voice Campaigns require an uploaded Audio File.

The selector displays Audio Files owned by the signed-in user.

7.77 No Audio Files

When none exist, the form directs the user to:

Audio Files

to upload one.

7.78 Launch Requirement

The normal Launch action rejects a Voice-to-Voice Campaign without an Audio File.

7.79 Audio URL Requirement

The provider must be able to reach the Audio File’s URL.

A file can appear in the selector yet fail during a Call when its public playback URL is inaccessible.

Campaign Settings

7.80 Recording

The user can enable Call Recording for Campaign Calls.

Recording is passed into Campaign Call creation and provider configuration.

Consent, disclosure, retention, and access rules remain the Customer’s responsibility.

7.81 DTMF

The general Campaign Settings section contains an Enable DTMF checkbox.

A separate DTMF Settings Card also contains another Enable DTMF checkbox.

Both control the same form state.

7.82 Maximum Concurrent Calls

The interface describes a range of:

1–100

The backend accepts only:

1–50

Values from 51 through 100 are displayed as permitted by the form but rejected by server validation.

7.83 Retry Attempts

The interface describes:

0–5

The backend accepts:

0–10

The visible field prevents ordinary users from entering the backend’s higher supported values.

7.84 Retry Delay

The interface allows:

1–1,440 minutes

The backend accepts only:

1–60 minutes

A value above 60 is rejected at submission.

7.85 Default Create Values

The Create page initially uses:

Maximum Concurrent Calls: 5
Retry Attempts: 2
Retry Delay: 5 minutes
Recording: Disabled
DTMF: Disabled

The backend model-level creation defaults differ slightly in some cases, but the form values are submitted for normal browser creation.

DTMF Settings

7.86 DTMF Purpose

DTMF allows the recipient to press keypad digits in response to a Campaign message.

Visible configuration includes:

Number of digits
Input timeout
Prompt message
Key
Label
Action
Action value

7.87 Visible DTMF Actions

The interface offers:

Play Message
Transfer to Number
Opt-Out and Remove
Mark as Interested
Request Callback
End Call

7.88 DTMF Response Tracking

The backend can store:

Pressed digits
Action taken
Action result
Action details

Campaign Details can display DTMF response Analytics when usable configuration and responses exist.

7.89 DTMF Persistence Defect

The Create and Edit actions currently save the general:

enable_dtmf

flag, but they do not persist the detailed DTMF configuration displayed by the form.

The current Campaign actions omit:

dtmf_num_digits
dtmf_timeout
dtmf_prompt
dtmf_actions

from the Campaign create and update operations.

7.90 DTMF Action Value Defect

Even the controller validation does not preserve the visible DTMF Action value field used for:

Transfer destination
Custom message
Opt-out message
Callback message
Hangup message

The DTMF interface therefore overstates what is currently saved.

Do not rely on custom DTMF Actions until the create and update actions are corrected and tested.

Campaign Launch Options

7.91 Available Options

The Create page offers:

Save as Draft
Launch Immediately
Schedule for Later

7.92 Save as Draft

Draft is the safest option for a new Campaign.

It allows the user to:

Review Contacts
Review Variables
Test the caller ID
Confirm Credits
Confirm provider configuration
Launch later

7.93 Launch Immediately

The interface states that Calls will begin as soon as the Campaign is created.

The current implementation instead creates the Campaign directly with:

status = running
started_at = current server time

7.94 Immediate Launch Validation Difference

Immediate creation does not call the normal LaunchCampaignAction.

It therefore does not apply the normal launch checks for:

At least one Campaign Contact
TTS Message
Audio File
Missing Campaign-variable values

A Campaign can be created as Running without passing the same checks required by the normal Launch button.

7.95 Immediate Processing Delay

Immediate creation does not directly dispatch the Campaign-processing job.

The application scheduler searches for Running Campaigns every minute and dispatches processing.

“Launch Immediately” can therefore wait until the next scheduler run.

7.96 Empty Immediate Campaign

When an Immediate Campaign has no Contacts, the processing job can find no work and mark the Campaign Completed.

The Campaign can therefore move:

Running
Completed

without placing a Call.

Scheduling

7.97 Scheduling Field

Selecting Schedule for Later reveals:

Start Date & Time

The browser requires a value at least approximately five minutes in the future.

7.98 Server Validation

The backend requires:

scheduled_at is a valid date
and
scheduled_at is after now

during creation.

7.99 Time-Zone Mismatch

The interface says the Campaign starts in:

your local timezone

However, the browser submits a datetime-local value without a time-zone offset, and the current Laravel application Time Zone is UTC.

The server can interpret the entered clock time as UTC rather than the user’s local Time Zone.

A scheduled time entered as 9:00 AM Eastern can therefore be stored incorrectly.

7.100 Scheduler Frequency

The application scheduler checks for due Scheduled Campaigns:

Every minute

A server cron process must run Laravel’s scheduler for this to occur.

7.101 Scheduled Launch Defect

The scheduler sends each due Scheduled Campaign into the normal Launch action.

That Launch action accepts only:

draft
paused

It rejects:

scheduled

with:

Campaign must be in draft or paused status to launch

Consequently, Scheduled Campaigns cannot currently auto-launch successfully through the reviewed scheduling path.

7.102 Scheduled Edit Defect

The Campaign Details page displays Edit for a Scheduled Campaign that has not started.

The update action permits updates only when Status is:

draft
paused

Saving changes to a Scheduled Campaign can therefore fail with:

Cannot update campaign in scheduled status

7.103 No Reschedule Control

The current Edit page does not display:

Launch Type
Scheduled Date
Scheduled Time
Cancel Schedule
Return to Draft

There is no normal working reschedule workflow in the current interface.

7.104 Safe Scheduling Procedure

Until scheduling is corrected:

Save Campaign as Draft
Review the intended start time separately
Launch manually at the approved time

Submitting the Campaign

7.105 Create Buttons

The Create button changes according to launch choice:

Save as Draft
Create & Launch
Create & Schedule

7.106 Creation Confirmation

On success:

Campaign created successfully

appears and the Campaign Details page opens.

7.107 No Phone Number

When no Phone Number is selected, creation forces:

launch_type = draft

even when the visible choice was Immediate or Scheduled.

Campaign Details

7.108 Opening Details

Select View on a Campaign card.

The page address is:

/campaigns/[Campaign ID]

7.109 Details Header Actions

Depending on Status, assignment, and activity, the page can display:

Save as Template
Analytics
Call Queue
Edit
Launch
Pause
Resume
On Demand Start
Delete
Refresh

7.110 Automatic Refresh

While the Campaign Status is Running, the page reloads Campaign information approximately every:

5 seconds

7.111 Manual Refresh

A separate Refresh icon appears for Running Campaigns.

7.112 Summary Statistics

The Details page displays:

Total Contacts
Called
Answered
Failed

7.113 Details Information

The page can show:

Campaign Type
From Number
AI Agent
Language
Voice
Audio File
Recording state
DTMF state
Maximum Concurrent Calls
Retry Attempts
Message
Variables

7.114 Limited Contact and Call Lists

The backend loads only the latest:

10 Campaign Contacts
10 Campaign Calls

for the Campaign Details tabs.

The totals can be larger than the visible records.

There is no pagination in these two Details tabs.

Adding Campaign Contacts

7.115 Main Contact Sources

Campaign Contacts can be added through:

Selected Contact Lists during creation
Campaign CSV upload
Campaign Contact backend routes

7.116 No Visible Manual Add Form

The application contains a Campaign Contact Manager component and backend routes for:

Add Campaign Contact
Edit Campaign Contact
Delete Campaign Contact

The current Campaign Details page does not mount that manager.

The visible normal workflow provides CSV upload and Contact Lists, but not a manual Add Contact form.

7.117 Duplicate Rule

A Phone Number can appear only once within the same Campaign through the standard Add and CSV processes.

Duplicate checks are based on the formatted Phone Number.

Campaign CSV Upload

7.118 Opening Upload

Open Campaign Details and select the Contacts tab.

The Upload Contacts Card supports:

Drag and drop
or
Browse

7.119 File Requirements

Use:

CSV file
Maximum 5 MB
Maximum 10,000 Contact rows

Although the first controller validation permits CSV or text MIME types, the import action requires the file extension to be .csv.

7.120 Required CSV Header

The exact required header is:

phone_number

Header names are converted to lowercase and trimmed.

7.121 Optional Standard Headers

Supported standard fields include:

first_name
last_name
email
company
website

7.122 Website Discarded

Although Website is accepted during validation, it is neither saved as a Campaign Contact field nor retained as a custom variable.

Website data from this Campaign upload is effectively discarded.

7.123 Custom Variable Columns

Additional CSV columns are stored in the Campaign Contact’s:

variables

JSON field.

Example:

phone_number,first_name,plan_name,renewal_date
+13135550198,Tonya,Premium,2026-09-01

The custom values can be used as:

{{plan_name}}
{{renewal_date}}

7.124 Row Validation

Each row can be skipped for reasons such as:

Missing Phone Number
Invalid Phone format
Invalid Email
Field too long
Duplicate Phone Number
Malformed column count

7.125 Phone Number Formatting

The Campaign CSV import:

Removes formatting characters
Adds +1 to a ten-digit number
Adds + to other numbers without one

Use complete E.164 numbers for international Contacts.

7.126 No Master Contact Link

CSV-uploaded Campaign Contacts are not automatically linked to master Contacts through contact_id.

They remain Campaign-specific records.

This can limit:

Contact history
Master Contact Notes
Post-call workflows
CRM events
Suppression linkage

7.127 Upload Transaction

The import runs inside one database transaction.

A fatal unexpected exception rolls back the import.

Individual invalid rows are skipped without rolling back valid rows.

7.128 Upload Result

The page displays:

Imported count
Skipped count
Row number
Phone Number
Error

7.129 Sample Template

The Upload Card links to:

/sample-contacts.csv

The reviewed source contains the link, but the source bundle does not confirm the actual public sample file.

When the button returns Not Found, create a CSV using the required headers documented above.

Editing a Campaign

7.130 Visible Edit Access

The Details page displays Edit for:

Draft
Scheduled without started_at

The Campaign list displays Edit only for Draft.

7.131 Backend Update Access

The actual Update action accepts:

Draft
Paused

It rejects every other Status.

7.132 Paused Edit Mismatch

Paused Campaigns are technically accepted by the backend Update action.

The normal Campaign list and Details page do not display Edit for Paused Campaigns.

7.133 Editable Fields

The current Edit form includes:

Name
Type
Phone Number
Message
Variables
Voice
Language
Audio File
Recording
DTMF enabled state
Concurrency
Retries
Retry delay
Assigned Agent
Message Variants

7.134 Fields Missing from Edit

The Edit page does not expose:

Contact Lists
Campaign Contact management
Launch Type
Scheduled time
Detailed DTMF settings
Answering-machine settings
Answer delay
Recording mode
Recording maximum length
Smart Scheduling

7.135 Changing Campaign Type

When changing from Text to Speech to Voice to Voice, select a valid Audio File.

When changing back to Text to Speech, enter a valid Message.

The Update action itself does not perform the same content requirement checks as Launch; those are applied later when launching.

Launching a Draft Campaign

7.136 Launch Button

Draft Campaigns display:

Launch

Selecting it opens a confirmation:

Are you sure you want to launch this campaign?
Calls will start being made to contacts.

7.137 Launch Requirements

The normal Launch action requires:

Status is Draft or Paused
At least one Campaign Contact
TTS Campaign has a Message
Voice Campaign has an Audio File
Used Campaign variables have values

7.138 Requirements Not Checked at Launch

The Launch action does not directly confirm:

Phone Number is still assigned
From Number is present
Phone Number belongs to owner
Twilio credentials are valid
Credits are sufficient for the full Campaign
Every Contact variable is populated
Every Contact is legally contactable
Every Contact Phone Number is valid

These issues can appear later during processing.

7.139 Launch Result

Launch updates:

status = running
started_at = current server time

It dispatches:

CampaignStarted CRM event
ProcessCampaignJob

7.140 Current Queue Mode

The production runtime uses:

QUEUE_CONNECTION = sync

Queued Campaign jobs therefore execute in the process that dispatches them rather than through independent background workers.

This reduces the practical value of separate Campaign and Campaign-Call queues and can make launch or scheduler execution take longer.

Automated Campaign Processing

7.141 Processing Cycle

The Campaign processor:

Confirms Campaign is Running
Checks stale Contacts
Finds Pending Contacts
Counts active Calls
Calculates available Call slots
Marks Contacts Queued
Dispatches Call jobs
Checks completion

7.142 Batch Size

It fetches up to:

Maximum Concurrent Calls × 10

Pending Contacts at a time.

7.143 Active Call Slots

Available slots are calculated as:

Maximum Concurrent Calls
Calls currently Initiated, Ringing, or In Progress

7.144 True Concurrency Limitation

The system models concurrency through active Call counts.

Because the current queue driver is synchronous, it does not provide the same parallel background execution expected from dedicated queue workers.

7.145 Campaign Contact Statuses

The active processing system uses statuses including:

pending
queued
in_progress
completed
failed
skipped

Other workflows also write values such as:

calling
answered
opted_out
no_answer

The Campaign Contact Status vocabulary is not fully consistent across components.

Pre-Call Checks

7.146 Credit Check

Before an automated Campaign Call, the job checks whether the Customer can afford:

1.0 Credit

This is a fixed preliminary threshold, not the final duration-based Call price.

7.147 Insufficient Credits

When the Customer cannot afford 1.0 Credit:

Campaign is Paused
Contact returns to Pending
No new Campaign Call begins

7.148 Phone Validation

The job sanitizes and validates each Campaign Contact Phone Number before calling.

An invalid number is marked Failed and no Credit is deducted for that invalid-number rejection.

7.149 Twilio Credential Requirement

Automated Campaign processing looks for the Campaign owner’s:

twilioCredential

This is different from merely having a global Twilio configuration.

A Campaign can appear properly configured but fail because the owner has no expected credential record.

7.150 Critical Provider Errors

Errors containing concepts such as:

authenticate
credentials
suspended
disabled
account
permission
unauthorized

are treated as critical.

The Campaign is Paused.

7.151 Noncritical Provider Failure

A noncritical initiation failure marks the Campaign Contact and Call as Failed and continues processing other Contacts.

Campaign Call Routing

7.152 AI Agent Campaign

When ai_agent_id exists, the automated job uses the AI Agent Campaign endpoint.

7.153 Text-to-Speech Campaign

Without an AI Agent, Text to Speech uses the Campaign TTS endpoint.

7.154 Voice Playback Campaign

Without an AI Agent, Voice to Voice uses the Audio playback endpoint.

7.155 AI Agent Availability

An assigned AI Agent must remain:

Present
Active
Properly configured

When the Agent is missing or inactive, the recipient receives a fallback error message and the Campaign Contact can be marked Failed.

7.156 AI Agent Greeting

The AI Agent’s First Message can personalize:

{first_name}
{last_name}
{company}

The static Campaign TTS Message uses double braces instead.

Recording and DTMF During Campaign Calls

7.157 Recording

When Campaign Recording is enabled, the Call record stores that preference and the provider receives a recording instruction.

Recording availability still depends on provider callbacks.

7.158 DTMF

When DTMF is enabled, the Campaign route provides a DTMF callback.

Because the detailed DTMF configuration is not currently saved by Create or Edit, the recipient may not receive the intended custom prompt or Action behavior.

Credits and Campaign Calls

7.159 Initial Campaign Debit

After a Campaign Call is successfully initiated, the job deducts:

1.0 Credit

with a description such as:

Campaign call to +13135550198

7.160 Completion-Based Debit

When the provider later marks a Call Completed with positive Duration, the Call Status action calculates duration-based pricing and attempts another Credit deduction.

7.161 Likely Double-Debit Defect

The reviewed source contains two independent Call debit paths:

1. Fixed 1.0 Credit at Campaign Call initiation
2. Calculated Call charge at completion

The completion idempotency check looks for:

metadata.call_id

The initial fixed Campaign debit does not store that same metadata field.

This creates a likely double-debit path for successfully completed automated and On-Demand Campaign Calls.

Review Account Statements closely and correct the billing logic before large Campaign use.

Retry Processing

7.162 Retry Eligibility

Failed Calls can return their Campaign Contact to Pending while attempts remain.

7.163 Retry Delay

The next attempt is scheduled after the configured Retry Delay.

With the current synchronous queue driver, delayed queue behavior should be tested rather than assumed to operate like a persistent worker queue.

7.164 Attempt Counting

The Campaign Call job increments call_attempts when a Call is successfully initiated.

The final Call-status handler can increment it again after Busy, No Answer, Failed, or Canceled.

One provider attempt can therefore increase the stored attempt count more than once.

7.165 Retry Limit Interpretation

Because of the multiple increment paths, the visible Retry Attempts value may not equal the exact number of telephone attempts made.

7.166 Stale Calls

The processor checks Campaign Contacts stuck In Progress for more than approximately:

5 minutes

It reviews their latest Call and either:

Marks Completed
Marks Failed
Returns to Pending

depending on provider state and remaining attempts.

Campaign Completion

7.167 Completion Rule

A Campaign is marked Completed when:

No Campaign Contacts are Pending or Queued
and
No Campaign Calls are Initiated, Ringing, or In Progress

7.168 Failed Contacts Do Not Block Completion

Failed Campaign Contacts are terminal for the completion check.

A Campaign can be Completed with:

Successful Contacts
Failed Contacts
Busy Calls
No Answers

7.169 Completion Event

The application dispatches a Campaign Completed event when normal processing finishes.

7.170 Completed Is Terminal in the User Interface

The normal browser interface provides no Resume or Relaunch action for Completed Campaigns.

Create a new Campaign for a selective retry audience.

Pausing a Campaign

7.171 Pause Button

Running Campaigns display:

Pause

The confirmation explains that the Campaign can be resumed later.

7.172 Pause Result

Pause changes:

status = paused

7.173 What Pause Stops

Campaign-processing and Call jobs check that the Campaign remains Running.

A queued job encountering a Paused Campaign resets its Contact to Pending and does not initiate the Call.

7.174 What Pause Does Not Stop

Pause does not explicitly:

Cancel an already initiated provider Call
Hang up an active conversation
Delete queued records
Reverse Credits already deducted

7.175 Pause Timestamp Inconsistency

Automatic pauses caused by insufficient Credits or critical provider errors set:

paused_at = current time

The manual Pause action changes Status but does not set paused_at.

Resuming a Campaign

7.176 Resume Button

Paused Campaigns display:

Resume

7.177 Resume Result

Resume changes:

status = running

and dispatches Campaign processing again.

7.178 Before Resuming

Confirm:

Credit Balance restored
Provider credentials valid
Caller ID active
Campaign Message correct
Contacts still contactable
Retry policy understood

7.179 Resume Does Not Reset Results

Resume does not clear:

Completed Contacts
Failed Contacts
Previous Calls
Credits
Campaign totals

It continues from the remaining processable Campaign Contacts.

On-Demand Campaign Calls

7.180 Purpose

Campaign Details contains:

On Demand Start

The confirmation describes it as a way to immediately call the next Pending Contact without using the Campaign Queue.

7.181 Availability

The button appears for Campaigns that are not:

completed
failed

This includes:

draft
scheduled
running
paused

An On-Demand Call can therefore occur before formal Campaign launch or while the Campaign is Paused.

7.182 Contact Selection

On-Demand selects:

The first Pending Campaign Contact by ID

The user cannot choose a specific Contact through this button.

7.183 On-Demand Requirements

The route checks:

Pending Contact exists
Customer can afford 1.0 Credit
Phone Number is valid
Campaign owner has Twilio credentials
Campaign From Number is usable

7.184 Contact Status

Before initiating, the Contact changes to:

in_progress

and its attempts increase.

7.185 On-Demand Call Type

The created Call is stored as:

call_type = campaign
direction = outbound

7.186 AI Agent Not Used

The On-Demand route chooses only:

Text-to-Speech endpoint
or
Voice playback endpoint

It does not check ai_agent_id.

An On-Demand Call does not test the Campaign’s AI Agent conversation path.

7.187 On-Demand Credit Charge

After provider initiation succeeds, the route immediately deducts:

1.0 Credit

The completion-based pricing path can later attempt another debit, producing the same likely double-charge risk described earlier.

7.188 On-Demand Failure

When initiation fails:

Campaign Contact becomes Failed
Call becomes Failed
Error Message is stored
No success Credit deduction occurs

An unexpected exception resets the Campaign Contact to Pending.

7.189 Safe On-Demand Use

Use On-Demand only for:

One approved internal test Contact
One known caller ID
One confirmed message or audio file

Do not use it as a replacement for selecting an arbitrary production Contact.

Manual Campaign Call Queue

7.190 Call Queue Button

Campaign Details displays:

Call Queue

when:

An Agent is assigned
and
The Campaign has Contacts

7.191 Manual Queue Purpose

This Queue is a guided human-Agent calling interface.

It does not represent the same automated job queue used by Running Campaigns.

7.192 Queue Information

The page displays:

Pending
Completed
Failed
Progress
Current Contact
Call Attempts
Contact Queue
Previous
Skip
Call Now
Next
Refresh

7.193 Browser Softphone Requirement

Call Now requires:

Softphone Device = registered

The button loads the Campaign Contact into the global browser Softphone.

7.194 Queue Contact Limit

The backend loads at most:

200 Campaign Contacts

into the manual Queue.

A Campaign with more than 200 Contacts has no visible pagination in this Queue.

7.195 Queue Order

The backend attempts to order statuses as:

pending
calling
failed
completed

7.196 Status Mismatch

Automated Campaign processing uses:

queued
in_progress

while the manual Queue expects:

calling

The Queue’s Calling statistic can therefore show zero even when Contacts are Queued or In Progress.

Unrecognized statuses can also appear in an unexpected order.

7.197 Queue Progress

Manual Queue progress is:

Completed Campaign Contacts
÷
Total Campaign Contacts
×
100

This differs from the Campaign card’s total_called progress.

7.198 Skip

Skip moves to the next visible Campaign Contact.

It does not update the Contact’s database Status to Skipped.

7.199 Auto-Advance

After a Post-Call Disposition is successfully saved, the Queue tries to move to the next Pending or Failed Contact.

7.200 Manual Call Versus Automated Campaign Call

Call Queue → Call Now
=
Human browser Softphone Call

Running Campaign processor
=
Provider-initiated automated Campaign Call

Do not run both workflows on the same Campaign audience without a controlled operating plan.

Saving a Campaign as a Template

7.201 Save as Template

Campaign Details provides this action for all Campaign Statuses.

7.202 Template Fields

The dialog contains:

Template Name
Description
Category

7.203 Category Options

Available categories include:

Promotional
Notification
Survey
Lead Qualification
Personalized
General

7.204 Template Does Not Copy Contacts

Saving as a Template saves Campaign configuration, not the Campaign Contact audience or Call History.

Deleting a Campaign

7.205 Visible Delete Statuses

Delete appears for:

Draft
Completed
Failed

7.206 Backend Delete Statuses

The Delete action permits the same three Statuses:

draft
completed
failed

7.207 Misleading Delete Error

When deletion is attempted in another Status, the backend states:

Please pause it first.

Paused Campaigns are still not allowed to be deleted.

The Campaign must be Draft, Completed, or Failed.

7.208 Soft Deletion

Campaigns use soft deletion.

Normal deletion records a deleted timestamp and removes the Campaign from ordinary queries.

7.209 Related Records

The Delete action comments that database cascades will handle Contacts and Calls.

A soft delete does not trigger normal database hard-delete cascades.

Campaign Contacts and Calls can remain stored and linked to the soft-deleted Campaign.

7.210 No User Restore Control

The model supports restoration in policy, but the normal Campaign interface does not display a Restore action.

Campaign Safety

7.211 Before Creating

Confirm:

Campaign purpose approved
Audience authorized
Phone Numbers formatted
DNC suppression applied
Caller ID approved
Credits available
Provider configured

7.212 Before Launching

Confirm:

Correct Campaign Name
Correct Campaign Type
Correct From Number
Correct AI Agent or Audio File
Correct Message
Variables populated
Recording setting approved
DTMF behavior tested
Concurrency conservative
Retry policy approved
At least one internal test completed

7.213 Start Small

Use:

One internal Contact
Several approved test Contacts
Small production List
Full audience

7.214 Avoid Overlapping Operations

Do not simultaneously use:

Automated Campaign processing
On-Demand Start
Manual Campaign Call Queue

on the same Contact audience without coordination.

7.215 Monitor Early Calls

Review:

Caller ID
Message playback
Variable replacement
AI Agent behavior
Recording
DTMF
Call Status
Credits
Campaign Contact Status

during the first several Calls.

Troubleshooting Campaign Creation

7.216 Campaign Name Error

Campaign Name is required and cannot exceed 255 characters.

7.217 Message Rejected

The Message may exceed 250 characters.

The interface counter does not prevent excess typing.

7.218 Concurrency Rejected

The UI allows up to 100, but the backend limit is 50.

7.219 Retry Delay Rejected

The UI allows up to 1,440 minutes, but the backend limit is 60.

7.220 Campaign Saved as Draft Unexpectedly

No Phone Number was selected.

Creation forces Draft when phone_number_id is empty.

7.221 AI Agent Was Assigned Unexpectedly

The selected Phone Number has an active AI Agent attached.

The system automatically assigns that Agent to the Campaign.

Troubleshooting Contact Lists

7.222 Selected Count Is Higher Than Imported Count

The same Phone Number appears in multiple Lists.

The Campaign skips duplicate Phone Numbers.

7.223 Company Variable Is Blank

The Contact List attachment process does not copy Company into the Campaign Contact.

Upload Campaign Contacts through CSV with the required Company value or correct the List-copy logic.

7.224 Master Contact History Is Missing

Contact List attachment does not currently preserve contact_id.

The Campaign Contact may not be linked back to the master Contact.

Troubleshooting CSV Upload

7.225 Missing Phone Header

Use the exact header:

phone_number

7.226 File Type Rejected

Use a file ending in:

.csv

7.227 File Too Large

Maximum size is 5 MB.

7.228 Only 10,000 Imported

The import intentionally stops after 10,000 parsed Contact rows.

7.229 Duplicate Skipped

The formatted Phone Number already exists in the Campaign.

7.230 Website Missing After Import

The Campaign upload validates Website but discards it.

7.231 Custom Variable Not Replaced

Confirm:

CSV header matches variable name
Variable uses double braces
Campaign Contact contains a value
No spaces or capitalization mismatch

Troubleshooting Scheduling

7.232 Scheduled Campaign Does Not Start

The current scheduler calls a Launch action that rejects Scheduled Status.

Launch the Campaign manually after reviewing its intended start time.

7.233 Campaign List Fails After Scheduling

The Campaign index does not define the Scheduled Status configuration.

Open the Campaign Details URL directly or have the frontend configuration corrected.

7.234 Scheduled Time Is Wrong

The browser labels the entry as local time, but the server currently operates in UTC and receives no explicit offset.

7.235 Scheduled Campaign Cannot Be Saved

The Edit page permits opening it, but the update action rejects Scheduled Status.

Troubleshooting Launch

7.236 No Contacts

Normal Launch requires at least one Campaign Contact.

7.237 Missing TTS Message

Enter and save a Campaign Message.

7.238 Missing Audio File

Select an existing Audio File for Voice-to-Voice.

7.239 Missing Campaign Variable

Enter a value for every Campaign variable used in the Message.

7.240 Campaign Running but No Calls

Check:

Laravel scheduler
Queue configuration
Credits
Twilio credential
Caller ID
Pending Campaign Contacts
Maximum Concurrent Calls
Provider logs

7.241 Campaign Immediately Completed

It may have contained no Pending Contacts.

7.242 Campaign Automatically Paused

Likely causes include:

Insufficient Credits
Authentication error
Suspended provider account
Invalid credentials
Permission error

Troubleshooting Pausing and Resuming

7.243 Calls Continue After Pause

Pause stops new job processing.

Already initiated provider Calls can continue.

7.244 Resume Produces More Calls Than Expected

Review Campaign Contacts that returned to Pending through retries or stale-Call recovery.

7.245 Paused Campaign Cannot Be Edited

The backend permits Paused updates, but the normal interface does not show Edit.

Troubleshooting On-Demand Calls

7.246 No Pending Contacts

The On-Demand route calls only the first Pending Contact.

7.247 No Twilio Credentials

The Campaign owner lacks the credential record expected by the On-Demand service.

7.248 AI Agent Was Not Used

On-Demand currently tests TTS or Audio playback, not the Campaign AI Agent route.

7.249 Credit Deducted Twice

Review the Account Statement for:

Fixed 1.0 Credit initiation debit
and
Duration-based completion debit

Report duplicate Campaign Call charges to the Administrator.

Troubleshooting Manual Call Queue

7.250 Call Queue Button Missing

The Campaign must:

Have an Assigned Agent
and
Have at least one Campaign Contact

7.251 Call Now Disabled

The browser Softphone is not Registered or another Call is active.

7.252 Calling Count Is Zero

The Queue looks for calling, while automated processing commonly stores queued or in_progress.

7.253 More Than 200 Contacts

The Queue loads only the first 200.

Use focused Campaigns or improve Queue pagination.

7.254 Skip Did Not Change Contact Status

Skip only advances the browser’s current position.

It does not save skipped to the database.

Campaign Creation Checklist

7.255 Audience

Confirm:

Correct Contact Lists
Correct Campaign CSV
Duplicates reviewed
DNC suppression applied
International numbers formatted

7.256 Message

Confirm:

250 characters or fewer
Correct disclosure
Correct variables
Campaign values populated
Contact values available
AI-generated wording reviewed

7.257 Calling Configuration

Confirm:

Correct Phone Number
Correct AI Agent
Correct Audio File
Correct Voice and Language
Recording approved
DTMF tested

7.258 Processing Configuration

Confirm:

Conservative concurrency
Retry attempts approved
Retry delay no more than 60 minutes
Credit balance sufficient
Provider credential active

7.259 Launch Choice

Confirm:

Draft for review
Manual launch for dependable timing
Avoid current Scheduled workflow

Campaign Launch Checklist

7.260 Immediately Before Launch

Confirm:

At least one Campaign Contact
No unresolved variables
No blank Campaign variable values
Caller ID active
Agent assignment correct
Credits reviewed
Calling hours approved
Monitoring staff available

7.261 Immediately After Launch

Confirm:

Status becomes Running
First Contact enters Queued or In Progress
Call record created
Correct From Number used
Correct Message or AI Agent used
Credits reviewed

Pause Checklist

7.262 Before Pausing

Confirm:

Reason documented
Active Calls identified
Team notified
Credit or provider issue understood

7.263 After Pausing

Confirm:

Status = Paused
No new Calls begin
Active Calls finish
Pending Contacts remain available

Resume Checklist

7.264 Before Resuming

Confirm:

Cause of pause resolved
Credits restored
Provider active
Audience still valid
Retry behavior understood

Current-Build Limitations

7.265 Confirmed Limitations

The reviewed Campaign implementation currently includes these important limitations:

Campaign index does not support Scheduled Status

Campaign index pagination is not rendered

Agent Campaign cards can display unauthorized actions

Contact List copy omits Company, variables,
Contact ID, status, and opt-out information

List and Phone Number IDs are not fully
validated against Campaign ownership

Only Twilio-SID Phone Numbers appear
in the Campaign selector

Removing a Phone Number can leave an old
From Number or AI Agent attached

Message editor permits typing beyond 250 characters

Launch does not validate every Contact variable

UI and backend concurrency limits disagree

UI and backend retry-delay limits disagree

Detailed DTMF settings are not persisted

DTMF Action values are not persisted

Immediate creation bypasses normal launch validation

Immediate creation waits for scheduler processing

Scheduled time lacks an explicit timezone offset

Scheduled Campaigns are rejected by the
current auto-launch action

Scheduled Campaigns cannot be reliably edited

Edit does not expose scheduling or detailed DTMF

Campaign Details shows only 10 Contacts and 10 Calls

No visible manual Campaign Contact manager is mounted

Campaign CSV discards Website

Campaign CSV does not link master Contacts

Current sync queue reduces background concurrency

Call attempts can be incremented more than once

Progress can remain below 100% after completion

Campaign Calls have a likely double-debit path

Pause does not cancel already active Calls

On-Demand does not test AI Agent calling

Manual Queue loads only 200 Contacts

Manual Queue status vocabulary conflicts
with automated Campaign processing

Deleting a Campaign soft-deletes it and does
not necessarily cascade-delete related records

No normal Campaign restore control exists

Chapter Completion

At the end of this chapter, the user should understand how to create and configure a Campaign, select Contact Lists, assign a human Agent, choose a Phone Number, and distinguish among:

Text to Speech
Voice to Voice
AI Agent Campaign

The user should know how Campaign variables and Contact variables work, how static Campaign TTS replaces double-brace placeholders, and why AI Agent greetings use single-brace placeholders.

The user should understand the normal Campaign Statuses:

Draft
Scheduled
Running
Paused
Completed
Failed

and recognize that Scheduled Campaigns are not currently dependable because the scheduler sends them into a Launch action that rejects Scheduled Status.

The user should understand how normal Launch validates Contacts, Messages, Audio Files, and Campaign-variable values, while Create & Launch bypasses those normal checks and relies on the scheduler to begin processing.

The user should understand how Campaign-processing jobs validate Credits and Phone Numbers, choose between AI Agent, TTS, and Audio routes, control active Call slots, apply retries, recover stale Contacts, and mark a Campaign Completed.

The user should know the difference between:

Automated Campaign processing
On-Demand Campaign Call
Manual Campaign Call Queue

and should avoid using all three workflows simultaneously on the same audience.

The user should understand how to Pause and Resume a Campaign and know that Pause prevents new jobs from starting Calls but does not terminate Calls already initiated.

The user should recognize the likely Campaign billing defect in which one fixed Credit can be deducted at initiation and a second duration-based charge can be deducted after completion.

Most importantly, the user should follow this operating sequence:

Prepare and suppress Contacts
Save Campaign as Draft
Test Message, variables, caller ID, and audio
Make one controlled test Call
Review Credits and Call results
Launch a small audience manually
Monitor early Calls
Pause immediately when errors repeat
Expand only after successful verification


Write Your Comment