IFRS 9 — Expected Credit Loss
IFRS 9 is the international accounting standard that replaced the old "incurred loss" provisioning model with a forward-looking Expected Credit Loss (ECL) model. Every quarter end the system computes a provision number that lands in the trial balance, flows into CBK's quarterly return, and gets defended in the external audit. This page is the map of how it all fits together.

Why IFRS 9 matters for a Kenyan MFI
Every regulated microfinance bank in Kenya files quarterly returns to the Central Bank of Kenya under prudential guideline CBK/PG/04 and audited annual accounts under IFRS 9 (effective 2018). The two numbers diverge — CBK still uses a watch/substandard/doubtful/loss buckets-and-rates schedule, while IFRS 9 uses forward-looking ECL — so the system computes both and the higher figure drives capital. Getting either wrong is a finding on the audit; getting both wrong is a CBK supervisory letter.
Beyond the legal angle, IFRS 9 is also how the board sees credit risk. The CFO walks into every quarterly board meeting with one number: 'Our ECL coverage ratio is X% of the gross book.' If that number jumps sharply, the board wants to know why — was it macro deterioration, a sectoral stress, or one big group loan slipping into Stage 3? The audit pack page is what answers that question.
The three-stage model

Every loan, every quarter, sits in exactly one of three stages. The stage drives whether ECL is computed over 12 months or over the full remaining life of the loan.
The biggest source of audit findings is stage transitions: a loan that should have moved to Stage 2 but didn't (under-provisioned), or a loan that bounced back to Stage 1 without a proper cure period (over-provisioning into prior year, under-provisioning now). The staging engine page documents the exact rules.
| Stage | Trigger | ECL horizon | Interest recognition | Typical coverage |
|---|---|---|---|---|
| Stage 1 | Origination, or performing with no SICR | 12-month ECL | Gross carrying amount | 0.5% — 3% |
| Stage 2 | Significant Increase in Credit Risk (SICR) since origination | Lifetime ECL | Gross carrying amount | 5% — 15% |
| Stage 3 | Credit-impaired (default, 90+ DPD, restructured-distressed) | Lifetime ECL | Net carrying amount (EIR × net) | 30% — 80% |
The four ingredients
Each loan's ECL is computed as EAD × PD × LGD × discount, with a forward-looking macro overlay applied to the PD. The four ingredients each have their own configuration page and their own assumption owner.
| Ingredient | What it is | Where it lives | Owner |
|---|---|---|---|
| PD | Probability of default over the relevant horizon | ifrs9.assumption (by segment × stage) | Risk Manager |
| LGD | Loss given default — % of EAD lost after recoveries | ifrs9.assumption (by collateral type) | Risk Manager |
| EAD | Exposure at default — outstanding + undrawn × CCF | Computed live from mfi.loan | Engine (no override) |
| Macro overlay | Forward-looking scalar by scenario | ifrs9.scenario (base/upside/downside × weight) | CFO + Risk Committee |
The quarterly cycle
ECL is computed quarterly, on the last calendar day of each quarter (31-Mar, 30-Jun, 30-Sep, 31-Dec). The process is the same every quarter — the deliverable is the journal entry that lands in March/June/September/December books, plus the audit pack that gets emailed to the partner the following week.
- T+0: Quarter-end snapshot. Engine freezes every loan's outstanding, DPD, restructure status, collateral.
- T+1: Stage classification. Engine evaluates SICR rules per loan, assigns Stage 1/2/3.
- T+1: PD × LGD × EAD computation per loan, three runs (base/upside/downside).
- T+2: Probability-weighted ECL by scenario. CFO reviews and locks scenario weights.
- T+3: Journal entry generated (one per portfolio segment), posted in draft.
- T+4: Risk committee reviews; CFO approves; journal posted.
- T+7: Audit pack auto-built — model documentation, run logs, sensitivity, sign-offs.
- T+10: CBK return filed. ECL number reconciles to GL.
Where to go next
Each step in the cycle has its own detail page. Read them in order if you're new; jump straight to the page you need if you're operating.
- Staging engine — how Stage 1/2/3 is decided per loan, SICR rules, cure periods.
- PD, LGD, EAD assumptions — the parameters and their owners.
- Macro scenarios — GDP, inflation, FX, CBK rate inputs and weights.
- Quarterly run — running the batch, reviewing the output.
- Provisioning journal entry — the GL posting and reconciliation.
- Audit pack — the auto-generated bundle for the external auditor.
What the live screen looks like
The screenshot below shows the production Runs list. Four quarterly runs across the year, each in posted state, with the gross book, weighted ECL, and coverage ratio visible at a glance. The CFO uses this view in board prep — one click into any run gives the full breakdown by segment, stage and scenario.
Worked scenarios
Scenario — CFO defends a sharp Q4 ECL increase to the board
| Character | Role |
|---|---|
| Florence Achieng | CFO |
| Kimani Mwangi | Risk Manager |
| Mary Mutua | Head of Credit |
| Peter Otieno | Board chair |
| Aisha Hassan | External audit partner (observer) |
Timeline
- Dec 28: Florence locks the Q4 macro scenarios. Downside weight raised from 20% to 35% on Risk Committee instruction (drought outlook + CBK rate hike). (ifrs9.scenario weights versioned)
- Dec 31, 23:59: Quarter-end snapshot fires automatically. 4,217 loans frozen with state. (ifrs9.run created, state=snapshotted)
- Jan 2, 09:00: Kimani runs the staging engine. 138 loans transitioned Stage 1 → Stage 2 (mostly agriculture sector — 30-day DPD breach plus sector watchlist trigger). (state=staged)
- Jan 2, 11:30: Engine completes PD/LGD/EAD across all three scenarios. Weighted ECL: KES 14.74M. (state=computed)
- Jan 3, 10:00: Mary cross-checks Stage 2 list against her watchlist. Two loans she expected to be Stage 3 are still Stage 2 — Kimani checks: both restructured last quarter, in cure period. (Cure-period flag on loan record)
- Jan 3, 14:00: Florence approves; journal of KES 6.31M (the increment) posts to GL account 5520 Impairment Loss. (state=posted, account.move id 8842)
- Jan 5, 09:00: Board pack distributed. ECL bridge shows: +KES 2.1M staging migration, +KES 3.4M macro overlay (downside weight up), +KES 0.81M new originations. (Audit pack section 4)
- Jan 5, 15:00: Board meeting. Florence walks Peter through the bridge. Aisha (auditor) confirms the model documentation and sign-offs are in order. (Minute item 7.3)
Outcome — Board accepts the ECL number. Risk Committee asked to revisit agriculture sector exposure cap in Q1 2027.
Reference
Key BridgeERP models in the IFRS 9 app
| Model | Purpose | Key fields |
|---|---|---|
| ifrs9.run | One quarterly run | name, period_end, state, total_ead, total_ecl, scenario_ids |
| ifrs9.run.line | One loan in a run | loan_id, stage, ead, pd_12m, pd_lifetime, lgd, ecl_base, ecl_upside, ecl_downside, ecl_weighted |
| ifrs9.assumption | PD/LGD parameter set, versioned | segment_id, stage, pd_value, lgd_value, valid_from, valid_to |
| ifrs9.scenario | Macro scenario + weight | name, type (base/upside/downside), weight, macro_factors_json |
| ifrs9.staging.rule | SICR / Stage transition rule | name, sequence, condition_python, target_stage |
| ifrs9.audit.pack | Auto-built audit bundle | run_id, document_ids, sign_off_ids, state |
Access groups
| Group | Read | Write | Approve |
|---|---|---|---|
| MFI / IFRS 9 / Viewer | Yes | No | No |
| MFI / IFRS 9 / Analyst | Yes | Yes (draft only) | No |
| MFI / IFRS 9 / Risk Manager | Yes | Yes (assumptions, scenarios) | No |
| MFI / IFRS 9 / CFO | Yes | Yes | Yes (lock + post) |
| Accounting / Billing | Run summary only | No | No |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| ECL number swings dramatically quarter-to-quarter for no obvious portfolio reason. | Scenario weights edited mid-quarter without versioning, or PD assumptions updated without recomputing prior quarters. | Open the run audit log (Run → Audit tab). Compare assumption-version IDs with prior quarter. If they differ, document the change in the assumption-change register and refer to the audit pack. |
Run stuck in computing state for more than 30 minutes. | Long-running cron worker on a large book (>10k loans) or DB lock from a concurrent backup. | Check (managed by the platform team — raise a support case if needed). If the worker is alive, wait. If killed, re-run from Run → Recompute; the engine is idempotent at the run-line level. |
| External auditor says "model documentation is insufficient." | The audit pack was exported before all sign-offs were captured. | Re-open the audit pack, ensure the four sign-offs (Analyst, Risk Manager, CFO, Internal Audit) are all present, then regenerate the PDF. See audit pack. |
| ECL coverage looks unreasonably low (e.g. 0.3%) on a 30-day book. | Macro overlay scenario weights default to 100% upside — usually because someone copied a sandbox tenant. | IFRS 9 → Scenarios. Confirm weights sum to 100% with base ~50%, upside ~20-25%, downside ~25-30%. CFO must sign off any deviation. |
| Stage 3 loan count is zero despite obvious NPLs. | Staging rules disabled, or DPD threshold mis-configured at 180 instead of 90. | IFRS 9 → Configuration → Staging Rules. Activate the default rule set and verify DPD ≥ 90 → Stage 3 is sequence 10 and active. |

