Dashboard

What goes in a sales pipeline dashboard in Metabase?

A sales pipeline dashboard shows the current health of the book: how much open pipeline exists at each stage, whether coverage is sufficient for quota, where deals convert and where they stall, and whether creation is keeping pace with what closes. It's the current-state counterpart to a sales forecast dashboard — health here, projection there.

For: sales leaders, RevOps, and frontline managers. Grain: one row per opportunity per daily snapshot. Source: CRM opportunities synced to the warehouse, with field history or daily snapshots.

What does a sales pipeline dashboard look like?

Here’s the layout this guide builds. The headline numbers — open and weighted pipeline, coverage, stuck deals — sit at the top for the weekly pipeline council read. Stage health comes next: value by stage, conversion between stages, dwell time, and the coverage gauge. Movement sits at the bottom — created versus closed, slippage, and the dollar-weighted stuck list that usually sets the meeting agenda.

Sales pipeline dashboard in Metabase showing pipeline by stage, coverage versus quota, stage conversion, slippage, and stuck deals.
An example sales pipeline dashboard in Metabase, built from CRM opportunity snapshots. Figures are illustrative.

Which cards belong on a sales pipeline dashboard?

The eight below cover the three failure modes of a pipeline: not enough of it, stuck in the wrong places, and leaking out the back through slippage.

  • Pipeline headlines — open and weighted pipeline, open deals, average deal size, stuck deals (numbers)
  • Open pipeline by stage, dollar value (bar)
  • Stage-to-stage conversion — created through closed won (funnel)
  • Average days in stage, against each stage’s median (row)
  • Pipeline coverage versus target — open pipeline over remaining quota (gauge)
  • Pipeline created versus closed won per month (combo)
  • Slippage rate — committed deals that pushed their close date, monthly (line)
  • Stuck deals — no activity in 30+ days, dollar-weighted (table)

What data does the dashboard need?

  • An opportunities table from the CRM with stage, amount, close_date, created_at, owner, and opportunity type.
  • Stage history — stage_entered_at per stage, from field history or a stage-transition table — for dwell time and conversion.
  • A daily snapshot table of open opportunities, which is what makes slippage, aging trends, and created-versus-closed honest.
  • An activities table (calls, emails, meetings) with last_activity_at per opportunity, to power the stuck-deal clock.
  • Quota per team or rep per period, for the coverage gauge’s denominator.

How do you build it?

  1. Sync CRM opportunities, stage history, and activities to the warehouse — the Salesforce, HubSpot, and Pipedrive guides cover connector options.
  2. Add a nightly snapshot job that appends every open opportunity’s stage, amount, and close date with a snapshot date — slippage and aging are computed from these, not from current state.
  3. Build one Metabase model defining the pipeline universe — which opportunity types, segments, and close-date window count — so every card shares it.
  4. Create the stuck-deal question: open deals with no activity in 30+ days or dwell time over twice the stage median, sorted by amount.
  5. Add filters for close period, team, segment, and owner, and subscribe the dashboard to the pipeline-council channel the morning of the meeting.

Example card SQL

Open pipeline, dwell time, and stuck value by stage PostgreSQL
WITH open_pipeline AS (
SELECT
  o.opportunity_id,
  o.stage,
  o.amount,
  o.close_date,
  o.owner_name,
  NOW()::date - o.stage_entered_at::date   AS days_in_stage,
  NOW()::date - o.last_activity_at::date   AS days_since_activity
FROM opportunities o
WHERE o.status = 'open'
  AND o.close_date <  DATE_TRUNC('quarter', NOW()) + INTERVAL '3 months'
)
SELECT
stage,
COUNT(*)                                   AS deals,
SUM(amount)                                AS pipeline_value,
ROUND(AVG(days_in_stage), 1)               AS avg_days_in_stage,
COUNT(*) FILTER (WHERE days_since_activity > 30)
                                           AS stuck_deals,
