Metric

What is average deal size, and how do you measure it in Metabase?

Average deal size is the typical value of a won deal — often called average contract value (ACV). It anchors forecasting, quota-setting, and pipeline math, but deal values are right-skewed, so the plain average alone is misleading. Track it in Metabase from CRM data synced into a database (HubSpot, Salesforce, Pipedrive, and others).

TL;DR — Average deal size = won value ÷ won deals. Always report the median next to the mean — a few large deals pull the average up. Normalize to one currency and one contract term (ACV vs. TCV) before you compare.

How is average deal size defined?

Total won value divided by the number of won deals, over a cohort. Decide:

  • ACV vs. TCV — annualized contract value or total contract value? Multi-year deals differ hugely between the two.
  • New vs. total — new business only, or new plus expansion?
  • Currency — all values converted to one reporting currency.

Why the median matters more than the mean

Deal values are heavily right-skewed: most deals cluster low, a few whales sit far out. The mean chases those whales, so a single large deal can make "average" deal size jump even though the typical deal didn't change. Report the median (p50) as the "typical" deal and p90 to show the high end. Keep the mean for pipeline math, but never present it alone.

What data does average deal size need?

  • A won-deal table with a value (amount) column.
  • A single reporting currency (convert before aggregating).
  • A consistent contract-value definition (ACV vs. TCV).
  • Segmentation columns: segment, pipeline, source, product.

SQL patterns

Average, median & p90 deal size by quarterPostgreSQL
SELECT
  date_trunc('quarter', closed_at) AS quarter,
  COUNT(*)                                          AS won_deals,
  ROUND(AVG(value), 2)                              AS avg_deal_size,
  ROUND(
    percentile_cont(0.5) WITHIN GROUP (ORDER BY value), 2
  )                                                 AS median_deal_size,
  ROUND(
    percentile_cont(0.9) WITHIN GROUP (ORDER BY value), 2
  )                                                 AS p90_deal_size
FROM modeled_deals
WHERE is_won
GROUP BY 1
ORDER BY 1;
Deal size by segment and pipelinePostgreSQL
SELECT
  segment,
  pipeline,
  COUNT(*)             AS won_deals,
  ROUND(AVG(value), 2) AS avg_deal_size,
  ROUND(
    percentile_cont(0.5) WITHIN GROUP (ORDER BY value), 2
  )                    AS median_deal_size
FROM modeled_deals
WHERE is_won
GROUP BY segment, pipeline
ORDER BY won_deals DESC;

Pitfalls

Reporting the mean alone.→ Deal values are right-skewed; a few large deals inflate the average. Always show the median.
Mixing currencies.→ Convert all deal values to one reporting currency before averaging.
Mixing ACV and TCV.→ A 3-year deal looks 3× bigger as TCV. Pick one basis and apply it consistently.
Averaging open deals.→ Open-deal amounts are estimates; base deal size on won deals unless you're explicitly sizing pipeline.

Where this metric applies

Analytics

Metrics

FAQ

Mean or median deal size?
Report both, but lead with the median. Deal values are right-skewed, so the mean overstates the typical deal. Use the mean for pipeline math and the median to describe a normal deal.
Should I use ACV or TCV?
Depends on how you sell. ACV (annualized) is standard for subscription businesses; TCV (total contract value) inflates multi-year deals. Pick one and apply it consistently across reports.
How do I handle multiple currencies?
Convert every deal to a single reporting currency before you average or total. Mixing raw amounts across currencies produces meaningless numbers.