Configure the Kenya country profile
The country profile is the layer of configuration that every branch, product, and member inherits. Setting it wrong forces you to override the same field on hundreds of records later. Spend the hour to set it once, correctly.

Currency and locale
Open Settings → Companies → Bridge MFI Ltd and confirm:
| Field | Value for Kenya | Notes |
|---|---|---|
| Currency | KES (Kenyan Shilling) | Locks once members exist |
| Decimal places | 2 | CBK reports require 2dp |
| Thousand separator | Comma | Per ISO 4217 KE locale |
| Date format | DD/MM/YYYY | Per Kenyan civil practice |
| Time zone | Africa/Nairobi | UTC+3 no DST |
| Language | English (Kenya) | Swahili optional via mfi.translation |
KRA PIN format
Kenya Revenue Authority PINs follow a strict 11-character format: letter, 9 digits, letter (e.g. A001234567Z). The shipped regex enforces this on every res.partner with is_mfi_member=True.
Members without a KRA PIN (informal traders, mama mbogas) are allowed but the field x_no_kra_reason must be filled — the CBK reporting pack groups them under 'unbanked' for the financial inclusion line.
# mfi_member/models/res_partner.py — shipped validator
_KRA_PIN_RE = re.compile(r'^[A-Z]\d{9}[A-Z]$')
@api.constrains('vat')
def _check_kra_pin(self):
for partner in self.filtered('is_mfi_member'):
if partner.vat and not _KRA_PIN_RE.match(partner.vat):
raise ValidationError(_(
'KRA PIN %s is not in the expected format A0123456789Z.'
) % partner.vat)
ODPC data-protection consent
Kenya's Data Protection Act (2019) and ODPC regulations require every member to give written, informed, withdrawable consent before you collect their data. The shipped consent text is reviewed annually by ALN and lives in ir.config_parameter mfi.odpc_consent_text.
- Purpose: extended at member onboarding to cover credit scoring, mobile money lookup, CRB submission, and dunning calls.
- Retention: 7 years post account-close per CBK Prudential Guideline CBK/PG/22.
- Withdrawal: members can withdraw consent for marketing at any time via iBANK → Privacy.
- Cross-border: data stays in Kenya unless the tenant has registered with ODPC as a data exporter.
CBK reporting calendar
The country profile ships the 2026 CBK reporting calendar so the dashboard can warn you when a return is due.
| Return | Frequency | Due | Module |
|---|---|---|---|
| DTM-1 Statement of Financial Position | Monthly | 20th of following month | mfi_reports |
| DTM-2 Statement of Comprehensive Income | Monthly | 20th of following month | mfi_reports |
| DTM-3 Liquidity Statement | Weekly | Following Wednesday | mfi_treasury |
| DTM-4 Capital Adequacy | Quarterly | 15th of following month | mfi_reports |
| DTM-5 Large Exposures | Quarterly | 15th of following month | mfi_reports |
| DTM-6 Sector Concentration | Quarterly | 15th of following month | mfi_reports |
| DTM-7 Insider Lending | Quarterly | 15th of following month | mfi_reports |
| DTM-8 Geographical Distribution | Annually | 31 March | mfi_reports |
| IFRS 9 ECL summary | Quarterly | 30 days post quarter-end | mfi_ifrs9 |
| Goldberg AML/CFT (FRC-1) | Monthly | 15th of following month | mfi_audit |
SMS short codes and senders
Africa's Talking and Safaricom Bulk SMS each need configuration in the country profile so dunning, OTP, and statement texts go out from the right sender.
| Use | Sender ID | Provider | Cost (KES) |
|---|---|---|---|
| OTP for iBANK login | MFI-OTP | Safaricom Bulk | 0.80 per SMS |
| Dunning reminder | MFIPAY | Africa's Talking | 0.50 per SMS |
| Statement dispatch | MFISTMT | Safaricom Bulk | 0.80 per SMS |
| Marketing (opt-in only) | MFI | Africa's Talking | 0.50 per SMS |
Public holidays 2026
Public holidays affect interest accrual (use act/365 with holidays excluded for some products) and the dunning calendar (no SMS on a public holiday). The shipped holiday list for 2026:
- 1 Jan — New Year's Day
- 3 Apr — Good Friday
- 6 Apr — Easter Monday
- 1 May — Labour Day
- 1 Jun — Madaraka Day
- 10 Oct — Huduma Day (Utamaduni)
- 20 Oct — Mashujaa Day
- 12 Dec — Jamhuri Day
- 25 Dec — Christmas Day
- 26 Dec — Boxing Day
- Variable — Idd ul-Fitr, Idd ul-Adha (set 30 days prior by Chief Kadhi)
Worked scenarios
Scenario — A new member arrives with a malformed KRA PIN
| Character | Role |
|---|---|
| Mary Mutua | New member applicant |
| Peter Otieno | Branch loan officer |
| Florence Achieng | System admin remote |
Timeline
- Day 1, 14:20: Peter enters the PIN on Mary's member form. Save triggers the constraint and BridgeERP raises a ValidationError. (Member draft, save rejected)
- Day 1, 14:22: Peter inspects the certificate Mary brought — it is a 2014 PIN printed before the format change. (Manual check)
- Day 1, 14:25: Peter calls KRA iTax at 020-4999999 and requests Mary's updated PIN. (External KRA portal)
- Day 1, 14:40: KRA confirms the new format is
A001234567B. Peter updates the field. (Validation passes) - Day 1, 14:42: Peter saves. Member moves to
kyc_pending. (mfi.member.state = kyc_pending)
Outcome — Mary's KYC continues without leaving the country-profile rules; the malformed PIN never enters the database.
Reference
ir.config_parameter keys set by country profile
| Key | Default for Kenya | Notes |
|---|---|---|
| mfi.country_code | KE | ISO-3166 alpha-2 |
| mfi.base_currency | KES | Locks after first member |
| mfi.kra_pin_required | True | Set False for SACCO with informal members |
| mfi.odpc_consent_text | Reviewed annually | |
| mfi.cbk_reporting_active | True | Disables for non-DTM lenders |
| mfi.sms_provider | africastalking | or 'safaricom_bulk' |
| mfi.sms_otp_sender | MFI-OTP | Must be pre-registered with CA |
| mfi.daraja_environment | production | or 'sandbox' |
| mfi.business_days_per_year | 260 | Used for act/360 interest accrual |
| mfi.timezone | Africa/Nairobi | Must match OS tz |
Locale fields on res.company
| Field | Value | Effect |
|---|---|---|
| currency_id | KES | Default currency on every journal |
| country_id | Kenya | Drives address format |
| partner_id.vat | KRA PIN of MFI | Stamped on invoices |
| account_fiscal_country_id | Kenya | Drives tax position |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Cannot change currency after a member exists | mfi.base_currency_locked is True | This is by design. To change currency, run the migration tool and rebook every transaction — do not flip the parameter. |
| SMS sender showing as 'AFRICASTKNG' instead of 'MFI-OTP' | Sender ID not approved by CA yet | Approval takes 5–10 working days; use default sender in the meantime and update mfi.sms_otp_sender once the CA letter arrives. |
| CBK calendar shows wrong due date | Time zone drift between OS and database | Set both to Africa/Nairobi; restart container; re-run mfi-doctor calendar. |
| ODPC consent text shows blank on iBANK | ir.config_parameter cleared during a database copy | Re-run ./mfi-doctor reseed odpc to repopulate from the shipped template. |
| Eid holiday not on calendar | Chief Kadhi has not announced yet | Edit resource.calendar.leaves manually when Gazette is published; the shipped data leaves Eid blank. |

