Kenya Regulatory Pack
mfi_reg_kenya is the most heavily exercised pack in MFI Suite because every BridgeERP MFI tenant runs in Kenya. It covers four supervisors and the tax authority, with auto-lodgement where each portal supports it.

What this pack does
Kenya has overlapping regulators for microfinance entities. A deposit-taking SACCO answers to SASRA. A microfinance bank answers to CBK under the Microfinance Act 2006. Both must register with ODPC under the Data Protection Act 2019, file AML reports to FRC via the GOAML portal, and remit withholding tax on interest income to KRA. This pack handles all five.
The pack auto-detects which licences the tenant holds via Settings > MFI > Licences. Toggle the licences you carry; only those returns become active. A non-deposit credit-only MFI will see CBK-DCS returns instead of SASRA, plus ODPC and FRC.
SASRA returns
SASRA supervises deposit-taking SACCOs (DT-SACCOs). The pack files four returns: monthly capital adequacy (SR-1), monthly liquidity (SR-2), monthly large exposures (SR-3), and quarterly prudential (SR-Q).
| Return | Frequency | Deadline | Format |
|---|---|---|---|
| SR-1 Capital Adequacy | Monthly | 10th of following month | XLSX (SASRA template) |
| SR-2 Liquidity | Monthly | 10th of following month | XLSX |
| SR-3 Large Exposures | Monthly | 10th of following month | XLSX |
| SR-Q Prudential | Quarterly | 30 days after quarter end | XLSX |
| SR-RM Risk Management | Annual | 31 March | PDF narrative + XLSX annex |
CBK returns
CBK supervises microfinance banks and Digital Credit Providers (DCP). The pack covers MFB monthly prudential (MFB-1), DCP quarterly returns under the Digital Credit Providers Regulations 2022, and the consumer-complaints register.
- MFB-1 prudential return (monthly) — capital, liquidity, asset quality, earnings, sensitivity
- MFB-2 large exposures (monthly)
- DCP-Q quarterly return for digital credit providers
- Consumer complaints register (real-time, queryable by CBK on demand)
- Quarterly stress-test under CBK guidance note 2023
ODPC data-protection registrations
Any MFI processing personal data in Kenya must register as a Data Controller with ODPC. The pack ships the registration form data, the DPIA template required for credit scoring, and a breach-notification workflow that hits the 72-hour rule.
FRC GOAML reports
The Financial Reporting Centre uses the UNODC goAML platform. The pack exports STRs (Suspicious Transaction Reports) and CTRs (Cash Transaction Reports above KES 1,000,000) as goAML-compliant XML.
- Cron evaluates daily for transactions over the CTR threshold (KES 1,000,000 single, or aggregated within 24h)
- Eligible transactions queued in mfi.aml.report.draft
- AML officer reviews each draft, attaches narrative and supporting docs
- Officer clicks 'Generate goAML XML' — pack produces the file conforming to schema 5.0.1
- Officer uploads to FRC GOAML portal manually (no API yet); pack records the reference
KRA integration
Withholding tax on interest income is 15% for residents and 20% for non-residents. The pack computes WHT on each loan-interest receipt, posts the WHT liability, and prepares the monthly iTax CSV upload.
# Compute WHT for a member's monthly interest accrual
rate = 0.15 if member.country_id.code == 'KE' else 0.20
wht = interest_accrued * rate
self.env['account.move'].create({
'journal_id': journal_wht.id,
'line_ids': [
(0, 0, {'account_id': wht_liability.id, 'credit': wht}),
(0, 0, {'account_id': interest_income.id, 'debit': wht}),
],
})
Worked scenarios
Scenario — Mwananchi DT-SACCO files March SR-1
| Character | Role |
|---|---|
| Florence Achieng | Compliance Officer |
| Peter Otieno | Head of Finance |
| Jane Wambui | CEO (signs counter-signature) |
| Samuel Kibet | Internal Auditor |
Timeline
- 31 Mar, 23:59: March books closed in mfi_loan and mfi_savings. (Posted entries: KES 412M interest income, KES 89M provisioning charge.)
- 1 Apr, 00:30: Cron mfi_reg_ke_sasra_open scaffolds SR-1 March return. (Return record id=2026-SR1-03, state=open.)
- 1 Apr, 06:15: Florence opens the return; engine pulls capital and liquidity figures. (Core capital KES 487M, total capital KES 542M, total assets KES 3.21B, CAR 16.88% > 8% min.)
- 1 Apr, 09:00: Engine flags 12 exception lines: untagged loan products. (Exception queue shows loans missing SASRA loan category code.)
- 2 Apr, 14:30: Peter classifies the 12 loans (mostly recently-launched salary advance product). (Loan product Salary Advance Plus tagged as 'Personal Unsecured'; Recompute fires.)
- 3 Apr, 10:00: Florence signs the return; state moves to ready. (Digital signature with Florence's BridgeERP certificate captured.)
- 3 Apr, 11:45: Samuel reviews and signs counter-signature. (State = signed; lodgement window opens.)
- 4 Apr, 08:00: Jane reviews the file one last time, clicks Lodge. (SFTP upload to sasra-sftp.sasra.go.ke completes in 4.2 seconds; reference SR1-2026-03-MWAN-0073.)
- 8 Apr, 16:20: SASRA acceptance email arrives. (State = accepted; return is locked read-only.)
Outcome — March SR-1 filed two days before deadline (10 April). The 12 product classifications added in Step 4 are now permanent metadata that future returns reuse automatically.
Reference
SASRA SR-1 line-item mapping
| Line | Source | Sign | Aggregation |
|---|---|---|---|
| 1.1 Core Capital | account.account tagged sasra_core_capital | Credit-positive | Sum balances |
| 1.2 Supplementary Capital | account.account tagged sasra_supp_capital | Credit-positive | Sum balances |
| 2.1 Total Deposits | mfi.savings.account.balance | Sum | All non-share accounts |
| 3.1 Loans (Gross) | mfi.loan.outstanding_principal | Sum | All active loans |
| 3.2 Provisions | mfi.loan.ecl_balance | Sum | All loans, by IFRS 9 stage |
| 4.1 Interest Income MTD | account.move.line debit on income journals | Sum | Period 1-31 of month |
| 5.1 Liquid Assets | account.account tagged sasra_liquid | Sum | Cash, T-bills, demand deposits |
| 5.2 Short-term Liabilities | savings.account where withdrawable | Sum | Demand + 30-day notice |
Kenya pack configuration
| Parameter | Default | Effect |
|---|---|---|
| mfi_reg_ke.sasra.licence_no | (blank) | Licence number printed on every SASRA return |
| mfi_reg_ke.sasra.sftp_host | sasra-sftp.sasra.go.ke | SFTP endpoint for lodgement |
| mfi_reg_ke.cbk.entity_type | MFB | MFB | DCP | DTM | CRO |
| mfi_reg_ke.odpc.controller_id | (blank) | ODPC data controller registration number |
| mfi_reg_ke.frc.ctr_threshold_kes | 1000000 | Cash transaction threshold for CTR reporting |
| mfi_reg_ke.kra.wht_resident_rate | 0.15 | Withholding tax on resident interest |
| mfi_reg_ke.kra.wht_nonresident_rate | 0.20 | Withholding tax on non-resident interest |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| SR-1 capital adequacy ratio shows as 0%. | Core capital accounts not tagged sasra_core_capital. | Settings > Accounting > Chart of Accounts, filter by SASRA tag, add the tag to your share-capital and retained-earnings accounts, click Recompute on the return. |
| GOAML XML rejected with schema error 'Unknown element t_account'. | goAML schema version mismatch (FRC moved from 4.0 to 5.0.1). | Update mfi_reg_ke to latest version; the 5.0.1 schema is included from 18.0.3.0.0 onwards. |
| iTax CSV upload rejected for missing PIN. | Member partner missing KRA PIN field. | Members > filter 'KRA PIN is empty' > bulk request PIN via mail merge; until corrected, the engine emits the member's national ID with a warning. |
| ODPC DPIA gate blocks credit scoring orchestrator. | No DPIA record marked lodged in ODPC. | File the DPIA at ODPC portal, copy the reference number to mfi.regulatory.dpia, mark state=lodged. |
| Same loan appears in both SR-1 and CBK MFB-1. | Tenant has both DT-SACCO and MFB licences toggled and the loan product is not jurisdiction-tagged. | Each loan product must declare which licence it is booked under; set the licence_id on the loan product form. |

