Metric

What is pipeline coverage, and how do you measure it in Metabase?

Pipeline coverage is open pipeline divided by the quota or target it has to cover in a period. It's the forward-looking health check for a sales team: it tells you whether there's enough in the funnel to hit the number, given a realistic win rate. Track it in Metabase from CRM data synced into a database (HubSpot, Salesforce, Pipedrive, and others).

TL;DR — Coverage = open pipeline ÷ quota for the period. A common rule of thumb is 3×–4×, but the right target is1 ÷ win rate. You need a quota/target source alongside your CRM pipeline.

How is pipeline coverage defined?

Coverage is a ratio, not a currency amount:

  • Raw coverage = open pipeline value ÷ quota. Simple, but treats an early-stage deal the same as a late-stage one.
  • Weighted coverage = Σ(deal value × stage probability) ÷ quota. More realistic because it discounts early-stage deals.

Scope the pipeline to the deals that can actually close in the period you're covering.

What coverage target should you aim for?

The "3× pipeline" rule is a heuristic, not a law. The principled target is the inverse of your win rate:

  • A 33% win rate implies you need roughly coverage.
  • A 25% win rate implies roughly .
  • A 50% win rate implies roughly .

Derive your target from your own win rate rather than borrowing someone else's multiplier.

What data does pipeline coverage need?

  • Open deals with a value and an expected close period.
  • A quota or target table by period (and team/owner).
  • Stage probabilities if you want weighted coverage.
  • A consistent rule for which open deals count toward the period.

SQL patterns

Raw coverage by periodPostgreSQL
SELECT
  p.period,
  p.quota,
  ROUND(SUM(d.value), 2)                          AS open_pipeline,
  ROUND(SUM(d.value) / NULLIF(p.quota, 0), 2)     AS coverage_ratio
FROM sales_targets p
LEFT JOIN modeled_deals d
  ON d.period = p.period
 AND NOT d.is_closed
GROUP BY p.period, p.quota
ORDER BY p.period;
Weighted coverage (value × stage probability)PostgreSQL
-- Coverage on weighted pipeline (value x stage probability)
SELECT
  p.period,
  p.quota,
  ROUND(SUM(d.value * s.probability), 2)                       AS weighted_pipeline,
  ROUND(SUM(d.value * s.probability) / NULLIF(p.quota, 0), 2)  AS weighted_coverage
FROM sales_targets p
LEFT JOIN modeled_deals d
  ON d.period = p.period AND NOT d.is_closed
LEFT JOIN modeled_stages s ON s.id = d.stage_id
GROUP BY p.period, p.quota
ORDER BY p.period;

Pitfalls

Borrowing a generic 3× target.→ The right multiplier is 1 ÷ your win rate — derive it from your own data.
Counting deals that can't close in the period.→ Scope open pipeline to the deals with an expected close date in the target period.
Treating all stages equally.→ An early-stage deal is worth far less than a late-stage one; use weighted coverage.
No quota source.→ Coverage is a ratio — without a target table you only have raw pipeline value, not coverage.

Where this metric applies

Analytics

Metrics

FAQ

Is 3× pipeline coverage the right target?
It's a rough heuristic. The principled target is 1 ÷ win rate: a 33% win rate needs ~3×, a 25% win rate needs ~4×. Derive it from your own win rate.
Raw or weighted coverage?
Weighted coverage (deal value × stage probability) is more realistic because it discounts early-stage deals. Show raw coverage too so people can see the gross funnel.
Which open deals count toward coverage?
Only deals that can realistically close in the target period — scope by expected close date. Including far-future deals inflates coverage.