Required Datapoints
- Total Support Costs: All expenses related to running customer support for a specific period.
- Total Tickets Resolved: The number of support tickets closed during the same period.
**Cost Per Ticket (CPT) **measures the average cost incurred by a business to resolve a single customer support ticket. It reflects the efficiency of support operations and resource allocation.
Cost Per Ticket (CPT) tracks the average cost of handling a support inquiry, combining labor, tooling, and overhead into a single operational efficiency benchmark.
The relevance and interpretation of this metric shift depending on the model or product:
A low CPT with high resolution quality = service excellence. A rising CPT suggests overhead drag or process complexity.
Segment by inquiry type, product area, or support channel to surface cost-saving opportunities.
Cost Per Ticket 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. |
| Support Efficiency Programs | Support Efficiency Programs involves systematically identifying, designing, and implementing process improvements to drive operational excellence across the revenue organization. It coordinates execution across touchpoints so teams can move users or accounts toward the target outcome. Relevant KPIs include Cost Per Ticket. |
| Case Deflection Tactics | Case Deflection Tactics involves strategically deploying tools, resources, and processes that allow customers to independently resolve their questions or issues without submitting formal support requests. It helps teams translate strategy into repeatable execution. Relevant KPIs include Cost Per Ticket. |
A SaaS company calculates the following for Q1:
This KPI is associated with the following stages in the AAARRR (Pirate Metrics) funnel:
This KPI is classified as a lagging Indicator. It reflects the results of past actions or behaviors and is used to validate performance or assess the impact of previous strategies.
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 this KPI and act as early signals that forecast future changes in this KPI.
These lagging indicators confirm, quantify, or amplify this KPI and help explain the broader business impact on this KPI after the fact.
How this KPI is structured in Cube.js, including its key measures, dimensions, and calculation logic for consistent reporting.
cube(`SupportCosts`, { sql: `SELECT * FROM support_costs`,
measures: { totalSupportCosts: { sql: `total_support_costs`, type: `sum`, title: `Total Support Costs`, description: `All expenses related to running customer support for a specific period.` } },
dimensions: { id: { sql: `id`, type: `number`, primaryKey: true }, createdAt: { sql: `created_at`, type: `time`, title: `Created At`, description: `The time when the support cost record was created.` } }})cube(`TicketsResolved`, { sql: `SELECT * FROM tickets_resolved`,
measures: { totalTicketsResolved: { sql: `total_tickets_resolved`, type: `sum`, title: `Total Tickets Resolved`, description: `The number of support tickets closed during the same period.` } },
dimensions: { id: { sql: `id`, type: `number`, primaryKey: true }, resolvedAt: { sql: `resolved_at`, type: `time`, title: `Resolved At`, description: `The time when the ticket was resolved.` } }})cube(`CostPerTicket`, { sql: `SELECT * FROM cost_per_ticket`,
measures: { costPerTicket: { sql: `${SupportCosts.totalSupportCosts} / NULLIF(${TicketsResolved.totalTicketsResolved}, 0)`, type: `number`, title: `Cost Per Ticket`, description: `Measures the average cost incurred by a business to resolve a single customer support ticket.` } },
joins: { SupportCosts: { relationship: `belongsTo`, sql: `${CUBE}.support_cost_id = ${SupportCosts.id}` }, TicketsResolved: { relationship: `belongsTo`, sql: `${CUBE}.ticket_id = ${TicketsResolved.id}` } },
dimensions: { id: { sql: `id`, type: `number`, primaryKey: true }, calculationDate: { sql: `calculation_date`, type: `time`, title: `Calculation Date`, description: `The date when the cost per ticket was calculated.` } }})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