Reporting and KPIs

Guide to Call Center Reporting and Analytics

Call center reporting explained through the metrics that matter: AHT, FCR, CSAT, and service level, with the Power BI model and DAX measures to build them.

Sajagan Thirugnanam

·

Updated

Call center reporting means tracking metrics like average handle time, first call resolution, and CSAT so a manager can see how the team is performing and where service is breaking down. Built as a Power BI report on a table of individual calls, those numbers update as calls close instead of sitting in a spreadsheet that gets rebuilt once a week.

The metrics a call center report tracks

  • Average Handle Time (AHT). The average time an agent spends on a call, including hold and after-call wrap-up.

  • First Call Resolution (FCR). The share of contacts resolved without the customer needing to call back about the same issue.

  • Customer Satisfaction (CSAT). The share of post-call survey responses that score at or above a set threshold, usually 4 out of 5.

  • Service Level. The share of calls answered within a target wait time, commonly stated as "80% of calls answered in 20 seconds."

  • Abandonment Rate. The share of calls the customer hung up on before an agent answered.

Together they answer two questions: did the customer reach someone quickly, and did they need to call back.

The data model

A call center report needs one fact table at the grain of a single call, plus a small set of dimension tables:

Table

Grain

Key columns

Calls (fact)

one row per call

CallID, AgentKey, QueueKey, DateKey, WaitTimeSeconds, TalkTimeSeconds, HoldTimeSeconds, WrapTimeSeconds, Resolved, IsFCR, CSATScore, Abandoned

Agents (dimension)

one row per agent

AgentKey, AgentName, Team, HireDate

Queues (dimension)

one row per queue or skill

QueueKey, QueueName, Channel

Date (dimension)

one row per day

DateKey, Date, Weekday, Month

The IsFCR flag is worth calling out. Deciding whether a call was resolved on first contact usually means checking whether the same customer called again about the same issue within a set window, say 7 days. That lookup is easier to do once in Power Query or in the source system than to recompute in DAX every time the visual renders, so it should arrive in the Calls table as a column, not get derived on the fly.

Core measures in DAX

Answered Calls =
CALCULATE(COUNTROWS('Calls'), 'Calls'[Abandoned] = FALSE())
Average Handle Time (sec) =
CALCULATE(
    DIVIDE(
        SUM('Calls'[TalkTimeSeconds]) + SUM('Calls'[HoldTimeSeconds]) + SUM('Calls'[WrapTimeSeconds]),
        COUNTROWS('Calls')
    ),
    'Calls'[Abandoned] = FALSE()
)
First Call Resolution % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[IsFCR] = TRUE()),
    [Answered Calls]
)
CSAT % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[CSATScore] >= 4),
    CALCULATE(COUNTROWS('Calls'), NOT ISBLANK('Calls'[CSATScore]))
)
Service Level % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[WaitTimeSeconds] <= 20, 'Calls'[Abandoned] = FALSE()),
    COUNTROWS('Calls')
)
Abandonment Rate % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[Abandoned] = TRUE()),
    COUNTROWS('Calls')
)

Handle time and first call resolution count answered calls only. An abandoned call has no talk time, so including it would pull the average down and make the team look faster than it is.

The 20-second threshold in Service Level is an assumption baked into the measure. Most centers set their own target, so if it ever needs to change without editing DAX, put it in a what-if parameter, a slider Power BI adds so a reader can change the number without editing the report, instead of hardcoding it.

Report layout

A three-page report covers most call center reporting needs.

  1. Overview. Cards for AHT, FCR%, CSAT%, Service Level%, and Abandonment Rate, a trend line of call volume and AHT by day, and a table breaking those same measures out by queue.

  2. Agent performance. A matrix with agents on rows and the same measures on columns, with conditional formatting so an agent below target stands out without the reader having to scan every row.

  3. Trend. Line charts of each measure over time, so a manager can see whether a bad week is a blip or the start of a pattern.

For the mechanics of building any of these pages, see our guide to creating a dashboard in Power BI.

Real-time versus historical reporting

A call center typically needs both kinds of report, and they serve different readers. A real-time view, refreshed every few minutes, is for the supervisor deciding whether to pull an agent off a break because wait times are climbing. A historical view, refreshed daily, is for the manager reviewing a prior month's trend before a staffing decision. Building both from the same model, rather than two separate exports, keeps the numbers consistent between them.

For how these metrics fit into operational reporting more broadly, see our post on operational reporting. For how to pick and structure the KPIs themselves, see KPI reports: definition and examples.

Sources

Call center reporting means tracking metrics like average handle time, first call resolution, and CSAT so a manager can see how the team is performing and where service is breaking down. Built as a Power BI report on a table of individual calls, those numbers update as calls close instead of sitting in a spreadsheet that gets rebuilt once a week.

