Metric · Support

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

CSAT (customer satisfaction) is the share of rated interactions that customers scored positively. It's the quality counterweight to speed metrics like first-response time and resolution time — fast support that leaves people unhappy still fails. Measure it in Metabase from help desk data synced into a database (Zendesk, Intercom, Front, or Freshdesk).

TL;DR — CSAT = positive ratings ÷ total ratings. Always show the response rate next to it: a 95% CSAT from 3% of customers tells you almost nothing, and low response rates skew toward the extremes.

How is CSAT calculated?

Pick what counts as "positive" for your scale (for a 5-point scale, usually 4 and 5), then:

  • CSAT = positive ratings ÷ total ratings received, as a percentage.
  • Response rate = ratings received ÷ ratable (usually solved) tickets. Report it alongside CSAT, always.

Segment CSAT by channel, tag/topic, and team to find where dissatisfaction concentrates — an org-wide average hides the areas worth fixing.

What data does CSAT need?

  • A ratings/survey table with a score and a link to the ticket or conversation.
  • The ticket table, to compute the response rate against solved tickets.
  • A consistent mapping of raw scores to positive/negative, especially if you run multiple survey types.

SQL patterns

CSAT by monthPostgreSQL

Positive ratings over all ratings, monthly.

-- CSAT and response rate by month.
-- A rating is "positive" when it's good/great (e.g. 4-5 on a 5-point scale).
SELECT
  date_trunc('month', r.created_at)                       AS month,
  COUNT(*)                                                AS ratings,
  COUNT(*) FILTER (WHERE r.score >= 4)                    AS positive,
  ROUND(100.0 * COUNT(*) FILTER (WHERE r.score >= 4)
        / NULLIF(COUNT(*), 0), 1)                         AS csat_pct
FROM ticket_ratings r
GROUP BY date_trunc('month', r.created_at)
ORDER BY month;
CSAT response rate by monthPostgreSQL

Rated tickets over solved tickets — the context CSAT needs.

-- CSAT response rate: rated tickets ÷ ratable (solved) tickets.
SELECT
  date_trunc('month', t.resolved_at)                      AS month,
  COUNT(*)                                                AS solved,
  COUNT(r.ticket_id)                                      AS rated,
  ROUND(100.0 * COUNT(r.ticket_id)
        / NULLIF(COUNT(*), 0), 1)                         AS response_rate_pct
FROM tickets t
LEFT JOIN ticket_ratings r ON r.ticket_id = t.id
WHERE t.resolved_at IS NOT NULL
GROUP BY date_trunc('month', t.resolved_at)
ORDER BY month;

Pitfalls

Reporting CSAT without the response rate.→ A high score from a tiny sample is noise. Show how many customers actually rated.
Changing the positive threshold silently.→ If 3-of-5 counts as positive one quarter and not the next, the trend breaks. Fix the definition.
Averaging raw scores across different survey scales.→ Normalize scales first, or a 5-point and a thumbs-up/down survey can't be combined.
Ignoring who doesn't respond.→ Silent customers skew results; watch response rate by segment, not just overall.

Where this metric applies

Analytics

Metrics

FAQ

What's the difference between CSAT and NPS?
CSAT measures satisfaction with a specific interaction (usually right after a ticket is solved), while NPS measures overall willingness to recommend the company. CSAT is a support-quality signal; NPS is a relationship signal. Support teams usually track CSAT and let the broader org own NPS.
Why does response rate matter so much?
Because low response rates bias the sample toward the delighted and the furious — the people in the middle rarely fill out surveys. A CSAT trend is only trustworthy if the response rate is stable and high enough; report the two together.
What counts as a positive rating?
That's a definition you set and hold constant. On a 5-point scale, 4-5 is the common cut; on a thumbs up/down survey, up is positive. The important thing is that the threshold never moves, so the trend stays comparable.