Running the quarterly batch

SaaS tenant. The MFI Suite is delivered as a fully managed service — there is nothing to install or configure at the OS level. Self-hosted one-time licence buyers receive a dedicated installation runbook with the licence delivery; this page describes the user-facing workflow only.

The quarterly run is the act of computing ECL. It happens on the last calendar day of every quarter, takes about 30 minutes on a 5,000-loan book, and produces the journal that lands in the accounts. This page is the operator's checklist for getting it through cleanly.

IFRS 9 runs
Quarterly ECL runs with totals and provisioning journal.

The run lifecycle

An ifrs9.run moves through seven states. Each state is owned by a different role; you cannot skip a state, and reversing only goes one step back.

StateOwnerTriggerReversible
draftAnalystRun createdDelete
snapshottedEngine (cron)Quarter-end midnight snapshotRe-snapshot only before stage
stagedAnalystRun staging engineYes → snapshotted
computedEngineRun ECL computeYes → staged
reviewedRisk ManagerRisk Manager sign-offYes → computed
approvedCFOCFO sign-offYes → reviewed
postedEngine (on approve)Journal posted to GLNo — must reverse via new run

T+0 — the snapshot

Run detail
Per-run detail — stage assignments + per-stage ECL + generated journal.

At 23:59 on the last day of the quarter a cron job creates an ifrs9.run, picks every loan that is open or closed-with-balance, and copies the data points needed for ECL into immutable run-line rows. After snapshot the book can keep moving — payments, write-offs, new disbursements — but the run sees the frozen picture.

The snapshot covers: loan id, segment, product, member, outstanding principal, accrued interest, EIR, origination PD, current DPD, last instalment date, last arrear date, restructure flag, is_forborne flag, collateral type and value, watchlist flag.

Warning — If the cron didn't run (server down, DB locked), create the snapshot manually with IFRS 9 → Runs → New → Set period_end to quarter-end → Snapshot. The engine will reach back to the closing state using the audit log on every loan record so the snapshot remains accurate even if run hours later.

T+1 — staging

Open the run, click Stage. The engine evaluates the staging rules in sequence order against every run line and writes the resulting stage. This is fast (< 1 minute for 10k loans).

  1. Open the run from IFRS 9 → Runs.
  2. Click the Stage button (state: snapshotted → staged).
  3. Review the Staging tab. You'll see counts per rule and per stage, plus an exception list.
  4. Spot-check 5-10 lines in each stage against your manual expectation.
  5. If anything looks wrong, fix the rule or the loan record, then click Re-stage.

T+1 — ECL computation

Click Compute ECL. The engine runs each scenario (base, upside, downside) for every loan, computing EAD × PD × LGD discounted at EIR, and stores ECL per scenario plus a weighted ECL. This takes about 5-15 minutes on a 5,000-loan book.

The Compute step is restartable — if it crashes part way you can hit it again and it'll resume from the last completed line. Lines are computed in segments (PD assumptions are loaded once per segment), and a progress log writes to the Compute log tab.

Watching progress. Open the run record and switch to the Compute log tab — it auto-refreshes every 10 seconds with live progress.

T+2 — review

The Risk Manager reviews the computed run. Open the run and step through:

  1. Summary tab. Total EAD, weighted ECL, coverage ratio, comparison vs prior quarter.
  2. By Segment tab. Top 5 segments by ECL contribution — sanity-check the largest.
  3. By Stage tab. Compare stage migration vs prior quarter. Big shifts get flagged.
  4. Top exposures tab. The 20 largest loan exposures — eye-ball each.
  5. Sensitivity tab. ECL under each scenario individually — confirms the spread is plausible.
  6. Capture review comments in the Review notes field.
  7. Click Sign off — Risk Manager.

T+3 — approve and post

The CFO opens the run, reads the review notes, and clicks Approve and Post. The engine immediately:

  • Locks all run lines and assumption versions referenced
  • Generates one accounting journal per portfolio segment (see provisioning journal)
  • Posts the journals in draft, tagged with the run ID
  • Sets run state to posted
  • Triggers audit pack build (async — takes ~10 minutes)
Note — The journal is posted in DRAFT. The CFO must separately post the journal in the accounting module — this is a deliberate two-person rule, even though the same CFO does both.

Built-in validation checks

Before allowing post, the engine runs 11 validation checks. Any failure blocks post and surfaces in the Validations tab.

CheckThresholdOn fail
All loans assigned a stage100%Block
All segments have PD assumptions100%Block
Scenario weights sum to 1.0exactBlock
Scenario weights approved by CFOtrueBlock
EAD vs GL outstanding reconcile≤ KES 1,000 diffWarn
Coverage ratio plausibility0.3% – 15%Warn
Stage 3 ratio plausibility≤ 25%Warn
Q/Q ECL change≤ ±50%Warn
Top 20 exposures reviewedtickedBlock
Risk Manager signed offtrueBlock
Macro scenarios within calibration rangesoft capWarn

