Blog · Board and management reporting · Customer service
Use a copyable customer service dashboard template with ticket inputs, account ownership, metric formulas, and checks. The worked worksheet shows how backlog, completed SLA attainment, resolution hours, and repeat contacts reconcile.
A customer service dashboard template needs defined input fields, explicit reporting boundaries, and checks beside the metrics. Copy the worksheet layout and formulas below into a workbook, then replace the example records with your own ticket and account exports.
Use the following sheet names so the formulas remain reusable. This is a copyable worksheet specification; each formula belongs in the field or cell named beside it.
| Worksheet | Contents | Refresh rule |
|---|---|---|
| Controls | Period start and exclusive cutoff | Change deliberately for each review |
| Accounts | Unique account IDs and service owners | Replace from the current account list |
| Tickets | Ticket inputs and helper columns | Replace input records; retain formulas |
| Review | Account metrics and total checks | Recalculate after validation |
Convert the account range to an Excel table named tAccounts and the ticket range to a table named tTickets. Structured references use table and column names and adjust when table data changes. The formulas below refer to those exact names.
The customer service dashboard workflow explains how to run the review. For the measure selection behind it, use KPIs for B2B customer service teams.
Enter real date-time values in the controls. This example uses UTC, calendar hours, and no paused clocks. The end is exclusive: a closure exactly at the cutoff belongs to the next period.
| Controls cell | Label | Example value |
|---|---|---|
| B2 | PeriodStart | July 1, 2026, 12:00 AM |
| B3 | Cutoff | July 8, 2026, 12:00 AM |
Create tAccounts with these columns. Team names stand in for the responsible service owners.
| AccountID | AccountName | ServiceOwner |
|---|---|---|
| A01 | Acorn Industrial | East service team |
| B01 | Beacon Distribution | West service team |
Create these input columns in tTickets. All example timestamps are midnight UTC in 2026. Leave unresolved dates empty. TargetHours is the ticket's applicable resolution commitment, and RepeatFlag is either 0 or 1 under a documented same-issue linking policy.
| TicketID | AccountID | OpenedAt | ResolvedAt | TargetHours | RepeatFlag |
|---|---|---|---|---|---|
| S201 | A01 | June 29 | July 2 | 72 | 0 |
| S202 | B01 | July 2 | July 3 | 48 | 0 |
| S203 | A01 | July 4 | Blank | 48 | 1 |
| S204 | B01 | July 7 | Blank | 48 | 0 |
Keep tickets open at the start even when they were created in an earlier period. A creation-date-only export cannot reconstruct the backlog. Do not append successive snapshots as if they were separate tickets.
Add each named column to tTickets and enter its formula in the first data row. Flags return 1 when true and 0 when false. Duration fields stay blank outside their relevant population.
| Helper column | Formula |
|---|---|
| OpenAtStart | =--AND([@OpenedAt]<Controls!$B$2,OR([@ResolvedAt]="",[@ResolvedAt]>=Controls!$B$2)) |
| NewInPeriod | =--AND([@OpenedAt]>=Controls!$B$2,[@OpenedAt]<Controls!$B$3) |
| ClosedInPeriod | =--AND(ISNUMBER([@ResolvedAt]),[@ResolvedAt]>=Controls!$B$2,[@ResolvedAt]<Controls!$B$3) |
| OpenAtEnd | =--AND([@OpenedAt]<Controls!$B$3,OR([@ResolvedAt]="",[@ResolvedAt]>=Controls!$B$3)) |
| ResolutionHours | =IF([@ClosedInPeriod]=1,24*([@ResolvedAt]-[@OpenedAt]),"") |
| SLAMet | =IF([@ClosedInPeriod]=1,--([@ResolutionHours]<=[@TargetHours]),"") |
| AgeDays | =IF([@OpenAtEnd]=1,Controls!$B$3-[@OpenedAt],"") |
| OverdueOpen | =IF([@OpenAtEnd]=1,--(24*[@AgeDays]>[@TargetHours]),0) |
| IDCount | =COUNTIFS(tTickets[TicketID],[@TicketID]) |
| AccountMatches | =COUNTIFS(tAccounts[AccountID],[@AccountID]) |
The final two columns must each equal 1 on every record. Microsoft's COUNTIFS documentation describes counting records that satisfy the criteria. Here, repeated ticket IDs and missing or duplicated account matches become visible exceptions.
Before accepting these calculations, require nonblank TicketID and AccountID values. Check that OpenedAt is a timestamp, ResolvedAt is blank or a timestamp no earlier than OpenedAt, TargetHours is positive and populated, and RepeatFlag is 0 or 1. Reject invalid rows for correction; keep their count visible instead of silently excluding them.
On Review, put A01 in A2 and B01 in A3. Use the following column layout and row-2 formulas, then fill down. SUMIFS adds values meeting the specified criteria, allowing the same helper flags to supply each account's counts.
B2 Opening
=SUMIFS(tTickets[OpenAtStart],tTickets[AccountID],$A2)
C2 New
=SUMIFS(tTickets[NewInPeriod],tTickets[AccountID],$A2)
D2 Closed
=SUMIFS(tTickets[ClosedInPeriod],tTickets[AccountID],$A2)
E2 Closing
=SUMIFS(tTickets[OpenAtEnd],tTickets[AccountID],$A2)
F2 MeanResolutionHours
=IF(D2=0,"",SUMIFS(tTickets[ResolutionHours],tTickets[AccountID],$A2)/D2)
G2 CompletedSLARate
=IF(D2=0,"",SUMIFS(tTickets[SLAMet],tTickets[AccountID],$A2)/D2)
H2 RepeatShareOfNew
=IF(C2=0,"",SUMIFS(tTickets[RepeatFlag],tTickets[AccountID],$A2,tTickets[NewInPeriod],1)/C2)
I2 OverdueOpen
=SUMIFS(tTickets[OverdueOpen],tTickets[AccountID],$A2)
J2 MovementResidual
=B2+C2-D2-E2
Covirage is not affiliated with Microsoft.
For the total row, sum counts in columns B:E and I. Set J4 to =B4+C4-D4-E4. Use the formulas below for F4:H4, preserving the correct denominators:
F4 =IF(D4=0,"",SUM(tTickets[ResolutionHours])/D4)
G4 =IF(D4=0,"",SUM(tTickets[SLAMet])/D4)
H4 =IF(C4=0,"",SUMIFS(tTickets[RepeatFlag],tTickets[NewInPeriod],1)/C4)
| Account | Opening | New | Closed | Closing | Mean hours | Completed SLA | Repeat share | Overdue open |
|---|---|---|---|---|---|---|---|---|
| A01 | 1 | 1 | 1 | 1 | 72.0 | 100.0% | 100.0% | 1 |
| B01 | 0 | 2 | 1 | 1 | 24.0 | 100.0% | 0.0% | 0 |
| Total | 1 | 3 | 2 | 2 | 48.0 | 100.0% | 33.3% | 1 |
The completed durations are 72 and 24 hours, so the mean is 96 / 2 = 48.0. Both completed tickets met their targets: 2 / 2 = 100.0%. One of three newly opened tickets was a repeat: 1 / 3 = 33.3%. Round displayed hours and percentages to one decimal place after calculation.
Every MovementResidual must equal zero. The total bridge is 1 + 3 - 2 - 2 = 0. The two closing tickets are four days and one day old; only the four-day ticket exceeds its 48-hour target. This explains why completed SLA attainment can be perfect while an open commitment is overdue.
Also compare total review counts with the corresponding helper-column sums. That catches an omitted account row even when each displayed account reconciles. Preserve the source filename and export cutoff with the workbook so the next reviewer can repeat the check.
Bring the workbook's ticket and account records to Covirage. Covirage maps the columns, its tools compute and check the figures, and the external AI model explains the account differences with every figure traced to its rows. Create a free Covirage account and bring a sample of your own data.
See Covirage for customer service teams for the account questions this review supports.
Start with unique ticket ID, account ID, opened and resolved timestamps, the applicable service target, and a documented repeat-contact flag. Add an account list with ownership and reporting controls. Severity and category are useful extensions when they explain different work or commitments.
The formulas shown use elapsed calendar hours without pauses. Business-hour commitments require the applicable work calendar and pause history. Keep the supplied attainment measure separate until those contractual clocks can be reconstructed, rather than assuming that calendar-hour subtraction measures the same obligation.
Leave completed resolution time and completed SLA attainment blank for that account. The denominator is empty, so zero would imply a measured result. Continue showing its open backlog, ages, and overdue commitments, which can still require immediate action.