Metric · Support

What is ticket volume, and how do you measure it in Metabase?

Ticket volume is how many support requests you receive and resolve over a period — the load signal every other support metric sits on top of. Read created against solved to see whether you're keeping up, and watch the open backlog for work that's piling up. Measure it in Metabase from help desk data synced into a database (Zendesk, Intercom, or Freshdesk).

TL;DR — Track created vs. solved per period, not just created. When created outruns solved for several weeks, the backlog grows and wait times follow. Segment by channel and tag to see where the load comes from.

How is ticket volume calculated?

  • Created — count of tickets opened in the period, by created_at.
  • Solved — count of tickets resolved in the period, by resolved_at.
  • Backlog — open tickets right now (no resolved_at), ideally bucketed by age.

Net flow (created − solved) is the number that predicts trouble: a persistently positive net flow means the queue is growing faster than you clear it.

What data does ticket volume need?

  • A tickets table with created_at and resolved_at.
  • Channel, tag/topic, and team fields for segmentation.
  • Optionally a status field, so backlog excludes tickets parked as pending on the customer if you want.

SQL patterns

Created vs. solved by weekPostgreSQL

The core load balance — are you clearing tickets as fast as they arrive?

-- Tickets created vs. solved by week — the basic load signal.
SELECT
  weeks.week,
  COUNT(c.id) AS created,
  COUNT(s.id) AS solved
FROM (
  SELECT generate_series(
    date_trunc('week', CURRENT_DATE - INTERVAL '12 weeks'),
    date_trunc('week', CURRENT_DATE),
    INTERVAL '1 week'
  ) AS week
) weeks
LEFT JOIN tickets c ON date_trunc('week', c.created_at)  = weeks.week
LEFT JOIN tickets s ON date_trunc('week', s.resolved_at) = weeks.week
GROUP BY weeks.week
ORDER BY weeks.week;
Open backlog by agePostgreSQL

Unresolved tickets bucketed by how long they've been waiting.

-- Current open backlog, bucketed by age.
SELECT
  CASE
    WHEN CURRENT_DATE - t.created_at::date <= 1  THEN '0-1 days'
    WHEN CURRENT_DATE - t.created_at::date <= 3  THEN '2-3 days'
    WHEN CURRENT_DATE - t.created_at::date <= 7  THEN '4-7 days'
    ELSE '8+ days'
  END                              AS age_bucket,
  COUNT(*)                         AS open_tickets
FROM tickets t
WHERE t.resolved_at IS NULL
GROUP BY 1
ORDER BY MIN(CURRENT_DATE - t.created_at::date);

Pitfalls

Reporting created without solved.→ Volume alone can't tell you if you're keeping up. Always show both, and the net.
Ignoring the backlog age.→ A flat backlog count can hide a growing pile of very old tickets. Bucket by age.
Counting merged or spam tickets.→ Filter out merged, spam, and bot-created tickets, or volume looks worse than the real load.
Comparing raw volume across teams of different sizes.→ Normalize by agent count or account base before comparing.

Where this metric applies

Analytics

Metrics

FAQ

What's the difference between ticket volume and backlog?
Ticket volume is a flow — how many arrive and get solved per period. Backlog is a stock — how many are open right now. Volume tells you the workload; backlog tells you whether that workload is accumulating.
Should I count reopened tickets as new volume?
No — a reopen is continued work on an existing ticket, not a new arrival. Track reopens separately so they don't inflate created counts, and let them extend resolution time instead.
How do I forecast staffing from ticket volume?
Combine the created trend with handle time and target response SLAs. A stable created-per-week series, seasonality, and average handle time give you a rough required-agent-hours figure; watch net flow (created minus solved) as the early warning that staffing is off.