Provisioning journal entry
The run computes ECL. The provisioning journal entry is what puts ECL into the books. This page shows the exact accounts hit, how the increment is calculated, and how to reconcile to the trial balance every quarter end.

Increment, not absolute
ECL sits as an asset-contra (allowance for impairment) on the balance sheet. Each quarter the system posts only the difference between the new ECL and the prior period's posted ECL. If the new number is higher, the journal is a charge to P&L impairment expense; if it is lower, the journal is a release.
# Per portfolio segment (loan product or product group)
prior_ecl = ifrs9.run.previous(segment).total_ecl
new_ecl = ifrs9.run.current(segment).total_ecl
increment = new_ecl - prior_ecl
if increment > 0:
# P&L charge
Dr 5520 Impairment Loss increment
Cr 1290 Allowance for Loan Loss increment
else:
# Release
Dr 1290 Allowance for Loan Loss abs(increment)
Cr 5520 Impairment Loss abs(increment) # negative impairment expense
Accounts hit

We use four accounts in the standard chart, all CBK-compliant. Each is reserved exclusively for IFRS 9 — manual postings to these accounts are blocked by an account.move rule.
| Code | Name | Type | Use |
|---|---|---|---|
| 1280 | Loans and Advances — Gross | Asset | Gross loan book; untouched by ECL |
| 1290 | Allowance for Loan Loss — Stage 1+2+3 | Asset (contra) | Stage 1/2/3 ECL allowance |
| 1291 | Allowance — Specific (Stage 3 Carve-out) | Asset (contra) | Stage 3 specific allowance, when ringfenced |
| 5520 | Impairment Loss — Loans | Expense (P&L) | Periodic impairment charge / release |
One journal per segment
The system posts one journal per portfolio segment (loan product or product group, configurable). This keeps the P&L view granular without polluting it with thousands of line items.
Example posting on a Q3 run for a tenant with 4 active loan products:
Net P&L impact = +192,740 - 26,800 + 320,520 + 167,600 = +654,060.
| Segment | Prior ECL | New ECL | Increment | Dr | Cr |
|---|---|---|---|---|---|
| Normal Loan | 3,420,140 | 3,612,880 | +192,740 | 5520 NRM 192,740 | 1290 NRM 192,740 |
| Emergency Loan | 415,200 | 388,400 | -26,800 | 1290 EMG 26,800 | 5520 EMG 26,800 |
| Group Loan | 1,820,000 | 2,140,520 | +320,520 | 5520 GRP 320,520 | 1290 GRP 320,520 |
| Agriculture Loan | 612,800 | 780,400 | +167,600 | 5520 AGR 167,600 | 1290 AGR 167,600 |
Reference and analytic tagging
Every journal posted by the engine carries:
Reconciliation queries always filter on the run linkage rather than on the date or reference text — it survives if accountants rename references.
- Reference:
IFRS9/Q4/2026/NRM— engine-generated, unique per run × segment. - Move date: quarter-end (not posting date).
- Posting date: actual date the engine posted (typically T+3 to T+5).
- Analytic distribution: 100% to the product's analytic account.
- Run linkage:
x_ifrs9_run_idfield on the move points back to the run.
Quarter-end reconciliation
A clean reconciliation is the single most useful audit artefact. The system produces it automatically — Run → Reconciliation tab — but operators should still walk through it on a real GL extract every quarter.
- Closing balance on 1290 should equal total weighted ECL on the current run.
- Sum of charges/releases on 5520 for the quarter should equal the increment of the run.
- Each journal reference IFRS9/Qx/yyyy/SEG should appear in 1290 and 5520 with equal-and-opposite postings.
- No manual postings to 1290 or 5520 — if any exist, they must be documented.
# Pull the GL extract for accounts 1290 and 5520
# from the Accounting module:
# Reporting → Trial Balance → date range = quarter
# Filter: account 1290, 1291, 5520
# Export as XLSX
# In the run:
# Run → Reconciliation tab
# Click 'Compare to GL extract' → upload the XLSX
# System highlights any line in the GL that
# is not from an IFRS 9 run, and any run line
# that is missing from the GL.
Reversing a posted run
Posted runs are immutable. To correct a posted run you create a reversing run for the same period, post it, then post the corrected run.
- Open the original run, click Reverse (CFO permission required).
- System creates a new run in
draftwith negated ECLs; period_end and segments mirror the original. - Approve and post the reversing run. GL effect: original journals negated.
- Create the new corrected run, take it through the normal lifecycle.
- Audit pack tracks the trio: original → reverse → corrected, with a CFO note explaining why.
Worked scenarios
Scenario — Discovered data error — reverse and re-post
| Character | Role |
|---|---|
| Jane Wanjiku | IFRS 9 Analyst |
| Florence Achieng | CFO |
| Kimani Mwangi | Risk Manager |
| David Karanja | Internal Audit |
Timeline
- Oct 6, 14:00: Accountant Mary Mutua reconciles 1280 vs the loan ledger. Finds Loan LN-3847 (KES 4.1M business loan) absent from the run. (Loan archived 30-Sep 22:00 by automated 'no activity 12 months' cron)
- Oct 6, 15:00: Jane investigates: the loan was archived in error by a cron that wasn't tuned for high-value loans. Un-archives. (Loan state restored)
- Oct 6, 16:00: Jane raises a ticket to fix the cron threshold (low-value-only archive). (Internal ticket TICK-1192)
- Oct 7, 09:00: Florence opens the posted Q3 run and clicks Reverse. New run R-15-REV created in draft. (ifrs9.run id=15-rev)
- Oct 7, 09:15: Florence approves and posts the reversal. GL effect: Q3 impairment journals negated. (12 reversing journals in account.move)
- Oct 7, 09:30: Jane creates a corrected Q3 run, period_end 30-Sep. Snapshot now picks up LN-3847. (ifrs9.run id=16, 5,185 lines (was 5,184))
- Oct 7, 14:00: Through stage, compute, review. Corrected ECL: KES 11.2M (was 10.84M). (Diff +KES 0.36M from LN-3847 Stage 1 ECL)
- Oct 8, 10:00: Florence approves and posts. Net P&L impact of the trio: original +0.42M, reversal -0.42M, corrected +0.78M = net +0.78M. (GL clean)
- Oct 9: David documents the incident in the audit pack 'Adjustments' section. Cron bug logged for fix. (Audit pack section 6.2)
Outcome — Q3 correctly stated; full reverse-and-replay audit trail; root cause logged for engineering.
Reference
Account configuration
| Setting | Value | Where |
|---|---|---|
| Impairment expense account | 5520 | Settings → IFRS 9 → Posting |
| Allowance account (default) | 1290 | Settings → IFRS 9 → Posting |
| Specific allowance ringfence | 1291 (optional) | Settings → IFRS 9 → Posting |
| Journal | Misc Ops or dedicated IFRS9 | Settings → IFRS 9 → Posting |
| Block manual postings to 1290/5520 | True | Account.account → 'allow manual posting' = False |
| Post in draft | True | Settings → IFRS 9 → Posting |
Extra fields on account.move from IFRS 9
| Field | Purpose |
|---|---|
| x_ifrs9_run_id | Many2one to ifrs9.run |
| x_ifrs9_segment | Selection — which segment |
| x_ifrs9_kind | Selection — initial | reversal | correction |
| x_ifrs9_period_end | Date — quarter-end |
| x_ifrs9_ref | Char — engine-generated reference |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Account 1290 balance doesn't match total ECL on latest run. | Manual posting to 1290 between runs (rare — should be blocked), or a posted run was reversed but reversal not posted. | Query account.move.line where account_id = 1290 and x_ifrs9_run_id is null — any rows are manual postings. Either roll into the next run or post a corrective entry referencing 'IFRS 9 reconciliation'. |
| 5520 charge for the quarter is positive but ECL fell. | Reversal of prior period was posted in this quarter, creating a swing. | Look at account.move.line where account = 5520 and date in quarter grouped by x_ifrs9_kind. The sum should reconcile to (current run ECL – prior run ECL). |
| Approve and Post creates the journal but doesn't post it. | Setting 'Post in draft' is true (default). | Expected behaviour — the CFO posts it from the accounting module as the second part of the two-person rule. If you genuinely want auto-post, flip the setting (not recommended). |
| Journal reference IFRS9/Q4/2026/NRM appears twice. | A reversal and a corrected run both for the same quarter × segment — engine appends -REV / -COR suffix but reference root may look duplicated. | Check x_ifrs9_kind on each move. If both are 'initial' that's a bug — escalate. Otherwise expected. |
| P&L impairment expense looks lumpy — quarters with large swings. | Genuine — IFRS 9 is more volatile than the old incurred-loss model. | Use the ECL bridge in the audit pack to explain the swing (staging migration, macro overlay change, new originations, write-offs, recoveries). Board prefers the bridge to the P&L line alone. |

