Cash-in-transit (CIT)
Cash-in-transit (CIT) covers every physical movement of cash between two of our locations, or between us and a bank. The system enforces sealed-bag tracking from origin to destination so that liability is clear at every leg.

Trip, manifest, bag
A **CIT trip** (`mfi.cash.cit`) is the movement order. It has an origin, a destination, a carrier, a route, a scheduled date, and one or more **bags** (`mfi.cash.cit.bag`) attached. Each bag carries a seal number, a declared value, and a denomination breakdown. The **manifest** is the printable document the carrier signs at pickup.
- **Origin** — vault, till, or HQ treasury
- **Destination** — vault, bank account, or HQ treasury
- **Carrier** — registered CIT provider (Wells Fargo, G4S, KK Security, or self-transport for short legs)
- **Route** — pre-defined or ad-hoc; routes have a liability cap and an expected duration
- **Bag** — physical sealed bag, one per logical batch; seal number unique per institution
Trip lifecycle
- **Draft** — branch (or HQ) creates trip, attaches bags, prints manifest
- **Approved** — branch manager and treasury approve (for trips above KES 2M)
- **Ready** — bags physically prepared, seals fitted, manifest ready
- **Picked up** — carrier signs manifest at origin
- **In transit** — bag with carrier, GPS tracked if available
- **Received** — carrier signs over at destination, recipient verifies seal number against manifest
- **Reconciled** — destination breaks bag, counts contents, matches declared value
- **Closed clean** — variance = 0 at destination
- **Closed with variance** — variance triggers incident; carrier may be liable
Carriers and liability
Each CIT carrier is configured with:
If a planned trip exceeds the carrier's per-bag or per-route liability cap, the system either:
- **Splits** the trip across multiple bags (if per-bag cap is the constraint)
- **Splits** the trip across multiple carriers (if per-route cap is the constraint)
- **Blocks** the trip with a treasury escalation
| Field | Description |
|---|---|
| name | Carrier brand |
| liability_cap_per_bag | Insurance cap per individual bag |
| liability_cap_per_route | Aggregate cap per single trip |
| insurance_policy_no | For claim filing |
| api_endpoint | If carrier offers tracking API (e.g. Wells Fargo) |
| default_routes | Pre-defined route templates |
Seal numbers
Seals are tamper-evident tags physically fitted to each bag. Each MFI maintains a roll of pre-numbered seals procured from the carrier. The system tracks seal lifecycle from issue → fitted → broken.
Pickup and handover
At pickup, the carrier's crew chief signs the manifest (paper + electronic). The system captures:
Once handover is signed, the trip moves to In Transit and the bag balance leaves the vault GL.
- Pickup timestamp
- Carrier crew chief id
- Branch handover officer id (must be branch manager or supervisor)
- Bag seal numbers verified against bag records
- Photograph of sealed bags (mobile capture)
- Vehicle registration
Receipt at destination
At destination, the receiving party (another branch's manager, the bank's cash desk, or HQ treasury):
- Verifies seal numbers against manifest before accepting
- Refuses to accept if any seal is tampered or numbers don't match — bag returns to carrier and an incident is raised
- Signs the carrier's delivery receipt
- Logs the bag as Received in the system
- Breaks the seal in a controlled count area
- Counts contents denomination-by-denomination
- Matches against declared value → reconciles trip
Self-transport
For very short, low-value legs (under KES 200k between two branches in the same compound), self-transport is permitted with branch manager authorisation. The same sealed-bag, seal-number, two-person controls apply — just without a third-party carrier. The system labels these trips 'SELF' and applies insurance from a separate self-transport rider on the institution's policy.
Worked scenarios
Scenario — CIT from Kawangware to KCB Mama Ngina
| Character | Role |
|---|---|
| Florence Achieng | Branch manager |
| Peter Otieno | Supervisor |
| Mary Mutua | G4S crew chief |
| Aisha Hassan | KCB cash desk officer |
Timeline
- Day 1, 14:00: Florence creates a CIT trip from Kawangware vault to KCB Mama Ngina, carrier G4S, route Kawangware-CBD. (Trip CIT/2026/0481 in draft)
- Day 1, 14:15: She allocates one bag, declared value KES 1,200,000, denomination breakdown captured from vault. (Bag 0481-A with seal #88412)
- Day 1, 14:20: Florence and Peter both authorise — trip moves to Ready. (Trip APPROVED)
- Day 1, 15:30: G4S crew arrives 30 minutes early. Crew chief Mary inspects bag and seal. (—)
- Day 1, 15:35: Florence and Mary both sign the manifest electronically. Florence photographs bag. Vehicle KCB123A. (Trip IN TRANSIT, vault ledger decremented)
- Day 1, 16:10: G4S delivers to KCB Mama Ngina. Aisha at KCB cash desk verifies seal #88412 matches manifest. (—)
- Day 1, 16:15: Aisha signs G4S receipt. Mary leaves. (—)
- Day 1, 16:20: Aisha breaks seal with KCB colleague present. Counts KES 1,200,000 exactly. (Trip RECEIVED)
- Day 1, 16:25: Aisha issues KCB deposit slip, scans into the system via the carrier portal. (Bank transaction recorded, trip CLOSED CLEAN)
- Day 1, 16:40: Treasury sees KES 1.2M land in the KCB account in the next bank-feed sync. (Bank reconciliation auto-match)
Outcome — Clean CIT trip; KES 1.2M banked the same afternoon; one hour total from pickup to bank reconciliation.
Reference
Trip states
| State | Meaning |
|---|---|
| draft | Created, bags being assembled |
| approved | Two-signature approval complete |
| ready | Bags sealed, manifest printed |
| in_transit | Picked up by carrier |
| received | Arrived and signed over |
| counted | Seals broken, contents counted |
| closed_clean | Reconciled zero variance |
| closed_with_variance | Reconciled with incident |
| cancelled | Cancelled before pickup |
| lost | Carrier reported loss; insurance claim opened |
Commonly configured carriers (Kenya)
| Carrier | Per-bag cap (typical) | Per-route cap (typical) |
|---|---|---|
| G4S Kenya | KES 5,000,000 | KES 25,000,000 |
| Wells Fargo Limited | KES 5,000,000 | KES 30,000,000 |
| KK Security | KES 2,000,000 | KES 10,000,000 |
| Securex Cash Solutions | KES 5,000,000 | KES 20,000,000 |
| SELF (in-compound only) | KES 200,000 | KES 200,000 |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Cannot mark trip as picked-up — manifest missing | Manifest PDF not printed, or carrier crew chief id not entered | Print manifest from the trip form; scan in crew chief id; both signatures required. |
| Trip blocked because exceeds carrier per-route liability cap | Single trip value > carrier cap | Either split into two trips on different carriers, or escalate to treasury to authorise a temporary cap raise (requires carrier confirmation). |
| Seal number rejected as 'already used' | Seal number was previously logged in another trip | Verify the physical seal — if you have duplicates, contact carrier immediately (serial-number collision is a fraud risk). Use a different seal from the roll. |
| Bank confirms deposit but trip stuck in 'received' | Seal-break/count step skipped | Bank operator completes count step in the carrier portal, system auto-reconciles. |
| Carrier reports bag tampered on arrival | Seal damaged or replaced en route — fraud or accident | Do not accept bag at destination. Carrier returns to origin under joint custody. Open level-3 incident. Notify carrier insurance immediately (24-hour clock starts on tamper observation). |