Worked scenarios

Scenario — A clean Q2 run — start to finish

Setting: 30 June 2027, 5,184 loans on book.

CharacterRole
Jane WanjikuIFRS 9 Analyst
Kimani MwangiRisk Manager
Florence AchiengCFO

Timeline

  1. Jun 30, 23:59: Cron fires. Snapshot created automatically. (ifrs9.run id=14, state=snapshotted)
  2. Jul 1, 08:30: Jane opens the run. Confirms 5,184 lines. (Lines count matches mfi.loan filter)
  3. Jul 1, 08:45: Jane clicks Stage. Engine runs in 38 seconds. Stage 1: 4,612; Stage 2: 401; Stage 3: 171. (state=staged)
  4. Jul 1, 09:15: Jane spot-checks 8 Stage 3 loans. All look correct (90+ DPD, distressed restructures). (—)
  5. Jul 1, 09:30: Jane clicks Compute ECL. Engine runs 11 minutes. Total weighted ECL: KES 10.84M. (state=computed)
  6. Jul 1, 11:00: Jane runs the Q/Q bridge. ECL up KES 0.42M from Q1 — entirely from new originations, no surprises. (ECL bridge attached)
  7. Jul 2, 10:00: Kimani reviews. Asks Jane to double-check the top-3 Stage 2 contributors. All check out. (Review notes saved)
  8. Jul 2, 11:30: Kimani signs off. state=reviewed. (—)
  9. Jul 3, 09:00: Florence opens run, reads notes, clicks Approve and Post. Engine posts 12 journal entries (one per segment). state=posted. (account.move 8842-8853 in draft)
  10. Jul 3, 09:10: Florence opens the accounting module and posts the 12 journals. Total impairment line: +KES 0.42M increment. (Journals state=posted)
  11. Jul 3, 09:45: Audit pack build completes. PDF downloaded for the Q2 board file. (Audit pack v1.0 generated)

Outcome — Q2 closed clean; full run completed in under 48 working hours; no rework needed.

Reference

Run-form buttons

ButtonVisible in stateRequires groupAction
SnapshotdraftAnalystFreeze loan book
StagesnapshottedAnalystRun staging engine
Re-stagestaged, computedAnalystRe-run staging (clears computed ECL)
Compute ECLstagedAnalystRun ECL calculation
Sign off — Risk ManagercomputedRisk ManagerLock review
Approve and PostreviewedCFOGenerate + post JE in draft
Generate Audit PackpostedAnalyst+Build PDF bundle
Reverse RunpostedCFOCreate reversing run for the same period

Run-form tabs

TabContent
SummaryHeadline numbers + Q/Q comparison
LinesPer-loan run line; filter by segment/stage/scenario
By SegmentAggregates per portfolio segment
By StageAggregates per stage + migration matrix
SensitivityECL under each scenario individually
Top exposures20 largest exposures requiring sign-off
ValidationsAuto-checks before post
Compute logEngine execution log + timings
Sign-offsAnalyst / Risk Manager / CFO timestamps
Audit packGenerated PDFs and supporting attachments

Troubleshooting

SymptomLikely causeFix
Snapshot has fewer lines than expected.Some loans were closed and archived before the snapshot ran; engine excludes archived loans.Tools → Reset run → set the run period_end backwards by an hour and re-snapshot. Engine reads loan archival timestamps so true-state-at-period-end is recovered.
Compute step crashes mid-run with timeout.Default worker timeout is 1200s; very large books exceed it.Either chunk compute by segment (Compute by segment button), or raise the timeout in bridgeerp.conf (limit_time_real_cron) and restart the worker. Compute is restartable so just hit it again.
Validation 'EAD reconciles to GL' fails with KES 12,400 diff.Late-posted loan transactions after the snapshot — usually a manual journal in the accounting module.Check account.move filtered by date = period_end, look for unapproved manual entries to loan accounts. Either post + re-snapshot the run, or document the variance in the validation override note.
Approve and Post button is greyed out for CFO.A blocking validation is still failing OR Risk Manager hasn't signed off.Open the Validations tab. Any red row blocks post. Resolve it (or override with reason if it's a soft check). Then confirm Sign-offs tab shows Risk Manager green tick.
Audit pack build fails with 'no PDFs generated'.wkhtmltopdf binary missing or QWeb template failure.Raise a support case from iBANK → Get help — the platform team will inspect the PDF engine and the QWeb template on your tenant.

See also

Was this page helpful?