Accounting integration

Every transaction the suite handles — disbursement, repayment, deposit, withdrawal, transfer, fee, interest accrual, IFRS 9 provisioning — posts a balanced journal entry to the BridgeERP General Ledger at the moment the event happens. This page is the reference for how that wiring works.

Accounting dashboard
BridgeERP Accounting dashboard — each MFI journal (MLOAN, MSAV, MMOB, MSHR, MTRS, MFEE) shows its posting volume.
Journals
Journals — the MFI journals (MLOAN / MSAV / MMOB / MSHR / MTRS / MFEE) plus standard banking journals.

How the integration is wired

The integration is event-source, not batch. Each app has a thin GL bridge module that listens for the operational event (e.g. mfi.loan._post_repayment) and posts the journal in the same transaction. If the posting fails, the operational event is rolled back too — the suite never leaves the GL out of sync with the sub-ledger.

Wiring summary:

  • Every loan + savings product has 3–4 GL accounts mapped on its form (principal receivable, interest income, fee income, write-off).
  • Every channel (cash, M-Pesa float, Airtel float, sponsor-bank float) has a dedicated cash-equivalent account.
  • Every MFI journal (MLOAN, MSAV, MMOB, MSHR, MTRS, MFEE) routes a specific class of entries.
  • The company-level defaults (mfi_*_journal_id, share-related accounts) tie the products to the company's books.
Chart of accounts
Chart of accounts — the SACCO-tier scheme seeded by the suite; MFI codes 12000 (Loans), 20000 (Deposits), 240xxx (Income), 25xxxx (Expenses).

The full event → journal entry map

EventModuleDRCR
Loan disbursementmfi_loan_gl_bridgeLoans Receivable (12000)Cash or M-Pesa Float
Loan repayment (principal)mfi_loanCash / Member SavingsLoans Receivable (12000)
Loan repayment (interest)mfi_loanCash / Member SavingsInterest Income (240000)
Loan repayment (fee)mfi_loanCash / Member SavingsFee & Commission Income (242000)
Loan fee chargemfi_loanReceivableFee Income (242000)
Loan write-offmfi_loanBad-Debt ExpenseLoans Receivable (12000)
Loan recovery (after write-off)mfi_loanCashBad-Debt Recoveries
Savings depositmfi_savings_gl_bridgeCash or M-Pesa FloatMember Deposits (20000)
Savings withdrawalmfi_savings_gl_bridgeMember Deposits (20000)Cash or M-Pesa Float
Savings interest postingmfi_savings_gl_bridgeInterest Expense — Deposits (250000)Member Deposits (20000)
Savings fee chargemfi_savings_gl_bridgeMember Deposits (20000)Fee Income (242000)
Suspense receiptmfi_savings_gl_bridgeCash or M-Pesa FloatSuspense — Unidentified Deposits (29900)
Suspense releasemfi_savings_gl_bridgeSuspense (29900)Member Deposits (20000)
Share purchasemfi_accountingCashShare Capital
Dividend declarationmfi_accountingRetained EarningsDividends Payable
Dividend paymentmfi_accountingDividends PayableCash / Member Savings
IFRS 9 ECL provisioningmfi_ifrs9_eclLoan Loss Provisioning — ExpenseLoan Loss Allowance
Bureau feemfi_credit_bureauBureau Fees — ExpenseSundry Payable
Insurance premiummfi_bancassuranceCashUnderwriter Payable + Commission Income

How to read the Profit and Loss

The MFI Suite posts Revenue under 240xxx (Interest Income, Fee & Commission Income) and Expenses under 25xxxx (Interest Expense, Loan Loss Provisioning, Bad-Debt Expense).

The Kenya P&L variant has been extended to include those code prefixes — on a live tenant with this guide's configuration, opening Accounting → Reporting → Profit and Loss (KE) at "All Time" shows the numbers below:

LineValue
Operating RevenuesKES 208,694.75
  Interest IncomeKES 90,540.11
  Fee & Commission IncomeKES 118,154.64
Operating Costs(KES 175,829.11)
  Interest Expense — DepositsKES 175,829.11
Net Profit / LossKES 32,865.64
Journal Entries
Journal Entries — every MFI transaction lands here, posted state, with the source document linked back.

How to verify the Trial Balance

The trial balance is the production-readiness gate. Open Accounting → Reporting → Trial Balance with date filter "All Time".

Total Debits must equal Total Credits exactly. If not:

  • Search Journal Entries for state = Draft. Each draft is missing from the TB and probably has a rounding gap.
  • Open each draft and look for a 0.01–1.00 imbalance between the principal / interest / fee components.
  • Post the draft (the suite's repayment-posting flow handles rounding by widening the largest line).

Where to wire a new module to the GL

If you build a new MFI module that moves money, follow these conventions:

  1. Add a tiny <module>_gl_bridge shim module (or extend an existing bridge).
  2. Listen on the operational event method (action_post / action_confirm).
  3. Build the account.move with two or more lines that sum to zero.
  4. Call move.action_post() in the same transaction.
  5. On failure, let the exception bubble so the operational event rolls back too.
Tip. Run the Trial Balance after every period — DR must equal CR exactly. Any draft entries indicate a rounding gap that needs reconciliation.
Was this page helpful?