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).
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_atand 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 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 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
Where this metric applies
- HubSpot + Metabase — deal stage property history
- Salesforce + Metabase —
OpportunityFieldHistory - Pipedrive + Metabase — deal flow log
- Close + Metabase — opportunity status changes