Metric · Support

What is first contact resolution rate, and how do you measure it in Metabase?

First contact resolution rate (FCR) is the share of resolved tickets that were solved in a single interaction — one agent touch, no transfers, no reopens — divided by all resolved tickets. It measures how often customers get an answer without a back-and-forth. Track it in Metabase from help desk data synced into a database (Zendesk, Intercom, Freshdesk, or Front).

TL;DRone-touch resolved ÷ resolved per month. Decide upfront whether "first contact" means strictly one touch or merely no reopen within N days, and never read FCR alone: paired with CSAT it measures quality; alone, it rewards closing tickets prematurely.

What does a first contact resolution rate chart look like in Metabase?

Plot strict FCR per resolution month as a line and read the slope: the climb from around 63% to 72% is macros, docs, and routing getting sharper. A one-month drop like February's usually follows a big release — novel tickets take several touches until the fixes are documented — so check what shipped before reading it as a team problem.

First contact resolution rate in Metabase: a line chart of strict FCR per month.
First contact resolution rate as a Metabase card, built from synced help desk data. Figures are illustrative.

What first contact resolution rate measures

It measures effort — the customer's, not yours. Every extra touch on a ticket is another wait, another context reload, another chance to churn. A high FCR means answers land complete the first time; a low one means customers are relaying between agents or re-explaining their problem after a transfer.

The definition has two common variants, and they are not interchangeable. Strict (one-touch) FCR counts a ticket only if a single agent resolved it in one reply, with no transfers and no reopen at any point. Lenient (no-reopen) FCR counts any ticket that stayed closed for N days — usually 7 or 14 — after resolution, however many replies it took. Strict FCR is the sharper operational lever; the no-reopen variant tracks closer to what customers would call "solved the first time." Either works, but the model must pick one and every chart must say which.

FCR is also the most gameable support metric. Closing tickets early inflates it instantly, so it belongs on the same dashboard as CSAT and resolution time — if FCR rises while those two sour, the gain is an artifact.

What data does it need?

  • A modeled tickets table with resolved_at and a way to detect reopens — a reopened_at timestamp or a status-change event log.
  • Per-ticket touch counts: agent_touch_count (public agent replies) and transfer_count (group or assignee changes), usually derived from a messages or audit-events table.
  • channel and topic (or ticket category) for segmentation — FCR is only actionable once you can see which segments drag it down.
  • Optionally, requester identity, so a fresh ticket from the same customer on the same topic within a few days can be treated as a reopen.

SQL patterns

Strict FCR by month PostgreSQL

One agent touch, no transfers, never reopened — as a share of tickets resolved that month.

-- Strict FCR by month: one agent touch, no transfers, never reopened.
-- Assumes a modeled tickets table; count by resolution month.
SELECT
  date_trunc('month', t.resolved_at) AS month,
  COUNT(*) AS resolved_tickets,
  ROUND(
    100.0 * COUNT(*) FILTER (
      WHERE t.agent_touch_count = 1
        AND t.transfer_count = 0
        AND t.reopened_at IS NULL
    ) / NULLIF(COUNT(*), 0), 1
  ) AS fcr_pct
FROM tickets t
WHERE t.resolved_at IS NOT NULL
GROUP BY 1
ORDER BY 1;
FCR by channel and topic PostgreSQL

Last-quarter breakdown, worst segments first, with small segments filtered out.

-- FCR by channel and topic over the last quarter, worst first.
-- The HAVING clause hides segments too small to trust.
SELECT
  t.channel,
  t.topic,
  COUNT(*) AS resolved_tickets,
  ROUND(
    100.0 * COUNT(*) FILTER (
      WHERE t.agent_touch_count = 1
        AND t.transfer_count = 0
        AND t.reopened_at IS NULL
    ) / NULLIF(COUNT(*), 0), 1
  ) AS fcr_pct
FROM tickets t
WHERE t.resolved_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1, 2
HAVING COUNT(*) >= 25
ORDER BY fcr_pct;

Pitfalls

Reading FCR without CSAT and resolution time. → FCR alone rewards closing tickets prematurely. Pin it next to CSAT and resolution time; an FCR gain those metrics don't corroborate is probably gaming.
Mixing strict and lenient definitions. → One-touch FCR and no-reopen-within-14-days FCR can differ by double digits on the same tickets. Encode one definition in the model and label it on every card.
Ignoring follow-up tickets as hidden reopens. → Customers often open a new ticket instead of reopening the old one. Match new tickets from the same requester on the same topic within a few days, or your denominator quietly flatters you.
Comparing FCR across teams with different ticket mix. → A password-reset queue will always out-FCR an API-debugging queue. Compare within a segment over time, not across teams — and set targets per topic, not globally.

Where this metric applies

Metrics

Dashboards and analytics

FAQ

What counts as 'first contact' resolved?
There are two common definitions. Strict FCR requires exactly one agent touch, no transfers, and no reopen — ever. Lenient FCR only requires that the ticket wasn't reopened within a window, typically 7 or 14 days, regardless of how many replies the first agent sent. Strict is the better operational target; lenient is closer to the customer's experience of "solved the first time I asked." Pick one, write it into the model, and label every chart — the two versions can differ by 15 points or more on the same ticket volume.
What's a good first contact resolution rate?
Published benchmarks cluster around 70% to 75%, but the number is dominated by ticket mix: a team fielding password resets will beat a team debugging API integrations without being any better. Compare against your own trend and segment by channel and topic instead of chasing a universal target. A rising FCR alongside flat or improving CSAT is real progress; a rising FCR with falling CSAT usually means tickets are being closed, not solved.
Can agents game FCR?
Easily — that's the metric's main weakness. Closing a ticket after one reply and letting the customer open a fresh one produces a perfect FCR and a furious customer. Guard against it three ways: count a new ticket from the same requester on the same topic within a few days as a reopen, pair FCR with CSAT on the same dashboard, and watch resolution time for suspicious drops. Any FCR jump that isn't matched in those metrics deserves an audit before a celebration.
How is FCR different from resolution time?
Resolution time measures how long a fix takes; FCR measures how many round trips it takes. They can move independently — a team can resolve tickets fast but in three touches each, or slowly but in one. Together with first-response time they describe the full shape of the support experience: how fast you answer, how many exchanges it takes, and how long until it's done.
How do you track FCR in Metabase?
Sync help desk data into a SQL database with a tool like Airbyte or Fivetran — Zendesk, Intercom, and Freshdesk all expose the tickets, conversations, and audit events you need. Model a tickets table with agent_touch_count, transfer_count, and reopened_at, then chart the monthly rate and a by-channel breakdown, and pin both next to CSAT on a support overview dashboard.