Case study · Operations & CX analytics
Customer Service Performance: where should a support team focus?
A fictional retailer's 1,800 support tickets, created January–June 2025 and measured at 1 July 2025 00:00 UTC. Excel, SQLite and Python. All figures are simulated.
The decision
Which queues miss service targets, and which unresolved cases deserve attention first? An operations manager needs timely responses without encouraging rushed resolutions or ignoring dissatisfied customers.
Data-quality audit
The project starts from 1,820 generated records with deliberate problems, ending with 1,800 unique tickets.
- 20
- exact duplicate rows removed
- 25
- channel labels trimmed and standardised
- 5
- invalid CSAT scores set to missing
- 10
- missing priorities kept as Unknown
Unknown priorities stay visible in volumes and are excluded only from target-based measures — never silently assigned a favourable target. Every change is in the cleaning log.
Interactive dashboard
Every number below is recomputed in your browser from the 1,800 ticket rows. Month views are creation cohorts measured at the 1 July 2025 snapshot, not monthly backlog history.
1,800 of 1,800 tickets match · filters combine with AND · All tickets created Jan–Jun 2025, at 1 Jul 2025 snapshot
- Tickets
- 1,800
- 1642 resolved
- Open backlog
- 158
- 134 older than 7 days (>168h)
- Response SLA
- 61.2%
- 1,094 / 1,789 eligible met target
- Resolution SLA
- 56.5%
- 1,002 / 1,775 eligible met target
- CSAT (4–5 of 5)
- 61.9%
- n = 762 valid surveys
- Valid survey coverage
- 46.4%
- 762 / 1,642 resolved tickets
- Median first response
- 7.09h
- n = 1796 responded; censored
- P90 first response
- 27.55h
- Linear interpolation, (n−1)×0.9
Unknown-priority tickets count in volumes but have no target, so SLA shows “Not available” when no eligible tickets remain. Simulated data.
Response attainment by channelSimulated
| Group | Attainment | Met | Eligible |
|---|---|---|---|
| Web chat | 89.1% | 327 | 367 |
| 63.7% | 383 | 601 | |
| 46.8% | 384 | 821 |
Resolution attainment by issueSimulated
| Group | Attainment | Met | Eligible |
|---|---|---|---|
| Billing | 63.2% | 222 | 351 |
| Product information | 61.2% | 219 | 358 |
| Delivery | 60.0% | 201 | 335 |
| Account access | 57.4% | 220 | 383 |
| Refund | 40.2% | 140 | 348 |
Open backlog age at 1 Jul 2025Simulated
| Age band | Open tickets |
|---|---|
| ≤24h | 3 |
| >24–72h | 10 |
| >72–168h | 11 |
| >168h | 134 |
Oldest open tickets (158 in current filter)
| T01463 | Normal | Account access | 4306.0 | Breached | |
| T00776 | Normal | Refund | 4301.7 | Breached | |
| T00268 | Web chat | High | Delivery | 4299.3 | Breached |
| T01574 | Normal | Billing | 4292.9 | Breached | |
| T00851 | Low | Delivery | 4222.0 | Breached | |
| T01299 | High | Refund | 4213.6 | Breached | |
| T01301 | Normal | Billing | 4199.8 | Breached | |
| T00892 | Web chat | Low | Account access | 4151.7 | Breached |
| T00079 | High | Product information | 4141.3 | Breached | |
| T01664 | Normal | Delivery | 4135.7 | Breached | |
| T01232 | Normal | Billing | 4027.1 | Breached | |
| T00388 | High | Delivery | 4006.0 | Breached | |
| T00063 | Normal | Refund | 4003.3 | Breached | |
| T00045 | Normal | Delivery | 3964.5 | Breached | |
| T01671 | Normal | Billing | 3952.3 | Breached |
Definitions
- Response / resolution SLA — tickets meeting target ÷ eligible tickets. Eligible means known priority and either an observed event or a passed deadline. Exact boundaries count as met; overdue open cases count as breaches; cases still within their window are pending, not failures.
- CSAT — valid scores of 4–5 ÷ all valid scores (1–5). Valid survey coverage — valid scores ÷ resolved tickets.
- Open backlog — tickets without resolution at snapshot; older than 7 days means age over 168 hours.
Assumed targets and clocks
Training assumptions, not industry benchmarks. Elapsed calendar hours, 24/7, no holiday or pause adjustment.
| Priority | First response | Resolution |
|---|---|---|
| Urgent | 1h | 8h |
| High | 4h | 24h |
| Normal | 12h | 72h |
| Low | 24h | 120h |
Duration statistics
Median and P90 first response use responded tickets only (nulls excluded). P90 uses linear interpolation at (n−1)×0.9. Open cases are censored, so durations do not describe every ticket's experience.
Methodology
Excel formulas calculate ticket-level eligibility, breaches and backlog. SQLite queries compare channels, categories and creation cohorts. Python validates chronology and deadline edge cases and reconciles SQL with Excel. Unlike a dashboard that simply averages handling times, this analysis counts overdue open cases and excludes cases not yet due.
Generation: tickets spread uniformly over January–June 2025; channel weights Email 45%, WhatsApp 35%, Web chat 20%; priority weights Urgent 8%, High 22%, Normal 55%, Low 15%. Email responses and Refund resolutions were deliberately made slower.
Findings
- Email is the main first-response pressure point. 384 of 821 eligible Email tickets met target (46.8%), versus 327 of 367 for Web chat (89.1%). Email accounts for 437 of 695 response breaches.
- Refunds take longest to resolve within target. 140 of 348 eligible Refund tickets (40.2%) — the lowest category.
- Backlog and survey coverage change the story. 158 tickets remain open, 134 older than 7 days. CSAT is 61.9% (472/762), but valid coverage is only 46.4% (762/1,642), so it describes respondents, not every customer.
These patterns were engineered into the synthetic data; comparisons are descriptive, not causal.
Action hypotheses
Proposed next steps to test — not implemented, no impact claimed:
- Pilot scheduled Email triage and measure response attainment against a comparable queue.
- Map refund handoffs and approval steps before proposing a fix.
- Review the oldest unresolved tickets, taking priority into account.
- Track response and resolution attainment alongside reopen rate and CSAT as guardrails.
Limitations
- Synthetic data; targets, bottlenecks and satisfaction patterns are assumptions.
- No business-hours SLA engine, staffing or handoff data; staffing or financial benefits cannot be estimated.
- Survey non-respondents may have different experiences.
Source & attribution
Original synthetic dataset generated with ChatGPT on 10 October 2026 (seed 20261011). No external, personal or employer records were used. Rachel chose the project direction; data and implementation are AI-assisted.
Downloads
- Complete project package (ZIP, 540 KB) — data, workbook, SQL, Python, cleaning log, results and docs.
- Excel workbook (XLSX, 415 KB) — formula-based dashboard, ticket table and methodology.
- Raw tickets (CSV, 1,820 rows) — before cleaning, with injected issues.
- Clean tickets (CSV, 1,800 rows) — after documented cleaning.
- SQL queries (analysis.sql) — channels, backlog, categories and cohorts.
- Python pipeline (pipeline.py) — generation, cleaning, metrics and reconciliation checks.