SUM(amount) FILTER (WHERE days_since_activity > 30)
                                           AS stuck_value
FROM open_pipeline
GROUP BY stage
ORDER BY MIN(CASE stage
WHEN 'Discovery'     THEN 1
WHEN 'Qualification' THEN 2
WHEN 'Proposal'      THEN 3
WHEN 'Negotiation'   THEN 4
WHEN 'Contract'      THEN 5
END);

Metrics

Integrations

Dashboards

FAQ

How is this different from a sales forecast dashboard?
Tense. This dashboard is current-state health — how much pipeline exists, where it sits, where it's stuck, and whether enough is being created to sustain future quarters. A sales forecast dashboard is the forward-looking projection built on top of that: commit categories, weighted expected value, and how the number is likely to land. Pipeline health is the input, the forecast is the output — teams usually review this one weekly in pipeline council and the forecast one with leadership. Keep them separate so the health review doesn't collapse into arguing about the number.
What pipeline coverage ratio should we target?
The folk rule is 3–4x open pipeline to remaining quota, but the honest target is your own win rate's inverse with a buffer: a team winning 25% of qualified pipeline needs roughly 4x, one winning 40% can run leaner. Compute pipeline coverage against remaining quota, not the full quarter's number, and cut it by segment — 3x blended can hide 5x in SMB and 1.5x in enterprise, which is a very different problem. A coverage gauge without a win-rate card next to it invites false comfort.
How do I find stuck deals without relying on reps to flag them?
Use two clocks: days in current stage versus that stage's historical average, and days since last logged activity. A deal can look active on stage age while nobody has touched it in six weeks — the activity clock catches that, provided email and meeting sync is on so "activity" doesn't just mean manual notes. Flag anything past 30 days without activity or 2x the stage's median dwell time, and put the dollar-weighted list on the dashboard: 38 stuck deals is a number, $1.4M of stalled pipeline with owners named is an agenda item.
Should the dashboard show weighted or unweighted pipeline?
Both, labeled clearly, used for different questions. Unweighted total answers "is there enough raw material?" and drives the coverage ratio, because stage probabilities are least trustworthy in the early stages where most of the value sits. Weighted pipeline answers "what is this book plausibly worth?" and only deserves trust once you've validated stage probabilities against actual win rates by stage — CRM defaults like 10/25/50/75 are guesses someone typed in during setup. If weighted pipeline consistently overshoots what closes, fix the probabilities before trusting any number built on them.
How do I measure slippage?
Slippage is a deal whose close date moved out of the period after being committed to it — and you cannot compute it from the current CRM state, because the old close date is gone. You need history: either your CRM's field-history table (Salesforce's OpportunityFieldHistory) or a daily snapshot of open opportunities in the warehouse. Then slippage rate is deals (or value) that pushed divided by what was committed at period start. Snapshots are the more robust route and also power the created-versus-closed and stage-aging cards, so build them once.
Why doesn't the dashboard match the CRM's own pipeline report?
Almost always a definition mismatch, not a data bug. The usual suspects: the CRM report includes renewal or expansion opportunities while your query filters to new business; one side counts deals closing this quarter while the other counts all open deals; currency conversion happens at different rates; or the warehouse sync lags a day. Write the dashboard's definition into a description card on the dashboard itself — which opportunity types, which close-date window, which snapshot date — and reconcile once. See the Salesforce or HubSpot guide for sync options.
How often should pipeline data refresh?
Daily is the right cadence for the dashboard, because the decisions it drives — reassigning stuck deals, sourcing more pipeline, pulling deals forward — are daily-to-weekly decisions, and an hourly sync mostly adds cost and churn-noise. The exception is the snapshot job behind slippage and aging: that must run reliably every day at the same time, since a missed snapshot leaves a hole in every trend built on it. If reps update the CRM right before pipeline council, schedule the sync an hour ahead of the meeting so the review reflects their updates.