Campaign Analytics converts Campaign activity into operational measurements that help users determine:
AIUNIFY Call Center provides several Campaign reporting interfaces:
These interfaces use related but not always identical formulas. A number displayed as Answered, Completed, Progress, or Completion Rate can represent different conditions depending on the page.
The primary Campaign Analytics route is:
The application also contains a separate advanced analytics route:
The first is the normal visual Analytics page. The second returns a structured JSON analytics response and is not the primary user-facing dashboard.
To open Campaign Analytics:
The normal page address is:
Example:
The visual Analytics page receives Campaign data through:
This endpoint supplies the calculations used by the Cards and Charts.
The same Analytics section provides:
These routes download Campaign-specific CSV files.
The user must be signed in before Campaign Analytics can be opened.
The Campaign and Analytics route groups are protected by the Basic KYC requirement.
When KYC is enabled, a Customer generally requires:
Analytics access is determined by Campaign authorization.
The expected scope is:
A user can require Campaign-view or Campaign-analytics permission depending on the route and role configuration.
A visible Analytics button does not override backend authorization.
The normal Analytics controller accounts for an Agent’s parent Customer when determining Campaign access.
This is broader than several API-based Campaign tools that compare the Campaign owner directly with the signed-in User ID.
An Agent can therefore open normal Campaign Analytics while being rejected by certain Message Variant API actions.
The Analytics page identifies the Campaign and provides controls for:
Use the Back or Campaign control to return to:
This downloads the Campaign Contact population and its Campaign-specific results.
This downloads the Call records associated with the Campaign.
The primary Analytics page displays measurements such as:
Total Calls counts Call records associated with the Campaign.
It can include:
The number represents Call records, not unique Contacts.
A Contact called three times can contribute three Calls.
Total Contacts represents the Campaign’s Contact population.
This is generally based on the Campaign’s stored:
value.
Example:
The Campaign has:
Retries can cause Total Calls to exceed Total Contacts.
The main Analytics service classifies a Call as answered when:
Therefore:
A Completed provider status does not automatically prove that:
A provider can report Completed for short or automated interactions.
Review:
where available.
The Campaign model’s stored:
counter uses a stricter path in certain Call-status handling.
It can require:
The visual Analytics service can count every Completed Call as answered, while the Campaign’s stored Answered counter can omit some of those Calls.
Example:
Possible displays:
This difference is caused by two separate definitions.
The primary Campaign Analytics page calculates Answer Rate as:
Because Answered Calls are Completed Calls on this page:
When a Campaign is still Running, Total Calls can include Calls that are:
Those active Calls are not yet Completed.
The temporary Answer Rate can therefore appear lower while the Campaign is still processing.
The displayed Answer Rate should be interpreted as:
unless the Campaign’s answered_by, recording, or transcript data has been independently reviewed.
The primary Analytics service combines:
into Failed Calls.
Canceled Calls are not included in this primary failed total.
Other pages can include Canceled in their failure group.
This creates a possible difference between:
Where displayed, Failure Rate is generally:
The exact denominator depends on the analytics controller being used.
The main Analytics service considers these active:
An active status can mean:
A Call stuck in an active state long after it ended may require synchronization.
Average Duration is calculated from:
using their stored:
values.
Total Duration is the sum of completed Call durations.
The page can display it as:
depending on the frontend formatter.
A Completed Call with a zero or missing Duration can:
This is another reason not to treat Completed Status alone as proof of a meaningful conversation.
The main visual Analytics service calculates Completion Rate as:
This formula measures how much of the Campaign audience reached the Campaign’s Called counter.
It does not measure how many Contacts:
A clearer operational interpretation is:
This means 75% of Campaign Contacts reached the Campaign’s Called counter.
The Campaign’s total_called counter is normally incremented when a Call first reaches:
A Call that ends as:
without first reaching In Progress may not increase total_called.
The Campaign processor can mark a Campaign Completed when no processable Contacts or active Calls remain.
Because some unsuccessful Calls may not increase total_called, the Campaign can display:
The Analytics page displays a pie or distribution Chart grouping Campaign Calls by Status.
Possible categories include:
The combined segments should equal the number of Campaign Call records used by Analytics.
A large Completed segment indicates a high provider-completion rate.
A large No Answer segment can suggest:
A large Failed segment can suggest:
These outcomes can require different retry strategies.
The Analytics page groups Campaign Calls by hour.
The chart can display:
for each hour containing Call activity.
The primary Analytics service groups Calls using:
It does not use the Contact’s Time Zone.
The current Laravel application Time Zone is:
Therefore, an Hour shown as:
can represent:
rather than 2:00 PM in the user’s local Time Zone.
Daylight-saving rules can change the local conversion.
The primary Hourly chart groups by Call record creation time.
A Call created at 9:59 AM and connected at 10:01 AM remains in the 9:00 hour group.
For each hour:
Hourly Average Duration uses completed Calls within that hour.
Peak Hour is the hour containing the highest number of Campaign Call records.
Peak Hour measures volume.
It does not automatically mean:
Best-Performing Hour is selected using the highest Answer Rate among hours that have a minimum amount of Call activity.
The reviewed Analytics service requires approximately:
in an hour before that hour is considered for Best Hour.
An hour with:
is excluded from Best Hour when it has fewer than five Calls.
The Best Hour is based on provider-completion rate.
Confirm:
before changing the entire Campaign schedule.
The Analytics page can display Campaign Calls by day.
The chart commonly contains:
The Daily Call Trends section is generally useful when Call activity spans more than one calendar day.
A single-day Campaign may not display a meaningful daily trend Chart.
The primary Analytics service groups by:
using the database and server Time Zone.
A Call visible in the browser as:
can be grouped by Analytics under:
depending on the user’s local Time Zone.
Average Retries is based on the Campaign Contacts’:
values.
Maximum Retries identifies the highest stored attempt count among Campaign Contacts.
A Contact is considered to have retries when:
As explained in Chapter 7, Call attempts can be incremented in more than one processing path.
One provider Call attempt can potentially increase the Campaign Contact’s attempt count more than once.
Therefore:
may not always equal the exact number of telephone Calls placed.
Use retry Analytics to identify broad patterns, not as the sole billing or compliance record.
For exact attempts, compare:
The Campaign Details page displays:
While a Campaign is Running, Campaign Details refreshes its information approximately every:
The separate Campaign Analytics page does not provide the same repeating live refresh behavior.
Refresh the page to obtain current analytics.
Called uses the Campaign’s stored:
counter.
Answered uses the Campaign’s stored:
counter.
This may differ from the Analytics page’s Completed Call count.
Failed uses the Campaign’s stored:
counter.
It may differ from a query that independently counts every:
Call record.
Campaign-list progress is:
The Manual Campaign Call Queue calculates progress differently:
The Campaign Card and Manual Queue can therefore display different progress percentages for the same Campaign.
Campaign Details includes a Contact section that can show:
depending on available data.
The Campaign Details controller loads only the latest:
A Campaign with 5,000 Contacts still displays only a limited recent selection on the Details page.
Use:
for broader review.
Possible Campaign Contact states across the current code include:
Different components do not use a completely consistent vocabulary.
Completed and Failed Contacts can both belong to a Campaign whose overall Status is Completed.
Campaign Completed means processing ended; it does not mean every Contact succeeded.
Campaign Details includes recent Campaign Calls.
Possible information includes:
The controller loads only the latest:
on Campaign Details.
For the complete Call set, use:
One Campaign Contact can have multiple Call Results.
DTMF Analytics records keypad responses such as:
Campaign Details calculates DTMF statistics when:
The DTMF Card becomes meaningful only after one or more responses are stored.
The Details page can display:
Total Responses counts stored DTMF response records associated with the Campaign.
The DTMF Card calculates a percentage using:
The denominator passed into the component is tied to the Campaign’s current Call progress data.
Unique Keys counts the distinct keypad responses received.
Example:
Each row can show:
Example:
Where an Action was stored, the Card can group results such as:
The Insights area can identify the key with the highest response count.
This does not automatically mean that key produced the best business outcome.
Campaign Details attempts to match each pressed digit to the Campaign’s saved:
configuration.
When no matching Action configuration is available, the label defaults to the digit itself.
Example:
Campaign Details uses the Campaign’s dedicated DTMF response relationship to calculate:
Other Analytics calculations use:
Because two data sources are used:
the DTMF total on Campaign Details can differ from the DTMF result shown in Performance Metrics or an export.
The Details controller groups dedicated responses by digit and Action.
Chapter 7 established that the current Campaign Create and Edit actions save:
but do not reliably save the full:
configuration.
Because detailed configuration is not reliably stored:
Before using DTMF Analytics for production decisions:
Message Variants allow a Text-to-Speech Campaign to test different versions of its Campaign Message.
The system describes this feature as:
Message Variant management appears within the Campaign Edit workflow.
To open it:
Message Variants are primarily intended for:
They do not replace:
The request requires:
The normal Campaign TTS Message itself remains limited to 250 characters during Campaign creation and update.
The interface describes generating:
with different tones and approaches.
Variants can represent tones such as:
The actual generated labels and descriptions depend on the AI response.
Generation depends on the configured AI messaging service.
When the AI provider is unavailable, the existing Campaign Message remains unchanged.
Every generated Message should be reviewed for:
Generating a new set does not automatically delete the existing set.
Repeated generation can create:
The interface may continue to describe the feature as a five-variant test even after more than five records exist.
Generate one set, review it, and avoid generating another set until the existing Variants have been intentionally managed or removed.
Each Variant Card can display:
The frontend supports refreshing, activating or deactivating, and selecting a winning Variant.
An Active Variant is eligible for Campaign selection when no active Winner overrides the test.
An Inactive Variant is excluded from normal Variant selection.
Historical metrics remain stored.
A Winner is the Variant selected as the preferred Message.
When an active Winner exists, the Campaign uses that Winner rather than continuing normal distribution across the other Variants.
When an active winning Variant exists:
When one or more Active Variants have fewer than approximately:
the selector uses random distribution to build an initial sample.
After Active Variants have sufficient initial sends, the selection approach is approximately:
The random portion prevents one early leader from permanently receiving all Calls before enough data exists.
When Variant selection fails or no Active Variant is available, the Campaign’s main Message is used.
The selected Variant’s ID can be stored on the Call record through:
This allows performance to be associated with the Message used for that Call.
Sent Count is incremented when a Variant is selected for a Campaign Call.
It represents selection for sending, not confirmed delivery or completion.
Variant Answered Count is increased when the linked Call reaches:
through the tracked status process.
Variant Answered is therefore not identical to the main Campaign Analytics definition.
Completed Count is increased when a linked Call reaches:
Provider status Webhooks can be delivered more than once.
The reviewed Variant-tracking path does not show a complete per-Call idempotency guarantee for every metric update.
Repeated status processing can potentially inflate:
Review impossible values such as a Completed Count exceeding Sent Count.
A Variant can receive a Positive Response when the linked Call has a positive signal such as:
The code also recognizes repeated 1 values in certain DTMF strings.
Positive-response evaluation can occur when the Call reaches Completed.
Sentiment is often generated later after:
If sentiment does not exist at the time the Completed status is processed, the Variant may not later receive a positive-response increment.
The stored effectiveness formula applies approximately:
The score is a weighted technical performance score.
It does not automatically represent:
The interface can display Select Winner when a Variant has approximately:
and is not already the Winner.
The backend’s default minimum sample is also:
The winner service requires at least two Active Variants with enough samples before it can make a meaningful comparison.
One Variant reaching 50 sends can make the button visible while the backend still reports:
because a second eligible Variant has not reached the same minimum.
Selecting Select Winner on a specific Variant verifies that the Variant belongs to the Campaign.
The winner service then independently identifies the highest-performing eligible Variant.
The Variant clicked by the user can therefore differ from the Variant ultimately selected.
After a Winner is selected:
The current interface does not provide a dedicated:
action.
Variants can be reactivated individually, but an active Winner continues to override normal testing.
When the Winner is deactivated, the selector can return to using other Active Variants.
The Winner flag can remain stored even though the Variant is no longer active.
The backend provides an operation to delete all Message Variants for a Campaign.
The current Message Variant component does not display a normal Delete All Variants button.
An approved administrative or development process is required to use that operation.
Calls linked to deleted Variants should remain as Call records, but their Variant relationship can become null depending on the database foreign-key behavior.
Historical interpretation can be lost after deletion.
Variant API actions compare:
and allow a legacy Administrator flag as an exception.
An Agent can have Campaign Analytics access through the parent Customer but still receive:
when attempting to generate, activate, or select Message Variants for the parent-owned Campaign.
The Variant controller checks a property named similarly to:
Other parts of the application use role methods such as:
The Administrator exception should be tested before relying on it.
Campaign Templates store reusable Campaign configuration.
They can reduce repeated setup for:
From the Sidebar:
The page address is:
The current application provides routes for:
The route list does not contain a normal GET Edit page for Templates.
System Templates are provided by the platform.
They generally have:
Normal Customers cannot edit or delete them.
Custom Templates belong to a Customer User.
They can be created manually or saved from an existing Campaign.
Supported stored categories include:
The Save as Template dialog can also offer:
The reviewed database category definition does not include General.
Saving a Campaign under the General category can therefore fail at the database layer.
The Template index can display:
Templates are generally ordered with System Templates first and higher-use Templates prioritized.
The Template list returns approximately:
and includes pagination controls.
This differs from the Campaign index, whose current page does not render its pagination.
The backend can accept a category filter.
The current Template index does not provide a prominent visible category-filter control.
Selecting Use opens Campaign creation with a Template query parameter:
A Template can prefill:
A Template does not automatically include:
The backend provides a POST Use Template action that increments:
The visible Template buttons commonly open the Campaign Create URL directly instead.
Normal visible Template usage can therefore fail to increase the Usage Count.
Some seeded System Templates store their language under:
while Campaign creation can expect:
The selected Template’s language may not always be applied correctly.
Review the Voice and Language after selecting a System Template.
Select:
or open:
The visible form includes:
The backend Template structure supports:
The current Create Template page does not display a normal Campaign Type selector.
A newly created Template is effectively centered on TTS configuration.
Template Name is required.
Use a specific Name such as:
rather than:
Describe:
The backend limits the Template Message to approximately:
The Template form can allow values up to:
The Campaign backend later accepts only:
Template storage does not consistently validate the same Campaign limit.
A Template can therefore contain a value that is rejected during Campaign creation.
Templates can store retry delays above the Campaign backend limit of:
Some System Templates in the reviewed source use values such as:
These values conflict with the normal Campaign validation described in Chapter 7.
Campaign Details provides:
The dialog requests:
Saving from a Campaign can copy:
The operation does not copy:
Because the Audio File itself is not reliably copied into the saved Template configuration, a Template created from a Voice-to-Voice Campaign can still require a new Audio File selection when reused.
The View page can display:
Select Use This Template to open Campaign creation.
Review every prefilled value before saving the Campaign.
The Template Details interface can display an Edit link for a Custom Template.
It points to:
The installed route list does not contain that GET route.
The link can therefore return:
A Template Update endpoint exists, but the current normal Edit page required to submit it is missing.
The normal Template index returns:
The Template Detail route does not show the same strong owner-or-system restriction in every reviewed path.
A user should not modify Template IDs in the URL.
A Custom Template belonging to another Customer should never be used or disclosed.
Custom Templates can be deleted by the owner.
System Templates are protected from normal deletion.
Deleting a Template does not delete Campaigns that were previously created from it.
Those Campaigns contain their own stored configuration.
From Campaign Analytics, select:
The filename follows:
Example:
The Campaign Call CSV contains:
Contact Name is taken from the associated Campaign Contact.
When no name exists:
can be exported.
The exported Phone Number is the Call’s:
Duration is exported from the Call’s stored duration field.
The value represents seconds.
The Call export obtains DTMF Response through the Campaign Contact relationship rather than necessarily from the dedicated DTMF response record.
Multiple Calls for the same Campaign Contact can therefore repeat the same Contact-level DTMF value.
Campaign Calls are exported newest first.
The Call export is not limited to the ten Calls visible on Campaign Details.
It includes the full Campaign Call query.
The standard Campaign Call export does not include:
From Campaign Analytics, select:
The filename follows:
The Campaign Contact CSV contains:
It exports Campaign Contact records, not the full master Contact database.
The file reflects Campaign-specific values such as:
The standard Campaign Contact export does not include:
The Campaign Analytics page does not provide filters for the two exports.
Selecting an export downloads all matching Calls or Campaign Contacts for that Campaign.
The interface does not provide a direct export of only:
The primary Campaign Analytics page does not provide:
The available standard format is CSV.
A separate route exists at:
This export attempts to create one row per Campaign Contact containing both Contact and latest Call information.
It can contain:
The combined export references a Call property similar to:
The standard Call model uses:
The Call Duration column can therefore be blank or incorrect.
The current Campaign Analytics interface uses the separate:
actions rather than this combined route.
Treat the combined export as a secondary or legacy operation until tested.
Campaign exports can contain:
The Call export includes raw Recording URLs where available.
A person with access to the CSV can potentially attempt to access those Recordings.
Store Campaign exports only in:
Do not place Campaign exports in:
After transferring an export to approved storage, remove unnecessary local browser-download copies.
The system contains:
This route returns JSON sections including:
The advanced controller does not use every formula from the main visual Analytics service.
For example, its Completion Rate can use:
while the primary page uses:
The same label can therefore produce different percentages.
The advanced overview counts Campaign Contacts in statuses such as:
It does not consistently include the current automated Status:
The advanced time query references:
The standard Calls table uses:
This can cause the advanced analytics response to fail or return incorrect Duration data.
The advanced real-time section checks whether:
The current Campaign model uses:
A Running Campaign can therefore report:
The advanced real-time section can inspect queued jobs for Campaign processing.
The current deployment uses:
A persistent queue depth is therefore not a dependable indicator of remaining Campaign Calls.
The advanced JSON controller contains estimated cost calculations based on hard-coded values approximately equivalent to:
These values do not automatically represent:
For actual account charges, use:
For provider or platform financial reporting, use the applicable Administrator Credit and Profit modules.
The system also provides:
The Campaign summary query uses:
rather than:
Its Active Campaign count can therefore display zero or undercount current Campaigns.
Campaign Call results depend on provider Webhooks for:
Immediately after a Call ends, Analytics can temporarily show:
To refresh:
The primary Campaign Analytics page does not continuously poll like the Running Campaign Details page.
Possible interpretation:
Review Recordings and answered_by.
A lower Answer Rate can still produce valuable results when the completed Calls have:
Possible causes include:
Review:
A keypad response proves an input was received.
It does not prove that:
Check:
Possible causes include:
Retries created multiple Calls for some Campaign Contacts.
Some unsuccessful Calls never reached In Progress and did not increase total_called.
The primary Analytics page counts Completed Calls.
Campaign Details can rely on the stricter stored total_answered counter.
Different pages include different combinations of:
The primary Analytics service groups by UTC created_at hour.
Convert the time to the intended local Time Zone.
The database date is UTC, while the browser can display local time.
The page does not poll continuously.
Refresh after provider callbacks complete.
Confirm:
Detailed DTMF Actions were not saved or do not match the pressed digit.
The digit was stored, but the Action configuration or Action result was not persisted.
Campaign Details and Analytics can use different DTMF data sources.
A DTMF Action result does not replace verification of the Campaign Contact and master Contact suppression state.
Confirm the Contact was actually marked opted out through the approved suppression process.
Both are required:
Possible causes include:
Repeated generation adds another set rather than replacing the current set.
The Variant API compares the Campaign owner directly with the signed-in User ID.
An Agent’s parent-Customer relationship is not applied.
At least two Active Variants may need the minimum sample of approximately 50 sends each.
The backend recomputes the best eligible Variant instead of forcing the specifically clicked Variant to win.
An active Winner overrides the normal A/B selection process.
Deactivate the Winner through an approved workflow before expecting broad Variant distribution.
Repeated provider callbacks may have incremented tracked metrics more than once.
Compare Variant counts with linked Call records.
Sentiment can be calculated after the Completed-status Variant update.
The later AI result may not retroactively increase Positive Response Count.
The visible Use button opens Campaign Create directly and bypasses the POST route that increments usage.
The Template Edit GET route is not registered.
General is not included in the current stored database category list.
Use one of the supported categories.
Review:
System or Custom Templates can contain values outside the current Campaign validation limits.
A System Template may store voice_language while Campaign creation expects language.
Select the correct Language manually.
Templates do not reliably carry the Campaign’s Audio File.
Select one during Voice-to-Voice Campaign creation.
Check:
The file contains Call attempts, including retries.
Email is not included in the standard Campaign Contact export.
Cost and Currency are not included in the standard Campaign Call export.
The Call export can obtain the value from the Campaign Contact rather than a unique per-Call DTMF record.
The secondary combined export expects duration instead of duration_seconds.
Confirm:
Review:
Review:
Review:
Review:
Confirm:
Confirm:
Confirm:
Confirm:
Confirm:
Confirm:
Confirm:
The reviewed Campaign Analytics, Variant, Template, and Export implementation currently includes these important limitations:
At the end of this chapter, the user should understand how to open Campaign Analytics and interpret:
The user should understand that the primary Analytics page defines Answered Calls as Completed Call records, while Campaign Details can rely on a stricter stored Answered counter.
The user should recognize that the primary Completion Rate is:
and is more accurately interpreted as Campaign calling coverage.
The user should know how to review Call Status Distribution, Hourly Call Statistics, Daily Call Trends, Peak Hour, Best-Performing Hour, retry behavior, Campaign Contact results, and Campaign Call results.
The user should understand that time-based Analytics uses UTC Call creation times and must be converted before making local scheduling decisions.
The user should know how DTMF responses are grouped by digit and Action, how Response Rate is calculated, and why DTMF totals or labels can differ because the application uses multiple response data sources and does not reliably save detailed DTMF configuration.
The user should understand how AI Message Variants are generated, activated, distributed, scored, and selected as Winners. The user should recognize that:
are not necessarily the same measurement.
The user should understand that repeated Variant generation adds more Variants, an active Winner overrides normal A/B testing, and the Winner service can select a different Variant from the one clicked.
The user should know how to open Campaign Templates, distinguish System and Custom Templates, create a Template, use a Template, and save a Campaign as a Template. The user should also recognize the current missing Edit route, Usage Count defect, General-category mismatch, and incompatible Campaign-setting limits.
The user should know how to export all Campaign Calls and Campaign Contacts, understand the columns included and excluded, and protect CSV files containing Phone Numbers, outcomes, opt-out information, and Recording URLs.
Most importantly, Campaign performance should be reviewed through several measurements rather than one percentage: