Required Datapoints
- Ticket Open Time: When the issue or inquiry is first logged.
- Ticket Resolution Time: When the issue is marked as resolved.
- Total Resolved Tickets: The number of tickets closed during the measurement period.
Time to Resolution (TTR) measures the average time it takes for a support team to fully resolve a customer inquiry, issue, or ticket. It starts when the issue is reported and ends when it is marked as resolved.
Time to Resolution (TTR) is a key indicator of support efficiency, operational readiness, and customer satisfaction, reflecting how quickly customer issues are resolved from first touch to closure.
The relevance and interpretation of this metric shift depending on the model or product:
A shorter TTR improves trust and retention, while longer times may indicate tooling gaps, resource limits, or knowledge base blind spots.
By segmenting by issue type, channel, or region, teams can identify specific friction points and optimize support flows accordingly.
Time to Resolution informs:
These are the main factors that directly impact the metric. Understanding these lets you know what levers you can pull to improve the outcome
Actionable ideas to optimize this KPI, from fast, low-effort wins to strategic initiatives that drive measurable impact.
Activities commonly tied to improving or operationalizing this KPI.
| Activity | Description |
|---|---|
| Customer Support | Customer Support is a proactive, strategic approach to supporting customers throughout their lifecycle, ensuring they realize maximum value from a product or service. It makes the motion operational through ownership, routines, and cross-functional follow-through. Relevant KPIs include Complaints Received and Complaints Resolved. |
| SLA Management | SLA Management focuses on establishing, monitoring, and optimizing Service Level Agreements (SLAs) between internal teams—such as sales, product, and customer success—and external stakeholders, including customers and partners. It makes the motion operational through ownership, routines, and cross-functional follow-through. Relevant KPIs include First Response Time and Resolution Time. |
| Escalation Handling | Escalation Handling is essential for maintaining satisfaction and driving retention. It helps teams translate strategy into repeatable execution. Relevant KPIs include Complaints Resolved and Time to Resolution. |
A SaaS company resolves 1,000 tickets in a month with a total resolution time of 50,000 minutes:
This KPI is associated with the following stages in the AAARRR (Pirate Metrics) funnel:
This KPI is classified as a leading Indicator. It signals likely future performance and is used to predict outcomes before they fully materialize.
This role is directly accountable for the KPI and is expected to drive progress and decisions around it.
These roles contribute directly to performance and typically partner on execution, reporting, or optimization.
These leading indicators influence or contextualize this KPI and help create a multi-signal early warning system, improving confidence and enabling better root-cause analysis.
These lagging indicators support the recalibration of this KPI, helping to inform strategy and improve future forecasting.
How this KPI is structured in Cube.js, including its key measures, dimensions, and calculation logic for consistent reporting.
cube('SupportTickets', { sql: `SELECT * FROM support_tickets`,
measures: { timeToResolution: { sql: `TIMESTAMPDIFF(HOUR, ticket_open_time, ticket_resolution_time)`, type: 'avg', title: 'Average Time to Resolution', description: 'Average time in hours to resolve a ticket from the time it is opened to the time it is resolved.' }, totalResolvedTickets: { sql: `id`, type: 'count', title: 'Total Resolved Tickets', description: 'Total number of tickets resolved in the given period.' } },
dimensions: { id: { sql: `id`, type: 'number', primaryKey: true, title: 'Ticket ID', description: 'Unique identifier for each ticket.' }, ticketOpenTime: { sql: `ticket_open_time`, type: 'time', title: 'Ticket Open Time', description: 'The time when the ticket was opened.' }, ticketResolutionTime: { sql: `ticket_resolution_time`, type: 'time', title: 'Ticket Resolution Time', description: 'The time when the ticket was resolved.' } },
preAggregations: { main: { type: 'originalSql', scheduledRefresh: true, refreshKey: { every: '1 hour' } } }});Note: This is a reference implementation and should be used as a starting point. You’ll need to adapt it to match your own data model and schema