The metrics a call center report tracks

  • Average Handle Time (AHT). The average time an agent spends on a call, including hold and after-call wrap-up.

  • First Call Resolution (FCR). The share of contacts resolved without the customer needing to call back about the same issue.

  • Customer Satisfaction (CSAT). The share of post-call survey responses that score at or above a set threshold, usually 4 out of 5.

  • Service Level. The share of calls answered within a target wait time, commonly stated as "80% of calls answered in 20 seconds."

  • Abandonment Rate. The share of calls the customer hung up on before an agent answered.

Together they answer two questions: did the customer reach someone quickly, and did they need to call back.

The data model

A call center report needs one fact table at the grain of a single call, plus a small set of dimension tables:

Table

Grain

Key columns

Calls (fact)

one row per call

CallID, AgentKey, QueueKey, DateKey, WaitTimeSeconds, TalkTimeSeconds, HoldTimeSeconds, WrapTimeSeconds, Resolved, IsFCR, CSATScore, Abandoned

Agents (dimension)

one row per agent

AgentKey, AgentName, Team, HireDate

Queues (dimension)

one row per queue or skill

QueueKey, QueueName, Channel

Date (dimension)

one row per day

DateKey, Date, Weekday, Month

The IsFCR flag is worth calling out. Deciding whether a call was resolved on first contact usually means checking whether the same customer called again about the same issue within a set window, say 7 days. That lookup is easier to do once in Power Query or in the source system than to recompute in DAX every time the visual renders, so it should arrive in the Calls table as a column, not get derived on the fly.

Core measures in DAX

Answered Calls =
CALCULATE(COUNTROWS('Calls'), 'Calls'[Abandoned] = FALSE())
Average Handle Time (sec) =
CALCULATE(
    DIVIDE(
        SUM('Calls'[TalkTimeSeconds]) + SUM('Calls'[HoldTimeSeconds]) + SUM('Calls'[WrapTimeSeconds]),
        COUNTROWS('Calls')
    ),
    'Calls'[Abandoned] = FALSE()
)
First Call Resolution % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[IsFCR] = TRUE()),
    [Answered Calls]
)
CSAT % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[CSATScore] >= 4),
    CALCULATE(COUNTROWS('Calls'), NOT ISBLANK('Calls'[CSATScore]))
)
Service Level % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[WaitTimeSeconds] <= 20, 'Calls'[Abandoned] = FALSE()),
    COUNTROWS('Calls')
)
Abandonment Rate % =
DIVIDE(
    CALCULATE(COUNTROWS('Calls'), 'Calls'[Abandoned] = TRUE()),
    COUNTROWS('Calls')
)

Handle time and first call resolution count answered calls only. An abandoned call has no talk time, so including it would pull the average down and make the team look faster than it is.

The 20-second threshold in Service Level is an assumption baked into the measure. Most centers set their own target, so if it ever needs to change without editing DAX, put it in a what-if parameter, a slider Power BI adds so a reader can change the number without editing the report, instead of hardcoding it.

Report layout

A three-page report covers most call center reporting needs.

  1. Overview. Cards for AHT, FCR%, CSAT%, Service Level%, and Abandonment Rate, a trend line of call volume and AHT by day, and a table breaking those same measures out by queue.

  2. Agent performance. A matrix with agents on rows and the same measures on columns, with conditional formatting so an agent below target stands out without the reader having to scan every row.

  3. Trend. Line charts of each measure over time, so a manager can see whether a bad week is a blip or the start of a pattern.

For the mechanics of building any of these pages, see our guide to creating a dashboard in Power BI.

Real-time versus historical reporting

A call center typically needs both kinds of report, and they serve different readers. A real-time view, refreshed every few minutes, is for the supervisor deciding whether to pull an agent off a break because wait times are climbing. A historical view, refreshed daily, is for the manager reviewing a prior month's trend before a staffing decision. Building both from the same model, rather than two separate exports, keeps the numbers consistent between them.

For how these metrics fit into operational reporting more broadly, see our post on operational reporting. For how to pick and structure the KPIs themselves, see KPI reports: definition and examples.

Sources

Show us your report nobody trusts.

1 · A 30-minute call.

2 · We look at your current reports together.

3 · We tell you what we would do.

Show us your report nobody trusts.

1 · A 30-minute call.

2 · We look at your current reports together.

3 · We tell you what we would do.

Show us your report nobody trusts.

1 · A 30-minute call.

2 · We look at your current reports together.

3 · We tell you what we would do.

CaseWhen is a Berlin BI consultancy that builds reporting that leaders can trust, on the Microsoft stack: Power BI, Fabric and Azure.

Berlin, Germany

© CaseWhen Consulting GmbH

English

CaseWhen is a Berlin BI consultancy that builds reporting that leaders can trust, on the Microsoft stack: Power BI, Fabric and Azure.

Berlin, Germany

© CaseWhen Consulting GmbH

English

CaseWhen is a Berlin BI consultancy that builds reporting that leaders can trust, on the Microsoft stack: Power BI, Fabric and Azure.

Berlin, Germany

© CaseWhen Consulting GmbH

English