> This page is for Cloud Call Center.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.hams.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.hams.ai/_mcp/server.

# Post-call analysis

> Set up analysis profiles and read the result that post-call analysis gives each transcribed call.

Post-call analysis reads the transcript of a call. It records how the call ended for the customer, the mood of the customer, and why the customer called. It also gives a short summary, a score for the human agent, and labels. Analysis profiles tell the system which calls to analyze and how.

> **Note**
>
> Post-call analysis is off by default. Hams support turns on **Post-call Analysis** for your account. The analysis reads the transcript of a call, so Hams support must also turn on **Call Transcription**. Only calls with a recording get a transcript. In Cloud Call Center, only administrators can manage analysis profiles, see analysis results, open the report, and start an analysis.

## Before you start

You need these items before the system can analyze a call:

* **Call Center**, **Call Transcription**, and **Post-call Analysis** on for your account.
* A recording policy that records the calls. See [Trunks](/cloud-call-center/settings/trunks) and [Queues](/cloud-call-center/settings/queues).
* At least 1 analysis profile that is on. See [Create a profile](#create-a-profile).

## How the analysis works

1. A recorded call ends. The system prepares the recording and then the transcript. See [Transcripts](/cloud-call-center/call-history#transcripts).
2. When the transcript is ready, the system starts the analysis. It waits until the record of the call is complete.
3. The system finds the first profile that is on and matches the call. It checks the profiles from the top of the list to the bottom.
4. The system sends the transcript and some facts about the call for analysis. The result shows a short time later.

The system analyzes inbound and outbound calls, and calls that a campaign places. It does not analyze internal calls between 2 extensions.

The system does not analyze a call in these cases:

* The call has no recording, or the transcript failed. See [Transcripts](/cloud-call-center/call-history#transcripts).
* No profile that is on matches the call. The result shows **No analysis profile matched this call.**
* The transcript has no speech. The result shows **The call had no speech to analyse.**
* **Post-call Analysis** was off when the transcript became ready.

If no profile matched, an administrator can start the analysis manually after a profile is on. See [Run the analysis again](#run-the-analysis-again).

## Analysis profiles

A profile sets which calls to analyze, which labels the analysis can use, the language of the result, and extra instructions. To open the profiles, click **AI** in the Cloud Call Center sidebar. Then click **Analysis profiles**. The page opens at `/app/accounts/{account_id}/call-center/call-analysis/profiles`. If **Post-call Analysis** is off for your account, the page opens **Call History** instead.

![The Post-call analysis profiles page: the conditions, the labels, and the language of each profile, in match order.](/_fern-img/14a8b7daca40b0aa404a681a6d0f141b609b05ee692ac82481300c3491e19e94.webp)

The **Post-call analysis profiles** page has these columns: **Name**, **Runs on**, **Labels it may use**, **Language**, and **Enabled**. A profile with no conditions shows **Catch-all** and runs on **Every finished call**. Use **Search by profile name or conditions** to find a profile.

The order of the list is the match order. To change the order, drag a profile by its handle. The system saves the new order and shows **Order saved**. You cannot drag a profile while you search the list.

If a catch-all profile is on and is above a profile, the lower profile shows **Never runs: a catch-all profile above it matches first**. Move the catch-all profile to the bottom of the list.

To turn a profile on or off, use its **Enabled** switch. The actions menu of each profile has **Edit**, **Duplicate**, and **Delete**.

* **Duplicate** makes a copy with the name **Copy of** and the name of the profile. The copy is off. The edit drawer of the copy opens.
* **Delete** opens a dialog. Click **Delete** to confirm. The system keeps the results that the profile already gave, with the name of the profile.

### Create a profile

#### Open the profiles

Click **AI** in the Cloud Call Center sidebar. Click **Analysis profiles**.

#### Open the form

Click **New profile**. The **New analysis profile** drawer opens.

#### Name the profile

Enter a **Name**. The name must be unique in the account.

#### Set the conditions

Under **Analyse calls when**, click **Add condition**. Select a fact, an operator, and a value. If necessary, add more conditions.

#### Set the labels

Under **Labels the analysis may use**, click **Add a label**. Select the labels.

#### Set the language

Select the **Analysis language**: **Arabic** or **English**.

#### Add instructions

Enter **Extra instructions** for the analysis, if necessary.

#### Save the profile

Click **Create**. The drawer closes and the page shows **Profile saved**. The new profile appears at the end of the list.

If a catch-all profile is on and is at the end of the list, a new profile never runs. Drag the new profile above the catch-all profile.

The **Enabled** switch at the top of the drawer turns the profile on or off. A new profile is on. The default language is **Arabic**. If you close the drawer with changes that you did not save, the **Discard changes?** dialog opens.

![The New analysis profile drawer: the name, the conditions, the labels, the language, and the extra instructions.](/_fern-img/30a07a63e288b47f40e839db8f7aced3adbab263352cc3edb32c5a6bef9d4f24.webp)

### Profile fields

| Field                                               | Rules                                                                                                                                                                                    |
| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Name**                                            | Necessary. 120 characters or fewer. 2 profiles in one account cannot have the same name.                                                                                                 |
| **Analyse calls when**                              | Up to 20 conditions. If a profile has no conditions, it matches every inbound and outbound call. The drawer then shows **No conditions means every finished call. This is a catch-all.** |
| **Match all conditions** or **Match any condition** | Shows when the profile has 2 or more conditions. The default is **Match all conditions**.                                                                                                |
| **Labels the analysis may use**                     | Up to 50 labels, from the labels of your Omni Channel account. Each label has 100 characters or fewer.                                                                                   |
| **Analysis language**                               | **Arabic** or **English**. The summary, the reason for calling, and the reason for the agent score use this language.                                                                    |
| **Extra instructions**                              | Optional. Up to 4,000 characters. The analysis reads these instructions with its own rules. A counter shows the number of characters.                                                    |

### Conditions

A condition tests 1 fact about the call. These facts are available:

| Fact                                                | Path                                                                      |
| --------------------------------------------------- | ------------------------------------------------------------------------- |
| **Caller number**                                   | `call.caller_number`                                                      |
| **Dialed number (DID)**                             | `call.did` (inbound calls only)                                           |
| **Direction**                                       | `call.direction`: `inbound` or `outbound`                                 |
| **Outcome**                                         | `call.outcome`, the call outcome                                          |
| **Answered**                                        | `call.answered`: `true` or `false`                                        |
| **Call status**                                     | `call.status`                                                             |
| **Started at**, **Answered at**, **Ended at**       | `call.started_at`, `call.answered_at`, `call.ended_at`, as ISO 8601 times |
| **Duration (seconds)**                              | `call.duration_seconds`                                                   |
| **Talk time (seconds)**                             | `call.talk_seconds`                                                       |
| **Agent extension**, **Agent name**, **Agent user** | `call.agent.extension`, `call.agent.name`, `call.agent.user_id`           |
| **Queue**                                           | `call.queue_id`, the last queue of the call                               |
| **Transfers**                                       | `call.transfer_count`                                                     |
| **Call flow**                                       | `call.flow_id`                                                            |
| Campaign                                            | `call.campaign_id`, the campaign that placed the call                     |

The operators depend on the fact. A fact with a fixed list of values, for example **Direction**, has **Equals**, **Does not equal**, **Is present**, and **Is not present**. A count or a duration also has **Greater than** and **Less than**. Other facts also have **Contains**, **Does not contain**, **Starts with**, **Ends with**, and **Matches regex**. Every operator needs a value, except **Is present** and **Is not present**.

A **Matches regex** condition uses RE2 syntax, with up to 10 patterns of 256 characters or fewer each. RE2 does not support back-references or lookarounds. The profile does not save if a pattern is not valid. The rules are the same as the rules of a **Branch** node. See [Branch](/cloud-call-center/call-flows#branch).

A profile can test only the facts in the table. If you type a different path in **Custom path…**, the profile does not save.

### Labels

The analysis can pick only the labels that the profile lists. If the profile lists no labels, the result has no labels. The system does not add the labels to a conversation. The labels show on the result, in call history, and in the report.

If someone deletes a label in Omni Channel, the drawer shows it struck through, with the tooltip **Removed**. The system removes it from the profile when you save.

## Result fields

| Field                  | Values                                                                                                                                                                                                 |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Summary                | 2 or 3 sentences: what the customer wanted, what the agent did, and how the call ended.                                                                                                                |
| **Resolution**         | How the call ended for the customer: **Resolved**, **Unresolved**, **Escalated**, or **Customer silent**.                                                                                              |
| **Sentiment**          | The mood of the customer at the start and at the end of the call. The values are **Very negative**, **Negative**, **Neutral**, **Positive**, and **Very positive**.                                    |
| **Reason for calling** | 1 short sentence that tells why the customer called, or why the call center called the customer.                                                                                                       |
| **Agent score**        | 1 to 5 for how well the human agent handled the call, with 1 sentence that gives the reason. The result has no score when no human agent spoke, for example on a call that only a voice agent handled. |
| Labels                 | The labels from the profile that apply to the call.                                                                                                                                                    |

The resolution and the sentiment use these API values: `resolved`, `unresolved`, `escalated`, `customer_silent`, and `very_negative`, `negative`, `neutral`, `positive`, `very_positive`.

* **Resolved** means that the customer got what they needed.
* **Unresolved** means that the customer did not get what they needed, and the call ended.
* **Escalated** means that the call went to another team, or someone promised a follow-up, and the call did not end the matter.
* **Customer silent** means that the customer stopped before the call had a result.

The analysis does not judge the agent on menu prompts, hold music, or announcements. If a transcript is very long, the analysis reads only its beginning and its end.

## Read a result

To read the result of a call, open the call in **Call History**. The **Call Details** drawer has an **Analysis** tab for an administrator. The tab shows when **Post-call Analysis** is on, or when the call already has an analysis.

![The Analysis tab of the call details drawer with the result of a call.](/_fern-img/5bc3bcd4a276a79b1d1f43c6228507c2ad2aa1181bc0b07fb8824df48f17a0af.webp)

The **Post-call analysis** card on the tab shows the summary, the **Resolution**, and the **Sentiment** at the start and at the end. It also shows the **Reason for calling**, the **Agent score**, and the labels. The line **Profile:** shows the name of the profile that made the result.

The card shows the state of the analysis:

| The card shows                                                                     | Meaning                                                      |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| **This call has not been analysed.**                                               | The call has no analysis.                                    |
| **Analysis in progress.**                                                          | The analysis is not complete.                                |
| **No analysis profile matched this call.**                                         | No profile that is on matched the call.                      |
| **The call had no speech to analyse.**                                             | The transcript has no speech.                                |
| **Analysis is not configured.**                                                    | The analysis service is not available. Contact Hams support. |
| **The analysis could not be submitted.** or **The analysis request was rejected.** | The system could not send the call for analysis.             |
| **The analysis service failed.** or **The analysis returned an unusable result.**  | The analysis did not give a valid result.                    |
| **The analysis timed out.**                                                        | The result did not arrive in time.                           |
| The result                                                                         | The analysis is complete.                                    |

If an analysis failed, start it again. See [Run the analysis again](#run-the-analysis-again).

## Run the analysis again

Only administrators can start an analysis. On the **Analysis** tab, click **Analyse this call**. If the call already has an analysis, click **Analyse again**. The tab shows **Analysis in progress.** until the new result is ready.

In the report, open the actions menu of a row and click **Analyse again**. If the call has a completed result, the **Rerun the analysis?** dialog opens. Click **Rerun** to confirm.

The new result replaces the current result. If the profile of the current result still exists, the system uses that profile again, with its current settings. If not, the system finds the first profile that matches the call.

You cannot start an analysis in these cases:

* **Post-call Analysis** is off for your account.
* The call is internal.
* The call has no transcript that is ready.
* An analysis of the call is in progress.

## Call history

When **Post-call Analysis** is on, the **Call History** list has 3 more columns for an administrator:

| Column         | What it shows                                                                                                                                                                               |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Resolution** | The resolution of a completed result. This column shows **Went silent** for **Customer silent**. If the analysis is not complete, the column shows **Pending**, **Skipped**, or **Failed**. |
| **Sentiment**  | An icon for the mood of the customer at the end of the call. Point at the icon to read the value.                                                                                           |
| **Labels**     | Up to 2 labels of the result. The page hides this column by default.                                                                                                                        |

To show, hide, or move a column, click **Columns**. To return to the default columns, click **Reset to default**.

Click **Filter** to narrow the list by the analysis. Under **Resolution**, select a resolution. Under **Ending sentiment**, select the mood of the customer at the end of the call. Then click **Apply**. See [Call history and recordings](/cloud-call-center/call-history).

## The report

The **Post-call analysis** report shows the results of the calls that started in a period. To open it, click **Reports** in the Cloud Call Center sidebar. Then click **Post-call analysis**. The page opens at `/app/accounts/{account_id}/call-center/reports/call-analysis`. Only administrators can open it.

![The Post-call analysis report: the totals, how calls ended, the customer sentiment, the top labels, and the agent scores.](/_fern-img/d5a15889ee6212ba91600c9cf22dcac893d2a76c13084d098eafd13b2ca26118.webp)

The filter bar works like the filter bar of the other reports. See [Reports](/cloud-call-center/reports#filters). It has these filters:

* The period. The range is 92 days or less.
* **Queues**: the calls that went through one of the selected queues.
* **Agents**: the calls that one of the selected agents handled.
* **Labels**: the results that have one of the selected labels.

The refresh control shows when the report last loaded. Click it to load the report again.

The tiles at the top count the analyses: **Total**, **Analysed**, **Skipped**, **Failed**, and **Pending**. The report also has these cards:

| Card                   | What it shows                                                                                                                                                                                                                                                            |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **How calls ended**    | A donut chart of the resolutions of the analyzed calls, with the percentage of resolved calls in the center.                                                                                                                                                             |
| **Customer sentiment** | The mood of the customers at the **Start** and at the **End**. **Ended positive** is the percentage of analyzed calls that ended **Positive** or **Very positive**. **Mood improved** is the percentage of analyzed calls that ended in a better mood than they started. |
| **Top labels**         | Up to 10 labels that the analysis picked most.                                                                                                                                                                                                                           |
| **Agent scores**       | The average score out of 5 for each agent, with the number of scored calls.                                                                                                                                                                                              |

### Analysed calls

The **Analysed calls** table lists the calls that the report counts, with the newest call first. It has these columns: **Started**, **Direction**, **From**, **To**, **Agent**, **Duration**, **Recording**, **Profile**, **Resolution**, and **Sentiment**. To show **Reason for calling**, **Labels**, and **Agent score**, click **Columns**.

The **Resolution** column of this table shows **Customer went silent** for **Customer silent**. Click a row to open the **Call Details** drawer of the call. To start the analysis of a row again, use its actions menu. See [Run the analysis again](#run-the-analysis-again).

## Webhook

When an analysis gives a result, the system sends the `call.analysis_completed` webhook. Each new result of the same call sends the webhook again, with a higher `attempt`. A failed or skipped analysis does not send it. See [Webhooks](/cloud-call-center/api/webhooks).

The Developer API also shows the state, the resolution, the end sentiment, the agent score, and the labels on each call record. See [Call history and recordings](/cloud-call-center/api/call-history-and-recordings).

## Omni Channel

If **Voice Channel** is on for your account, the system also sends the result to the Omni Channel conversation of the call. The call card in the conversation shows the resolution, the sentiment, the agent score, the summary, and the labels. If the call center analyzes the call again, the card shows the newest result. All users who can open the conversation see the card. A call that a campaign places does not show in Omni Channel, so its result shows only in the call center. See [Voice](/omni-channel/voice#call-analysis).

## Related

* [Call history and recordings](/cloud-call-center/call-history)
* [Reports](/cloud-call-center/reports)
* [Webhooks](/cloud-call-center/api/webhooks)
* [Voice](/omni-channel/voice)
* [Post-chat analysis](/omni-channel/reports/post-chat-analysis)