Metric

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

Conversion rate measures how deals move through the funnel — either overall (created → won) or stage-to-stage (the share of deals that advance from one stage to the next). It's how you find the leaks in your pipeline. Track it in Metabase from CRM data synced into a database (HubSpot, Salesforce, Pipedrive, and others).

TL;DR — Overall conversion = won ÷ created for a cohort. Stage conversion = deals reaching stage N+1 ÷ deals reaching stage N, and it requiresstage-change history — a current snapshot undercounts deals that already passed through.

How is conversion rate defined?

  • Overall funnel conversion — of the deals created in a cohort, the share that eventually won. Closely related to win rate, but always on a created-date cohort.
  • Stage-to-stage conversion — of the deals that reached a stage, the share that reached the next one. This is where you diagnose where deals leak.

Why stage conversion needs stage history

If you count deals by their current stage, you miss every deal that already moved past it — so early stages look empty and conversion looks wrong. The correct denominator is "deals that ever reached stage N," which you can only get from stage-change history:

  • HubSpot: deal stage property history.
  • Salesforce:OpportunityFieldHistory /OpportunityHistory.
  • Pipedrive: deal flow / changes log.
  • Close: opportunity status changes.

Without history, report overall conversion only and add a caveat for stage conversion.

What data does conversion rate need?

  • A deal table with created_at and won/lost status.
  • For stage conversion: stage-change history and an ordered stage list.
  • Segmentation columns: pipeline, source, segment, owner.
  • A consistent cohort definition (usually creation date).

SQL patterns

Overall conversion by cohort monthPostgreSQL
-- Overall lead-to-won conversion by cohort month
SELECT
  date_trunc('month', created_at) AS cohort_month,
  COUNT(*)                        AS created,
  COUNT(*) FILTER (WHERE is_won)  AS won,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE is_won) / NULLIF(COUNT(*), 0),
    1
  ) AS conversion_pct
FROM modeled_deals
GROUP BY 1
ORDER BY 1;
Stage-to-stage conversion (needs stage history)PostgreSQL
-- Stage-to-stage conversion from stage-change history.
-- reached[stage] = deals that ever entered that stage.
WITH reached AS (
  SELECT DISTINCT deal_id, stage
  FROM modeled_stage_history
)
SELECT
  s.stage,
  s.order_nr,
  COUNT(DISTINCT r.deal_id) AS reached_deals,
  ROUND(
    100.0 * COUNT(DISTINCT r.deal_id)
      / NULLIF(LAG(COUNT(DISTINCT r.deal_id)) OVER (ORDER BY s.order_nr), 0),
    1
  ) AS step_conversion_pct
FROM modeled_stages s
LEFT JOIN reached r ON r.stage = s.stage
GROUP BY s.stage, s.order_nr
ORDER BY s.order_nr;

Pitfalls

Counting deals by current stage.→ Deals that advanced past a stage disappear from its count — use "ever reached stage N" from history.
Computing stage conversion without history.→ A snapshot can't tell you which deals passed through a stage; sync the stage-change log first.
Comparing incomplete cohorts.→ Recent creation-date cohorts still have open deals — their conversion will rise as deals settle.
Ignoring skipped stages.→ Reps sometimes skip stages; decide whether a skip counts as reaching the intervening stage.

Where this metric applies

Analytics

Metrics

FAQ

How is conversion rate different from win rate?
Win rate is usually won ÷ closed. Overall conversion is won ÷ created for a cohort. Stage conversion measures movement between individual stages. They answer related but distinct questions.
Can I measure stage conversion without stage history?
No. Counting deals by their current stage undercounts everything that already advanced. You need the stage-change log to know which deals ever reached each stage.
Which stage has the biggest impact?
Find the stage with the lowest step conversion and the largest volume — fixing a leak there moves the most deals. Read stage conversion alongside time-in-stage.