Cash policy

Cash policy is where you write down — once, centrally — the limits and approval matrices that every till, vault, CIT trip, and EOD reconciliation enforces. Set this before anyone touches cash; revisit quarterly.

Cash policies
Per-till float min/max, vault movement rules, CIT thresholds.

What a cash policy contains

A cash policy (`mfi.cash.policy`) groups all the thresholds for one or more branches. Most institutions run two or three policies: one for urban branches, one for rural, optionally one for a flagship/HQ branch with elevated limits. Each branch has exactly one active policy at a time, with a dated history of changes for audit.

GroupFieldDescription
Tilltill_operating_maxSoft-warn threshold (default KES 200k)
Tilltill_hard_maxBlock threshold (default KES 250k)
Tilldefault_floatOpening float drawn from vault (default KES 50k)
Vaultvault_overnight_maxCannot close above (default KES 5M urban / 2M rural)
Vaultvault_min_reserveBelow this triggers replenishment (default KES 200k)
Single transactioncash_in_max_per_txnAbove triggers STR/FRC queue (default KES 1M)
Single transactioncash_out_max_per_txnAbove blocks at front-counter, manager approval (default KES 500k)
KRAetims_thresholdAbove emits ETIMS payload (default KES 100k)
Variancevar_auto_incidentAbove this creates incident automatically (default KES 1)
Variancevar_supervisor_capSupervisor can close incident up to (default KES 5k)
Variancevar_manager_capBranch manager can close up to (default KES 50k)
Variancevar_regional_capRegional manager can close up to (default KES 250k)
CITcit_max_per_bagMax bag value (default KES 2M)
CITcit_carrier_liability_capMax per carrier per route (default KES 10M)

Approval matrix

Tills
Tills with state — open / topping-up / closing / suspended.

Beyond numeric thresholds, the policy defines who can authorise which override:

ActionDefault authoriserDefault escalation
Override till hard maxBranch managerRegional manager
Override vault overnight maxRegional managerHead of treasury
Authorise vault → till sweep > KES 500kBranch managerRegional manager
Authorise emergency vault injectionHead of treasuryCFO
Force-close orphan till sessionBranch managerRegional manager
Add temporary vault co-holderRegional managerHead of treasury
Suspend a cash policyHead of treasuryCFO
Edit a published cash policyHead of treasuryCFO
Warning — Approval matrix changes require dual sign-off from compliance and operations. The signed-off PDF is attached to the cash policy record as an audit artefact.

Policy lifecycle

  1. **Draft** — head of treasury or branch operations drafts a new policy or edits a copy of an existing one.
  2. **Review** — compliance officer reviews and adds comments.
  3. **Approve** — CFO or head of treasury approves with electronic sign-off.
  4. **Schedule** — set effective date (typically next branch-open).
  5. **Active** — policy enforces on every relevant transaction.
  6. **Superseded** — replaced by a new version. Historical version remains for audit.
  7. **Suspended** — only for emergency response (e.g. raise overnight max during a holiday surge); requires CFO sign-off.

Publishing and effective date

A policy does not take effect at the moment of approval — it takes effect at the configured effective date, which must be a future branch-open. This prevents mid-day policy switches that would invalidate the morning's transactions. The system holds approved-but-not-yet-effective policies in a queue and swaps at the next branch open.

Note — Best practice: communicate policy changes to branch managers two weeks before effective date so tellers and supervisors have time to internalise new limits.

Branch overrides

Sometimes a single branch needs an exception — a flagship branch with 2× transaction volume, a rural branch with no CIT capability that needs a lower overnight max. Two mechanisms:

  • **Branch override field** — for a single threshold, set the override on the branch record itself. Visible in the policy report as 'overridden'.
  • **Branch-specific policy** — for multiple thresholds, create a dedicated policy and link only that branch to it. Cleaner for audit.

Policy effectiveness report

Run quarterly from Cash → Reports → Policy Effectiveness. Shows every threshold breach across the institution for the period, by branch, by type, with the resolution (override / declined / escalated). Use this to recalibrate — if 30% of disbursements at one branch are breaching the till hard max, raise that branch's max or change the disbursement channel.

Worked scenarios

Scenario — Raising overnight max for end-of-month surge

Setting: Late November. Christmas-savings campaign means deposits are running 3× normal. Vault hits the KES 5M ceiling at 16:00.

CharacterRole
Florence AchiengBranch manager, Karen
Aisha HassanHead of treasury, HQ
Peter OtienoCFO

Timeline

  1. Day 1, 16:00: Florence cannot close branch session — vault at KES 5.4M, KES 400k above overnight max. (Branch session close blocked)
  2. Day 1, 16:05: Florence emails Aisha to request emergency CIT pickup. Aisha confirms G4S can't dispatch until tomorrow 09:00. (—)
  3. Day 1, 16:15: Aisha drafts a temporary policy raise for Karen branch from KES 5M to KES 7M, effective from now through Day 14 (peak season). (Policy draft created)
  4. Day 1, 16:20: Aisha submits to Peter for approval. (Policy in review)
  5. Day 1, 16:30: Peter signs off electronically with reason: 'Christmas surge, CIT capacity constrained'. Insurance underwriter cc'd. (Policy ACTIVE)
  6. Day 1, 16:35: Florence closes branch session at KES 5.4M, now within limit. (Branch session CLOSED)
  7. Day 14, 23:59: Temporary policy expires automatically. Original KES 5M policy resumes. (Policy SUPERSEDED)

Outcome — Branch closed legally and insurance was renotified; surge handled without a panic CIT call-out.

Reference

Policy states

StateMeaning
draftBeing authored
reviewWith compliance for review
approvedSigned off, not yet effective
activeCurrently enforcing
supersededReplaced by a newer version
suspendedTemporarily disabled — emergency
archivedHistorical, no longer reachable

Shipped defaults — urban vs rural

ThresholdUrban defaultRural default
Till operating maxKES 200,000KES 100,000
Till hard maxKES 250,000KES 150,000
Default floatKES 50,000KES 30,000
Vault overnight maxKES 5,000,000KES 2,000,000
Vault min reserveKES 200,000KES 100,000
Single cash-inKES 1,000,000KES 500,000
Single cash-outKES 500,000KES 250,000
KRA ETIMSKES 100,000KES 100,000

Troubleshooting

SymptomLikely causeFix
Policy approved but limits still old at the branchEffective date not yet reachedCheck effective_date on the policy. Limits swap at next branch open after effective date.
Compliance officer cannot approve — 'approval matrix change requires CFO'Approval matrix section was edited, which needs CFO sign-offEither revert the approval matrix changes and let compliance approve the thresholds only, or route to CFO.
Branch override not visible in policy viewBranch override fields are on res.branch, not on the policy formOpen the branch record and check the Cash Override panel. Run the Policy Effectiveness report to see all overrides in one place.
Temporary policy did not auto-expireExpiry cron job paused (multi-company configs sometimes skip)Run the cron 'mfi.cash.policy.expire_temporary' manually from Settings → Technical → Scheduled Actions, then unpause.
Variance incident threshold of KES 1 is annoying — tiny variances flood incidentsStrict-by-defaultDo not raise the threshold; tighten teller counting. CBK examiners specifically check that every variance has a case. Instead, set auto-close at KES 50 with supervisor sign-off — the incident still exists for audit but does not consume time.

See also

Was this page helpful?