The Call History system preserves the operational record of telephone activity processed through AIUNIFY Call Center.
A Call record can contain:
The application contains several interfaces that may all be described as Call History:
These interfaces do not display the same Call types, fields, or ownership scope.
This chapter primarily covers:
AI Agent Call History and Administrator Call Logs will be covered separately.
A Call is stored as:
when it originates from operations such as:
A Campaign Call is stored as:
when it is created through an outbound Campaign workflow.
A Campaign Call can be connected to:
Supported directions are:
The system or Agent called an external destination.
An external caller called an AIUNIFY-managed Phone Number.
The Call model supports:
Initiated means the Call record was created and the provider connection process began.
It does not confirm that the destination rang.
Ringing means the provider reported that a Call leg was ringing.
It does not confirm that a person answered.
In Progress means the Call is currently connected or treated as active.
Completed means the provider reported that the Call reached its completed state.
Completed does not automatically mean:
Duration, recording, transcript, and disposition should also be reviewed.
Busy means the destination returned a busy condition.
No Answer means the destination was not answered within the provider’s permitted ring period.
Failed means the provider or application could not complete the Call.
Possible causes include:
The normal Call History table does not display the stored error_message.
Canceled means the Call was canceled before normal provider completion.
A Call manually ended through the Softphone can also be stored as Canceled under the current implementation.
To open the primary history:
The page address is:
The heading is:
The description is:
The main Call History route is inside the Basic KYC group.
A normal Customer requires an approved Basic or Business KYC record when KYC is globally enabled.
The user normally requires:
When the permission is missing, the page renders an empty Call list and displays:
It does not intentionally return a raw authorization page for this specific list request.
An Administrator can see all standard Call records in the main Call History.
The main Call History query shows Calls where:
It does not add Calls whose User ID belongs to one of the Customer’s Agents.
The main Agent Call History query shows Calls where:
It does not include the Agent’s own User ID.
A browser Call initiated by an Agent is created with:
The main Agent history page searches the parent Customer ID instead.
An Agent’s own Softphone Calls can therefore be absent from:
The Call authorization policy allows a Customer to view Calls belonging to its Agents.
However, the main list and CSV export query only the Customer’s own User ID.
Therefore:
This is a current ownership-scope inconsistency.
The individual Call policy permits:
A Call can therefore be authorized on its direct detail route even when it does not appear in the user’s main list.
The top of the main Call History displays:
Total Calls counts all Calls within the role’s main history scope.
Completed counts Calls whose Status is:
The displayed Success Rate is:
Example:
This is not necessarily an answer rate because the Completed Status can include Calls with limited or zero useful conversation duration.
The Failed Card combines:
A busy or unanswered Call is therefore counted in the red Failed statistic even though its exact Status remains available in the table.
The In Progress Card combines:
Inbound and Outbound Cards display their counts and percentages of Total Calls.
The statistics are calculated from the user’s full role-scoped Call history.
They are not recalculated from the currently selected:
Example:
This is expected under the current controller.
The main Search placeholder states:
The backend currently searches only:
It does not search Contact Name.
Enter any recognizable part of the From or To Number.
Example:
The search uses substring matching.
To search:
The Search query compares the entered text against stored number strings.
Differences involving:
can affect results.
Searching a shorter numeric portion can improve matching.
Select:
The interface expands five controls:
The visible Status options are:
The menu does not provide visible choices for:
although those statuses exist in Call records.
The Type options are:
The Direction options are:
The date fields are:
The backend applies the date range to:
rather than started_at or ended_at.
The selected date is submitted as a calendar date and compared against the stored database date.
The visible Date and Time column is later formatted through the browser.
Near midnight, a record can appear under a different local calendar day than the date used by the backend filter.
Changing a dropdown or date field immediately requests a refreshed list.
Search requires selecting the Search button or pressing the form submission action.
There is no dedicated Reset button on the main Call History page.
To clear filters:
The main table contains:
The first column displays:
Completed Calls use a positive indicator.
Failed, Busy, and No Answer use a red missed-Call indicator.
Ringing and In-Progress Calls use a blue active indicator.
Direction is displayed as an Inbound or Outbound Badge.
For a Campaign Contact, the interface attempts to display:
and falls back to the destination number when no name exists.
Below it, the table displays:
The controller loads the relationship as:
Laravel normally serializes the relationship key as:
The page expects:
Because the expected frontend property does not match the normal serialized key, Campaign Contact names can fall back to the To Number.
The Type Badge displays:
When the Call has an associated Campaign, its Name is displayed as a link.
Selecting it opens the Campaign Details page.
A Call without a Campaign displays:
Duration is formatted as:
Examples:
A null or zero duration displays:
This can represent:
The main Call History formats Cost using the application’s currency formatter and displays four decimal places.
Examples:
When Cost is null or zero:
is displayed.
When a Recording URL exists, the table displays:
When no Recording URL exists:
is displayed.
The table displays the Call record’s:
timestamp using the browser’s local date and time format.
It does not display started_at in this column.
The Eye icon opens:
The main Call History controller returns:
When more than one page exists, the bottom displays:
Pagination retains the active:
When the account has no matching Calls:
is displayed.
When filters are active, the page advises the user to adjust them.
When no Calls exist, a Make a Call button opens:
Select the Eye icon on the main history table.
The Call Details address is:
The application checks the Call policy before opening the page.
A user cannot normally open an unrelated account’s Call merely by changing the ID.
The heading is:
with:
The page attempts to display:
The Contact Information Card can display:
The controller creates Contact information only when the Call has a:
It does not load the Call’s direct:
relationship for this page.
A manually placed Contact-linked Softphone Call can therefore display:
even when contact_id exists.
The Timeline Card displays:
using browser-local formatting.
When ended_at is null, the current interface still attempts to construct a date.
This can produce an invalid or misleading Ended At value.
When recording_url exists, the page displays a full-width browser audio player.
The Detail page expects a field named:
The actual Call model stores post-Call notes as:
As a result, saved post-Call Notes do not normally appear in the current Notes Card.
The page expects:
The controller sends the raw Call model with a loaded:
relationship.
It does not create a campaign_name property.
The Campaign Card can therefore be blank.
The Campaign Card is rendered even when a Call has no Campaign.
A manual Call can produce a blank or invalid Campaign link.
The frontend Call interface expects fields such as:
These are not supplied directly on the Call object.
The separate contact property is used for the Contact Card, but only for Campaign Contacts.
The current Call Details page does not display:
Although the translation help text says the Eye action can provide recordings, transcripts, and additional information, the current page does not render the Transcript fields.
The page does not provide visible controls for:
Customer navigation also contains:
The page address is:
The heading is:
The description states that the user can view Calls and listen to Recordings.
The /my-calls route does not have an explicit Customer-role or KYC middleware declaration in its immediate route definition.
The controller scopes results to:
Although the Sidebar presents it as a Customer feature, another authenticated role can potentially open the route directly and receive its own Call records.
This page shows only Calls whose User ID matches the signed-in account.
For an Agent, this can provide Agent-owned Calls that are missing from the main Agent /calls history.
For a Customer, it does not include Calls stored under Agent User IDs.
My Call History returns:
The page includes a:
button.
It reloads the current page and query.
It does not perform a direct provider synchronization.
The visible placeholder states:
The backend searches:
The Status selector contains all eight standard statuses:
Type options are:
Sentiment can be filtered by:
Lead Quality can be filtered by:
Select:
to submit the selected criteria.
Select:
to clear:
The table contains:
Both telephone numbers are shown:
My Call History displays raw seconds:
rather than minutes:seconds.
My Call History displays Cost using a hard-coded dollar sign:
It does not use:
A non-USD Call can therefore be labeled incorrectly.
When sentiment data exists, the table displays:
When a Recording URL exists, the page displays a custom Play/Pause button with:
The intended Transcript behavior is:
The My Call History controller explicitly selects:
It does not select:
The page checks:
but the controller does not return that column.
Therefore, the Transcript View button and Transcript modal cannot normally be reached under the current controller response.
The page checks:
but transcript_status is not selected.
The visible Processing... Badge cannot normally appear.
The backend may still filter by twilio_call_sid because SQL can search a column that is not part of the selected result.
However, the SID is not returned to the frontend.
The frontend defines an error_message property, but the controller does not select it.
Failed Calls do not display their error details in this interface.
A standard Call can store:
A Recording appears only after the provider has:
A completed Call can therefore initially show no Recording.
Recording Duration can differ from the Call’s total Duration because recording may begin at answer rather than at initial Call creation.
The standard user interfaces place the stored Recording URL directly into the browser audio player.
The API recording endpoint also returns the URL rather than proxying the audio content through AIUNIFY.
Because the current interface does not proxy standard Call Recordings, playback depends on the stored provider URL being directly accessible to the browser.
A provider-protected Recording URL can fail to play even though the database contains the URL.
The Call Policy defines separate permissions for:
However, the normal Call History pages render the Recording whenever recording_url is present after the user gains access to the Call list.
Those pages do not visibly invoke the separate Recording-listen permission.
This is a current permission-enforcement gap.
The standard user Call History pages do not provide a dedicated:
button.
The browser’s native audio controls may provide browser-dependent options, but this is not an AIUNIFY-managed download workflow.
Normal users cannot delete a Recording from Call History.
The interface does not display:
Do not assume Recordings remain permanently available.
A standard Call can store:
For applicable recorded Calls, the provider sends a Transcription callback containing:
The controller stores those values on the Call.
Transcript Price is stored separately from the Call’s telephone Cost.
The current standard user pages do not display it.
When:
the transcription callback attempts to start AI sentiment analysis.
A Transcript may be unavailable when:
The intended My Call History modal displays:
The current controller omission prevents the Transcript data from reaching that modal.
The main /calls/[ID] page does not render Transcript Text or Transcript Status.
The standard Call CSV export excludes:
A Call can contain:
Sentiment is classified as:
Sentiment Confidence is stored as a percentage from:
Lead Quality can be:
The primary automatic transcription-analysis service requests a Lead Score from:
The My Call History interface displays:
A separate sentiment-analysis API service instructs its model to produce a score from:
and stores that result in the same lead_score column.
The interface still labels it:
A Call analyzed through that alternate path could therefore display an invalid-looking result such as:
This is a current scoring-range inconsistency.
AI Summary is intended to provide a brief description of the conversation.
It is not a verbatim Transcript.
Detected intents can include concepts such as:
AI Analysis generally requires:
A Transcript can exist without AI Analysis.
Possible reasons include:
The automatic Sentiment Analysis service can update the associated Campaign Contact.
Its mapping includes:
It can also append AI Summary, Lead Score, Sentiment, and Intents to Campaign Contact Notes.
AI Sentiment and Lead Quality are estimates.
They should not independently determine:
Review the Transcript and business context.
The Softphone post-Call workflow supports:
The selected result is stored in:
Post-Call Notes are stored in:
with a maximum of 5,000 characters through the user disposition endpoint.
A Callback result can store:
When the Call has a direct contact_id, saving the Disposition can:
The main Call list does not display:
The Call Details page expects notes instead of call_notes.
Saved post-Call Notes do not normally appear there.
The main history and My Call History pages do not provide a Disposition filter.
Call History does not provide a form to revise a saved Disposition.
A Call Disposition of:
does not automatically set the master Contact’s Status to DNC.
The Contact must be updated separately according to the approved suppression process.
callback_at stores a date and time.
It does not automatically create:
The main Call History contains:
The button downloads a CSV file from:
The export uses the same main ownership rules:
It has the same Agent and Customer team-Call omissions as the main list.
The export preserves:
Only Calls matching those active filters are exported.
The export includes all matching Call records rather than only the ten visible rows.
The filename follows:
Example:
The CSV contains:
Contact Name is taken from the Campaign Contact’s:
When unavailable, the export places the To Number in the Contact Name column.
A directly linked manual Contact is not used for this export name.
Cost is exported as a raw numeric value.
The CSV does not include:
Do not assume every Cost value is USD when the platform supports multiple currencies.
The CSV contains the raw Recording URL.
Treat the export as sensitive because anyone who can access a working URL may be able to attempt Recording access.
The standard CSV excludes:
The backend streams records in groups of:
to reduce server memory usage during large exports.
The /my-calls page has no Export button.
Use the main /calls export where the required Calls are included in its ownership scope.
Call Status, Duration, Recording, and Transcript information are normally updated through provider Webhooks.
The standard Call History pages do not repeatedly poll for updates.
A Call can remain visibly:
until the page is refreshed.
The main page has no dedicated Refresh button.
Use:
Select the visible Refresh button.
This reloads database information.
The backend contains:
These can synchronize active Call information with Twilio.
The current standard history pages do not expose visible Sync buttons.
When a Call remains active long after it ended:
Normal users cannot delete Call records from Call History.
The Call Policy reserves Call deletion for Administrators.
The standard user pages do not show a Delete button.
Normal users cannot directly change:
through Call History.
Recordings and Transcripts can contain:
Only authorized personnel should have:
Store Call exports in an approved secure location.
Do not leave CSV files in:
Do not paste Recording URLs into:
unless specifically authorized and protected.
Follow the organization’s policies for:
Check:
The main Agent history queries the parent Customer ID.
Open /my-calls directly to check the Agent’s own User-scoped Calls, or use approved Administrator reporting.
The Customer list query does not include attached Agent User IDs.
Use approved Administrator reports until the ownership query is corrected.
The placeholder mentions Contact Name, but the backend searches only From and To Numbers.
Search by telephone number instead.
The main Status menu omits Canceled.
Use My Call History or export all records and filter the CSV.
The statistics ignore page filters and represent the user’s full role-scoped Call history.
The frontend expects a different Campaign Contact relationship key from the backend’s normal serialization.
The table can show the destination number instead.
The Call Detail page expects campaign_name, but the controller supplies a loaded Campaign relationship.
Return to the main list to view the Campaign link.
Post-Call Notes are stored as call_notes.
The Detail page checks notes.
Review the linked Contact Notes where the Disposition process appended them.
Possible causes include:
Possible causes include:
The Recording callback may not have included Duration, or the provider update may still be pending.
The standard page uses the stored provider URL directly rather than a server-side audio proxy.
Contact an Administrator to review protected Recording access.
Check:
The current My Call History controller does not include Transcript fields in its selected columns.
This is a known current implementation defect.
The standard Call Detail page does not render Transcript fields.
Transcription quality can be affected by:
Use the Recording for verification where authorized.
Possible causes include:
The alternate analysis service can save a 0–100 score while the page labels the result /10.
Treat the value as unreliable until the scoring pipeline is identified and corrected.
The automatic analysis service can change the associated Campaign Contact to:
when Lead Quality is not_interested.
Review the Transcript before reactivating the Campaign Contact.
Treat the Recording and verified human review as authoritative.
AI Summary is an interpretation.
Check:
Review:
The CSV omits price_unit.
Confirm the applicable currency through Account Statement, pricing records, or administrative reporting.
This is expected in the current standard Call export.
Confirm:
For authorized samples, review:
Confirm:
Confirm:
Do not automatically retry every:
Call without applying the organization’s retry rules.
Confirm:
Do not:
Confirm:
Confirm:
The reviewed Call History implementation currently includes these important limitations:
At the end of this chapter, the user should understand the differences among Manual, Campaign, Inbound, and Outbound Calls and know how to interpret:
The user should know how to open Communication Call History, interpret the six statistics Cards, search by Phone Number, filter by Status, Type, Direction, and Date, review Call rows, play available Recordings, open Call Details, and navigate pagination.
The user should understand that the main statistics represent the full role-scoped history rather than the filtered table and that the displayed Success Rate is:
The user should understand the difference between:
and:
including their different ownership rules, page sizes, filters, AI fields, and current implementation defects.
The user should know that standard Calls can store:
but the current user interfaces do not reliably expose every stored field.
The user should understand that the intended Transcript and AI Analysis modal on My Call History is currently blocked because its controller does not return Transcript fields. The user should also recognize the inconsistent Lead Score pipelines and avoid treating an AI-generated score as a definitive business decision.
The user should know how to export all filtered Calls to CSV and understand that the file includes Phone Numbers, Costs, and Recording URLs but excludes Transcripts, AI Analysis, Dispositions, Notes, and Currency Codes.
Finally, the user should follow this Call-review workflow: