What goes in a lead funnel dashboard in Metabase?
A lead funnel dashboard follows prospects from lead to closed-won and shows where they drop off — lead → MQL → SQL → opportunity → won. It's how marketing and sales agree on where the funnel leaks. Build it from CRM data synced into a database — see HubSpot or Salesforce for the connection.
For: Marketing ops, RevOps, sales leaders. Refresh: daily. Source: modeled leads/contacts and deals with stage timestamps and source.
What does a lead funnel dashboard look like?
Here’s the layout this guide builds, at the grain of a 90-day cohort of leads: the headline conversion numbers first, then the funnel and the stage-by-stage drop-off, then the source, velocity, and stall cards that say which part of the funnel to work on.

An example lead funnel dashboard in Metabase, built from HubSpot or Salesforce data. Figures are illustrative.
Which cards belong on a lead funnel dashboard?
Headline KPIs
- Overall lead-to-won conversion rate
- Leads created (this period)
- MQL → SQL conversion
- Median sales cycle length
Funnel & sources
- Funnel: lead → MQL → SQL → opportunity → won
- Stage-to-stage conversion and drop-off
- Funnel by lead source / campaign
- Time-in-stage (where deals stall)
What data does a lead funnel dashboard need?
- Leads/contacts with a source and creation date.
- Stage-entry timestamps (or a stage-change history) so you can measure conversion and time-in-stage.
- The deals table to close the funnel at opportunity and won.
How do you build a lead funnel dashboard?
- Sync your CRM into a database (HubSpot or Salesforce).
- Define each funnel stage once and derive stage-entry from history.
- Count each stage and compute step-to-step and overall conversion.
- Add filters for source, segment, and date range.
Example card SQL
-- Lead funnel counts and stage-to-stage conversion, last 90 days.
WITH stages AS (
SELECT
COUNT(*) FILTER (WHERE reached_lead) AS leads,
COUNT(*) FILTER (WHERE reached_mql) AS mqls,
COUNT(*) FILTER (WHERE reached_sql) AS sqls,
COUNT(*) FILTER (WHERE reached_opp) AS opportunities,
COUNT(*) FILTER (WHERE reached_won) AS won
FROM lead_funnel
WHERE created_at >= CURRENT_DATE - INTERVAL '90 days'
)
SELECT
leads, mqls, sqls, opportunities, won,
ROUND(100.0 * mqls / NULLIF(leads, 0), 1) AS lead_to_mql_pct,
ROUND(100.0 * won / NULLIF(leads, 0), 1) AS lead_to_won_pct
FROM stages;