QI Hub › Dashboard
Live data
Active files
199
+5 in Aug · 24 opened, 19 closed
Files opened — Aug
24
27 in Jul · month-to-date through Aug 14
Files closed — Aug
19
Matches Jul pace · median 148 days open at close
Deadlines ≤ 7 days
9
4 at 45-day · 5 at 180-day
Book growth
Files opened vs closed per month · Jan – Aug 2026 · all coordinators
Opened Closed
0 10 20 30 Jan Feb Mar Apr May Jun Jul Aug
Book grew 148 → 199 active files since January (+51) · Aug is month-to-date
Deadline-risk exposure
Files by days to nearest statutory deadline · all coordinators
≤ 3 days
3 · 2 ID / 1 close
4 – 7 days
6 · 2 ID / 4 close
8 – 14 days
11 · 5 ID / 6 close
15 – 30 days
27 · 12 ID / 15 close
47 files reach a statutory deadline within 30 days — 24% of the book · ID = 45-day, close = 180-day
Coordinator workload
Load ceiling · 120 files
Active files per coordinator · today
TB
Tom Bottenberg
5 deadlines ≤ 7d
110
SO
Sandra Osman
4 deadlines ≤ 7d
82
7 intake files not yet assigned to a coordinator Open intake queue →
Gap of 28 files between the two books · ceiling is an org policy setting, not a hard limit
Intake pipeline — Aug
New exchange requests · month-to-date through Aug 14
Received
31
In review
5
Accepted
24
Declined
2
Received via CRM API · 19 Direct entry · 8 Referral link · 4
Median 1.2 business days from received to accepted this month
Upcoming deadline concentrations
Statutory deadlines per week · next 8 weeks · all coordinators
Aug 17 Aug 24 Aug 31 Sep 7 Sep 14 Sep 21 Sep 28 Oct 5 45-day ID 4 6 3 5 2 3 1 2 180-day close 5 3 7 4 6 2 3 4
Heaviest week: Aug 31 — 10 deadlines (3 at 45-day, 7 at 180-day) 0 1–2 3–4 5–6 7+
Governance
Controls activity · verified in the last hour
Dual-approved disbursements — Aug 12 of 12
Awaiting second approver 2
Audit events forwarded — 30d 1,482
Report exports — 30d 9 · all logged
Every disbursement requires a second approver before release
E-sign cycle time
Median days from signature request to completed envelope · weekly · last 8 weeks
0d 2d 4d Jun 22 Jul 6 Jul 20 Aug 3
Current median 2.4 days — down 0.7 days from late June
Funds-pipeline throughput
Count of qualified-escrow movements per week · last 8 weeks
Incoming wires confirmed Disbursements released
0 5 10 Jun 22 Jul 6 Jul 20 Aug 3
Counts of movements, not amounts · every release dual-approved and audit-logged
State · Edit mode with widget gallery drawer
Editing your dashboard Drag to move · resize from the corner · saves to your profile only
Active files
199
+5 in Aug · 24 opened, 19 closed
Deadline-risk exposure
≤ 3 days
3
4 – 7 days
6
8 – 30 days
38
Coordinator workload
TBTom Bottenberg
110
SOSandra Osman
82
Drop a widget here or pick one from the gallery →
State · Widget editor dialog — Metric tab (left) and Pin-a-saved-report tab (right)
Edit widget
Metric Pin a saved report view
Widget title
Metric
Files by days to statutory deadline
Filters
Date range · Next 30 days
Coordinator · All coordinators
All types Delayed Reverse Improvement
Chart type
Preview uses your live data
47 matching files · updates as you change filters
≤ 3 days
3
4 – 7 days
6
8 – 14 days
11
15 – 30 days
27
changes apply to your layout only
Edit widget
Metric Pin a saved report view
Saved report views from Reports › Custom Views
Deadlines this month
7 columns · 3 filters · yours · updated Aug 12
Open files by coordinator
5 columns · grouped · yours · updated Aug 8
Funds held > $1M
6 columns · 1 filter · shared by T. Bottenberg · updated Jul 30
A pinned view renders as a live table using the report's own columns and filters. Edit the definition in Reports › Custom Views — the widget follows it automatically.
pinned views respect the report's read scope
State · Empty dashboard (first visit, or after removing all widgets)
Your dashboard is empty
Start from the default QI Hub layout — book growth, deadline risk, coordinator workload, and governance — or build your own from the widget gallery.
Widgets only ever show data your role can already read
State · Loading skeleton (widgets shimmer in place — no spinners)
Chrome and accents match surfaces/qi-hub-tier.html: the violet --tier ramp marks the tier above the indigo QI-office console. Charts hold one violet primary series with a slate comparison series; red and amber appear only where a statutory deadline earns them. All axes start at zero with labeled gridlines.
Naming: the tier's product name was decided as QI Admin on 2026-08-28 and renamed QI Hub on 2026-09-05 (issue 3026). Every occurrence renders through a single .tier-name token (sidebar badge, breadcrumb, page badge, empty-state copy) — a future rename drops in there and nowhere else.
Honesty constraints: no fee or revenue widgets exist here — fee financials are not part of the product, so the executive story is volume, throughput, deadline risk, workload balance, and governance. Intake source copy is "Received via CRM API" (a factual channel label, not a sync claim). Funds throughput shows movement counts, not amounts, and states the dual-approval rule.
Layout model: each QI Hub user owns one layout, persisted server-side to their profile (never localStorage). "Reset to default" restores the org default; "Share with QI Hub team" offers this layout as a named starting point for other QI Hub users — it never overwrites anyone's saved layout. Widgets and pinned report views inherit the viewer's read scope; adding a widget can never widen access, and dashboard reads are audit-logged like every other access on this tier.
Build contract — QI Hub dashboard builder
1 · The rail is chrome, not a surface. It is painted from --console-rail-* and stays dark in both themes; its tier accent comes from --console-rail-tier-*. Nothing on the rail may reach for --tier, --tier-ink or the --ink ramp — those flip with the theme and the rail does not, so --tier-ink would land at 1.4:1 on the rail in light. The active nav item is marked by fill, border and label colour; there is no coloured side-stripe anywhere on this page.
2 · Read-only means read-only. This tier sits above coordinator operations and holds no exchange, no document and no fund. Nothing here initiates a disbursement, adjusts a statutory date, clears a KYC check or requests a signature — the widgets report, the office console acts. Adding a widget can never widen access: every widget and pinned view inherits the viewer's existing read scope, and dashboard reads are audit-logged like every other access on this tier.
3 · Deadline colour is earned, never decorative. Red and amber appear only on the two nearest deadline buckets and on the ≤ 7-day count. The concentration heatmap is violet — density, not danger — because a busy week is not a late week. An overdue clock must never render in a satisfied or neutral state anywhere this data is re-used.
4 · Four-eyes is reported as a fact, not a target. The governance panel states 12 of 12 dual-approved and names the 2 still awaiting a second approver. Approver ≠ proposer is enforced in the disbursement workflow, not by this surface; the count here must read from the same audit events, never from a separate tally.
5 · Layouts persist server-side, per user. One layout per QI Hub user, stored on the profile — never localStorage. Share with QI Hub team offers this layout as a named starting point and never overwrites anyone's saved layout; Reset to default restores the org default.
6 · Chart rules. One primary series in --tier against a --series-muted comparison series; every axis starts at zero with labelled gridlines; the heatmap holds four intensity steps rather than five, because a fifth step cannot carry a legible numeral in both themes. Counts are counts — funds throughput shows movements, never amounts.
7 · The controls in this mockup are spans; in code they are buttons. The kebab menus, layout chip, dialog tabs, type chips, pin rows, drag handles and close buttons must ship as real <button> elements with accessible names, so the keyboard and screen-reader paths exist and the shared :focus-visible ring applies. The hover and active states are already defined here.
8 · The tier's name is one token. Every occurrence of "QI Hub" renders through .tier-name — sidebar badge, breadcrumb, page badge, empty-state copy. A future rename drops in there and nowhere else.
Fully tokenized against ../tokens.css — no raw hex, in the stylesheet or in any inline style attribute. Light and dark are both designed. --tier, --tier-2, --series-muted, --scrim and the --console-rail-* family are [PROPOSED]: add them to packages/web-app/src/index.css in :root and .dark before writing a call site. All names, figures and references are synthetic demo data.