Second approval (the checker screen)

Second approval is the single most-used screen for checkers. It is designed to minimise mistakes — the payload is read-only, the context block surfaces the seven most important risk signals, and the OTP gate makes deniability impossible.

Approval rules
Shipped two-person rules.

Anatomy of the form

The form is split into a header, three side-by-side panels, and a footer action bar.

  • Header — request ID, rule code, maker name with photo, submitted timestamp, amount in KES
  • Panel 1 (Payload) — exact data that will be written to the database if approved
  • Panel 2 (Context) — KYC status, blacklist hits, related records, member history
  • Panel 3 (Maker's note) — mandatory free-text from the maker explaining the request
  • Footer — Approve, Reject, Re-assign, Save for later (parks it without action)

Payload panel in detail

Approval requests
Pending + completed approval requests.

What the panel shows depends on the rule. Examples:

RulePayload fields shown
LOAN_DISBURSEMember, Loan product, Principal, Tenor, Disbursement channel, M-Pesa number / bank account, Disbursement date
LOAN_WRITEOFFLoan reference, Outstanding principal, Interest, Penalties, Recovery attempts log, Board resolution attachment
SAV_ADJUSTSavings account, Current balance, Adjustment amount (+/-), New balance, GL account to charge
MBR_BLACKLISTMember, Reason code (FRAUD/AML/OFAC/INTERNAL), Evidence attachment, Linked exposures KES
GL_MANUALJournal, Debit account, Credit account, Amount, Memo, Period

Context panel — seven signals

The context panel always shows seven signals regardless of rule:

  1. KYC status badge (Green / Amber / Red) with last-verified date
  2. Blacklist hits — internal + Metropol + TransUnion + OFAC/UN sanctions
  3. Open loans count and total exposure
  4. Savings balance (locked vs available)
  5. Last 30 days transaction count
  6. PAR status (Performing / Watch / Substandard / Doubtful / Loss)
  7. STR/CTR flags from the AML engine in the last 90 days

OTP flow

  1. Click Approve
  2. A confirmation modal shows a one-line summary: "Disburse KES 75,000 to Mary Mutua (M-Pesa +254723XXXXXX)?"
  3. Click Confirm — OTP is dispatched via Africa's Talking
  4. Enter the 6-digit OTP
  5. Click Verify — the approval and the underlying action commit in a single PostgreSQL transaction
  6. Success toast: "Approved — DCR-2026-01102 executed"
  7. Request disappears from Pending and appears in Audit
Warning — Never share an OTP, even within the team. The OTP is the legal signature of the checker. Sharing is grounds for dismissal in most Kenyan MFI HR policies.

Reject flow

Rejection is OTP-free because it does not move money. But the reason field is mandatory and is shown to the maker verbatim — be specific and professional. Bad: "No". Good: "M-Pesa number does not match member record; please verify and resubmit".

Rejection reasons are categorised and reported on the Audit page — repeated rejection reasons surface training needs for makers.

Re-assigning to another checker

If you are on lunch / leaving / not the right person, click Re-assign. Pick another checker from the dropdown. The request moves to their queue and you drop off the audit trail (a small entry is logged that you re-assigned). Re-assignment is limited to two hops per request — after that, escalation kicks in to the CRO.

Save for later

Use this when you've started reviewing but need more info ("let me phone the maker"). The request stays in your queue and shows a "Held by Aisha" badge to other checkers so they don't double-handle it. The hold expires after 30 minutes.

Worked scenarios

Scenario — CFO signing off a KES 850,000 write-off

Setting: Quarterly write-off review. Mwananchi MFI's collections team has exhausted all recovery on Samuel Kibet's defaulted business loan. Board has resolved to write off.

CharacterRole
Peter OtienoCollections Officer (maker)
Florence AchiengCFO (checker 1)
Samuel KibetCEO (checker 2 — three-person rule)
Mary MutuaDefaulted borrower

Timeline

  1. Day 1, 14:00: Peter submits write-off for KES 850,000 outstanding on Mary's loan (Two rules fire: LOAN_WRITEOFF + LOAN_WRITEOFF_BIG (>KES 500k → 2 checkers))
  2. Day 1, 14:01: Florence receives notification (Pending DCR-2026-02144)
  3. Day 1, 14:10: Florence opens form — verifies recovery log shows 14 follow-ups, 3 site visits, 1 demand letter from advocates (Maker's note: "Board resolution Q1-2026/17 attached. Member relocated to Tanzania, no traceable address.")
  4. Day 1, 14:14: Florence clicks Approve — OTP 738241 (First signature captured)
  5. Day 1, 14:15: Request now needs Samuel's signature (min approvers = 2) (Notified Samuel)
  6. Day 1, 16:30: Samuel reviews, confirms board resolution, Approves — OTP 092374 (Both OTPs verified)
  7. Day 1, 16:31: Write-off posts: Dr Loan loss provision KES 850,000 / Cr Loan principal KES 850,000 (GL entry JV-2026-04412 created)
  8. Day 1, 16:31: Audit entry records both signatures + board resolution attachment (Immutable)

Outcome — Write-off properly authorised with three-person rule. External auditors confirm at year-end.

Reference

Footer action buttons

ButtonWhat it doesRequires OTP?Notifies maker?
ApproveCommits the underlying actionYesYes (e-mail + inbox)
RejectDiscards with reasonNoYes (with reason verbatim)
Re-assignHands to another checkerNoNo (silent)
Save for laterHolds for 30 minNoNo
Print previewPDF of the request for paper sign-offNoNo

Troubleshooting

SymptomLikely causeFix
Approve clicked but no OTP arrivesAfrica's Talking outage or stale phone number.Wait 60s, click Resend. If still nothing, the user's phone in res.users may be wrong; IT updates it; failing that, IT uses OTP > Bypass (audited).
OTP entered but "Invalid OTP" errorOTP expired (>10 min) or typo.Click Resend OTP for a fresh code. Three wrong attempts locks the OTP for 15 min.
Underlying action fails after OTP verified (e.g. M-Pesa down)Daraja API error or insufficient float.Approval rolled back automatically. Request returns to pending. Resolve the M-Pesa issue and re-approve (new OTP required).
Re-assign dropdown emptyNo other user in the rule's checker group / authorised users list.CRO must add more checkers under Rules > Authorised users.
Save for later button missingRequest has already been held by another checker.Coordinate verbally; once their 30-min hold expires it becomes available again.

See also

Was this page helpful?