Channels — how members reach the MFI
Channels are the front doors of your MFI. The platform supports six independent but ledger-unified channels, each tuned for a specific member segment, device, connectivity profile and risk tier.

Channel matrix at a glance
Use this matrix to decide which channels to enable for which segment.
| Channel | Best for | Internet required? | Smartphone required? | Cost / txn KES |
|---|---|---|---|---|
| iBANK (web) | Urban office workers, businesses | Yes | No (works on laptop) | 0 |
| USSD *354# | Rural members, feature-phone users | No | No | 1-3 (operator) |
| Smartphone users with WhatsApp | Yes | Yes | 0 (free WA) | |
| Teller | Walk-in customers, cash deposits | Yes (branch only) | No | 0 |
| Agent banking | Members near agents but far from branch | Agent has it | No | Agent fees apply |
| Cards (debit/prepaid) | ATM withdrawal, POS shopping | ATM/POS has it | No | VisaNet / Mastercard fees |
Member segmentation by channel

Typical Kenyan MFI distribution after 12 months of channel maturity:
- USSD: 55-65% of low-value transactions (KES <5,000)
- WhatsApp: 15-20%, growing fastest
- iBANK: 10-15%, high-value (KES >50,000)
- Teller: 8-12%, declining year-on-year
- Agent: 5-10% in agent-heavy regions
- Cards: 2-5%, niche use (ATM withdrawal)
Authentication per channel
| Channel | Primary auth | Step-up auth (high-value) |
|---|---|---|
| iBANK | Member ID + PIN | SMS OTP |
| USSD | PIN | Same PIN (no step-up) |
| Phone number = member phone + PIN | SMS OTP | |
| Teller | Photo ID verification by teller | Branch manager co-sign |
| Agent | Member fingerprint + PIN | SMS OTP |
| Cards | Card + PIN at POS/ATM | 3DS for online |
Channel transaction limits
Limits are configurable per product per channel, and per member tier (Tier 1 lowest KYC, Tier 3 full KYC). Defaults for a Tier 2 member:
| Channel | Per txn KES | Daily KES | Monthly KES |
|---|---|---|---|
| iBANK | 300,000 | 500,000 | 5,000,000 |
| USSD | 70,000 (Safaricom limit) | 300,000 | 1,000,000 |
| 150,000 | 300,000 | 2,000,000 | |
| Teller | Unlimited (cash policy applies) | Unlimited | Unlimited |
| Agent | 70,000 | 150,000 | 500,000 |
| Cards | 40,000 ATM, 100,000 POS | 150,000 | 500,000 |
Operating each channel
Each sub-page covers the operational details — what to configure, who to assign, how to monitor uptime, what to do when it breaks. Channels are independent, so you can launch iBANK and USSD on Day 1, add WhatsApp in month 3, and skip cards entirely.
- iBANK — web member portal at /ibank/...
- USSD — Safaricom and Airtel short codes via Aggregator API
- WhatsApp — Cloud API direct from Meta
- Teller — backoffice cashier app on POS hardware
- Agent — third-party network (PesaPoint, Sidian Agent) or in-house
- Cards — UnionPay / Visa / Mastercard via Kenswitch
Channel uptime monitoring
Dashboard at MFI > Channels > Dashboard shows real-time uptime per channel, transaction count last 24h, success rate, failure breakdown. Targets:
- iBANK uptime: 99.9% monthly
- USSD success rate: ≥98% (operator-dependent)
- WhatsApp delivery: ≥99% (Meta Cloud API)
- Cards authorisation: ≥97% (network-dependent)
Reference
Technical backends per channel
| Channel | Module | External API |
|---|---|---|
| iBANK | mfi_ibank | n/a (internal) |
| USSD | mfi_channel_ussd | Safaricom USSD Aggregator, Africa's Talking USSD |
| mfi_channel_whatsapp | Meta WhatsApp Cloud API | |
| Teller | mfi_channel_teller | n/a |
| Agent | mfi_channel_agent | PesaPoint, Sidian Agent, or custom REST |
| Cards | mfi_channel_cards | Kenswitch ISO 8583, Visa DPS, Mastercard Vocalink |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| A transaction appears in the ledger but no channel attribution | Imported via REST without source_channel populated. | Fix the integration to set source_channel = 'api'; backfill old rows by SQL. |
| Same member has different limits on different channels — confusing | Per-channel limits are intentional but member doesn't know. | Send a one-pager to the member with their tier and per-channel limits. Surface limits on each channel UI before they hit it. |
| iBANK and USSD show different balances | Caching layer stale. | Hit MFI > Channels > Cache > Invalidate. Confirm reverse — both channels read mfi.savings.account.balance live. |

