Treasury cash dashboard
The Treasury dashboard is the single screen that head of treasury and operations watch all day. It shows every branch's cash position, every in-flight CIT trip, every open incident, and every policy threshold utilisation — refreshed live.

Audience and access
The dashboard is bookmarked by:
Access is governed by the standard MFI roles. Each role sees only what it should: branch managers see their branch + region; regional managers see their region; HQ roles see everything.
- **Head of treasury** — live cash position; CIT scheduling; vault overnight overage early warning
- **Head of operations** — branch session progress; tellers stuck open at lunch; EOD progress in the afternoon
- **Head of compliance** — open incidents by level; SLA breach alerts; STR queue depth
- **CFO** — institution-wide cash holding; insurance limit utilisation; weekly trend
Dashboard panels
The dashboard is composed of these panels (configurable per user):
| Panel | What it shows | Refresh |
|---|---|---|
| Branch Sessions | Per-branch open / closing / closed status, time of last activity | 30s |
| Cash Heat-map | Map of branches coloured by vault % of overnight max | 60s |
| Live Till Positions | All open till sessions, balance, time since last txn, status | 30s |
| CIT In Flight | All in-transit CIT trips with origin, destination, carrier, value, ETA | 60s |
| Incidents Open | All open incidents grouped by level + SLA bucket | 60s |
| Limit Utilisation | % of policy limits across till float, vault overnight, single-txn, CIT bag | 5m |
| Insurance Utilisation | Cash in vault + in transit vs insurance cap | 5m |
| Today's Throughput | Cash in / out / net / by branch / by channel | 1m |
| STR Queue | STR cases pending FRC filing, days remaining | 5m (compliance only) |
| KRA ETIMS Status | ETIMS submissions in last hour, success / failure | 5m |
Alerts
Alerts are pushed to dashboard banners and (configurable per user) email / SMS / Slack. Defaults:
- **Branch session not opened by 09:00** — branch ops + regional manager
- **Till open > 6 hours without transaction** — supervisor + branch manager
- **Till at 90% of operating max** — supervisor
- **Vault at 90% of overnight max at 15:00 or later** — branch manager + regional manager
- **CIT in transit > expected duration + 30 min** — head of treasury + carrier liaison
- **Open L3 incident** — CFO, head of compliance, head of treasury (immediate)
- **Insurance cap > 90% utilisation** — head of treasury
- **ETIMS submission failure rate > 5% / hour** — IT + compliance
Historical mode
The dashboard has a 'replay' mode that lets you step back through any past trading day in 15-minute increments. Useful for:
- **Post-incident review** — see exactly what the dashboard showed at the time of an L3 event
- **Training** — walk new operations leads through a typical day
- **Audit** — demonstrate that monitoring was operational at the relevant moment
- **Capacity planning** — see peak till utilisation by hour-of-day across a month
Daily KPI tile
A summary tile at the top of the dashboard shows institution-wide KPIs for today vs yesterday vs same-day-last-week:
| KPI | Definition | Healthy band |
|---|---|---|
| Branches open by 09:00 | Count of branches in OPEN state | = total branches |
| Net cash position | Sum of vault + till balances institution-wide | Trending |
| Throughput today | Sum of cash-in + cash-out | Compare prior period |
| Variance count | Count of incidents opened today | ≤ 1 per 10 branches |
| Variance total KES | Sum of variance amounts today | ≤ 0.01% of throughput |
| CIT trips today | Count completed + in flight | Per route schedule |
| STR queued | FRC-eligible transactions awaiting filing | 0 ideally; ≤ 7-day-old always |
| Insurance utilisation | (Cash in vault + in transit) / insurance cap | < 80% |
Permissions and PII
The dashboard surfaces aggregate balances and incident summaries. It does NOT show individual customer transactions, member names, or KYC data. Compliance-only panels (STR queue, AML flags) require the AML role. PII handling follows the ODPC retention rules described on the Compliance page.
Under the hood
The dashboard is rendered by an OWL widget that subscribes to a small set of materialised views and live websocket updates. Most panels refresh on a server cron; high-frequency panels (Live Till Positions, Branch Sessions) refresh on websocket push when a relevant record changes state. If the dashboard appears stale, check (in order): browser tab is still active; websocket connection in browser dev tools; the `mfi.cash.dashboard.refresh` scheduled action.
Worked scenarios
Scenario — Head of Treasury runs the dashboard through a busy day
| Character | Role |
|---|---|
| Mary Mutua | Head of treasury, HQ |
| Florence Achieng | Branch manager Karen |
| Peter Otieno | Regional manager East |
| Aisha Hassan | Compliance officer |
Timeline
- 08:00: Mary opens dashboard. 38 of 40 branches show OPEN. (Branch Sessions panel)
- 08:05: Two branches still 'draft'. Mary pings the two regional managers via the dashboard chat-link. (Notifications sent)
- 08:30: Both branches now OPEN. Mary moves on. (—)
- 10:15: Cash Heat-map shows Karen at 65% of overnight max already — unusual for morning. (Karen tile YELLOW)
- 10:18: Mary drills in: large mid-month corporate-bulk deposit explains it. Schedules a same-day CIT to KCB. (CIT trip CIT/2026/0701 drafted)
- 13:00: L2 incident opens — KES 18,000 variance at Westlands. Mary watches but doesn't intervene (regional manager owns). (Incidents panel updates)
- 15:45: CIT In Flight panel shows the 14:00 G4S trip from Mombasa is 30 min late. Mary calls G4S Ops. (—)
- 15:55: G4S reports vehicle breakdown; replacement crew dispatched. Trip ETA updated. (ETA refreshed)
- 17:00: Public counters close. EOD progress panel turns over: 0/40 closed. (EOD bar updates)
- 17:30: EOD progress 18/40. Mary watches the slowest cluster. (—)
- 17:55: EOD progress 39/40. One branch stuck on an open incident. Mary pings the branch manager. (—)
- 18:10: EOD progress 40/40. Insurance utilisation finalised at 73%. (Day closed)
Outcome — Mary identified two operational issues (slow branches, late CIT) and one capacity issue (heavy Karen vault) — all resolved before EOD; institution closed clean.
Reference
Panel definitions and source
| Panel | Source view / model | Filter scope |
|---|---|---|
| Branch Sessions | mfi.branch.session | By user role region |
| Cash Heat-map | mfi.cash.vault + branch geo | All visible branches |
| Live Till Positions | mfi.cash.till.session (state=active|locked) | By user role |
| CIT In Flight | mfi.cash.cit (state in transit / received) | All visible |
| Incidents Open | mfi.cash.incident (state != closed) | By severity + role |
| Limit Utilisation | Aggregated from mfi.cash.policy | All visible |
| Insurance Utilisation | Aggregated across vault + CIT vs policy | HQ only |
| Today's Throughput | account.move filtered to cash journals | By branch |
| STR Queue | mfi.cash.incident (str_filed=True) | Compliance role only |
| KRA ETIMS Status | etims.submission | All visible |
Alert channel defaults
| Alert | Default channel | Recipient role |
|---|---|---|
| Branch not opened by 09:00 | Email + Slack | Branch ops + regional |
| Till idle > 6 h | Slack | Supervisor + branch manager |
| Vault > 90% overnight max | Email + SMS | Branch + regional manager |
| CIT late > 30 min | Email + SMS | Head of treasury |
| L3 incident opened | SMS + Email + Slack | CFO + heads of treasury / compliance |
| Insurance cap > 90% | Head of treasury | |
| ETIMS failure rate > 5%/h | Email + Slack | IT + compliance |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Dashboard panels say 'no data' for one branch | Branch system clock skew or websocket disconnected | Check branch server NTP; restart the websocket service at that branch; reload dashboard. |
| Stale data — panels do not update | Browser tab inactive; websockets pause | Click anywhere in the tab or press F5. Long-running monitoring should pin the tab. |
| Cash Heat-map shows wrong geo location | Branch lat/lng not set or stale | Update res.branch.partner_id geo coordinates. Heat-map refreshes on the next cron tick. |
| STR Queue panel missing for compliance user | User not in `mfi.group_compliance_officer` | Settings → Users → assign group; user logs out and back in. |
| Dashboard slow to load with 40+ branches | Materialised views not refreshed; falls back to live aggregation | Verify cron `mfi.cash.dashboard.refresh_materialised` is running every 5 minutes. Increase server resources if needed. |

