What goes in a hiring plan dashboard in Metabase?
A hiring plan dashboard compares hiring demand with recruiting progress: open roles, accepted offers, starts, requisition aging, and plan vs. actual headcount. It sits between recruiting, finance, and department leadership.
What does a hiring plan dashboard look like?
Here's the layout this guide builds: plan attainment and time to fill at the top, then open demand by department, priority, recruiter, and hiring manager, then what has actually been filled and which roles are slipping. Read it in the weekly recruiting review, and again when finance re-forecasts headcount.

Which cards belong on this dashboard?
- Open requisitions by department and priority
- Plan vs. accepted offers and starts by month
- Median time to fill
- Roles at risk by days open or target start date
- Openings by recruiter and hiring manager
- Filled roles by department, location, and role family
What data does this dashboard need?
- Requisitions or jobs with opened_at, target_start_date, status, department, location, openings, recruiter, and hiring manager.
- Offers and accepted starts tied back to requisitions.
- Headcount plan or approved positions by month, department, and role family.
- Worker starts from HRIS when start-date accuracy matters.
How do you build it?
- Sync ATS or HRIS data into a database, then connect that database to Metabase.
- Create reusable models for jobs or requisitions, applications, stage history, interviews, offers, sources, workers, and organizations as needed.
- Create one saved question per card, using consistent metric definitions and permissioned models.
- Add dashboard filters for department, location, role family, recruiter, hiring manager, source, and date range.
Example card SQL
SELECT
department,
hiring_manager,
COUNT(*) AS open_requisitions,
COUNT(*) FILTER (WHERE CURRENT_DATE - opened_at::date > 60) AS over_60_days_open,
percentile_cont(0.5) WITHIN GROUP (
ORDER BY CURRENT_DATE - opened_at::date
) AS median_days_open
FROM modeled_requisitions
WHERE status = 'open'
GROUP BY department, hiring_manager
ORDER BY over_60_days_open DESC, open_requisitions DESC;