What does a compliance posture dashboard show in Metabase?
A compliance posture dashboard shows whether you'd pass the audit today: control pass rates by framework, failing controls with owners and age, and the personnel checks auditors sample first. It's built from control test results synced from tools such as Vanta, Drata, and Okta.
What does a compliance posture dashboard look like?
Here's the layout this guide builds, at the grain of one control test per day: the overall pass score and per-framework status at the top, then personnel and vendor checks, then the controls that are failing or stale right now. Read it before a board update, and again before an audit window opens.

Which cards belong on a compliance posture dashboard?
- Control pass rate by framework — SOC 2, ISO 27001, HIPAA (bar)
- Failing controls with owner and days failing (table)
- Evidence and test freshness — controls not tested recently (table)
- Personnel compliance — security training, MFA enrollment, background checks (bar)
- Vendor review status — overdue reviews (table)
- Audit-readiness trend — pass rate over time (line)
What data does the dashboard need?
control_results— one row per control test per day, with framework, status, and owner.personnel_compliance— per-person training, MFA, and background-check status.vendors— vendor list with review dates and risk tier.
How do you build it?
- Snapshot control results from the compliance platform's API daily — the platform shows current state, the snapshots give you history.
- Keep one row per control with a mapping table to framework requirements, so one fix moves every framework's number.
- Join personnel checks to the HR roster so the denominator is current employees, not every account ever created.
- Build the per-framework pass-rate bar and failing-controls table first; add freshness, vendor, and trend cards next.
Example card SQL
WITH latest AS (
SELECT DISTINCT ON (framework, control_id)
framework,
control_id,
status
FROM control_results
ORDER BY framework, control_id, tested_at DESC
)
SELECT
framework,
COUNT(*) AS controls,
COUNT(*) FILTER (WHERE status = 'pass') AS passing,
ROUND(
100.0 * COUNT(*) FILTER (WHERE status = 'pass')
/ NULLIF(COUNT(*), 0), 1
) AS pass_rate_pct
FROM latest
GROUP BY framework
ORDER BY pass_rate_pct ASC;Related
Metrics
Integrations
Dashboards
FAQ
What is a compliance posture dashboard?
Why snapshot compliance data daily instead of reading current state?
control_results daily (one row per control test per day) and you get what the platform can't show: pass-rate trend across quarters, how long each control has been failing, and whether posture degrades between audits. The caveat: history starts the day you start snapshotting, so begin well before you need the trend.