Metric

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

Win rate is the share of deals that close won out of the deals that reach a decision. It's the headline efficiency metric for a sales team — but it's only meaningful once you fix what goes in the denominator. Measure it in Metabase from CRM data synced into a database (HubSpot, Salesforce, Pipedrive, and others).

TL;DR — Win rate = won ÷ closed (or won ÷ created — pick one and label it). Hold the cohort fixed, segment by pipeline and source, and never mix the two denominators in one chart.

How is win rate defined?

The formula is simple; the definition of the denominator is where teams disagree:

  • Won ÷ closed — of the deals that reached a decision (won or lost), how many were won. This is the most common and most stable.
  • Won ÷ created — of all deals created in a cohort, how many eventually won. Lower and slower to settle, but useful for top-of-funnel quality.

Both are valid. What breaks reporting is switching between them, or leaving it ambiguous.

Choosing and holding a cohort

A win rate is meaningless without a cohort. Decide whether you're grouping byclose date (deals that closed in the period) or creation date (deals created in the period, measured once they settle), and keep it consistent.

  • Close-date cohorts answer "how are we converting deals right now?" — good for operational tracking.
  • Creation-date cohorts answer "how good was this batch of pipeline?" — good for lead-quality analysis, but recent cohorts are incomplete.

What data does win rate need?

  • A deal/opportunity table with a clear won/lost status.
  • A closed_at (or created_at) timestamp for the cohort.
  • Segmentation columns: pipeline, source, owner, segment, and stage entered.
  • A consistent rule for excluding open deals from the denominator.

SQL patterns

Win rate by month (won ÷ closed)PostgreSQL
SELECT
  date_trunc('month', closed_at) AS month,
  COUNT(*) FILTER (WHERE is_won)                 AS won,
  COUNT(*) FILTER (WHERE is_closed)              AS closed,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE is_won)
      / NULLIF(COUNT(*) FILTER (WHERE is_closed), 0),
    1
  ) AS win_rate_pct
FROM modeled_deals
WHERE is_closed
  AND closed_at >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;
Win rate by pipeline and sourcePostgreSQL
SELECT
  pipeline,
  source,
  COUNT(*) FILTER (WHERE is_won)    AS won,
  COUNT(*) FILTER (WHERE is_closed) AS closed,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE is_won)
      / NULLIF(COUNT(*) FILTER (WHERE is_closed), 0),
    1
  ) AS win_rate_pct
FROM modeled_deals
WHERE is_closed
GROUP BY pipeline, source
ORDER BY closed DESC;

Pitfalls

Ambiguous denominator.→ Won ÷ closed and won ÷ created are different metrics — label the one you're showing.
Including open deals in the denominator.→ Open deals haven't reached a decision; they deflate win rate. Restrict to closed deals.
Comparing incomplete cohorts.→ Recent creation-date cohorts still have open deals — they'll look artificially low until they settle.
Mixing pipelines.→ A new-business pipeline and a renewals pipeline have very different win rates; segment before you compare.

Where this metric applies

Analytics

Metrics

FAQ

Should I use won ÷ closed or won ÷ created?
Won ÷ closed is the more stable operational metric. Won ÷ created is better for judging lead quality but takes longer to settle. Pick one per chart and label it clearly.
Why does my win rate keep changing for past months?
If you use creation-date cohorts, deals created in a period keep closing over time, so recent numbers rise until every deal settles. Close-date cohorts avoid this.
Is a higher win rate always better?
Not necessarily. A very high win rate can mean the team only pursues easy deals. Read win rate alongside pipeline coverage and average deal size.