Wealth Management, Unit Trust & Money Market Fund (MMF) Administration Platforms: Daily NAV Calculation and Instant Mobile Investing

How licensed fund managers, investment banks, and wealth-tech platforms automate daily Money Market Fund (MMF) yield accrual, Net Asset Value (NAV) unit pricing, custodial reconciliation, and instant M-Pesa T+0 redemptions.

Why Retail and Institutional Investors Demand Instant Digital Unit Trust Experiences

Collective Investment Schemes (CIS)—especially Money Market Funds (MMFs), Fixed Income Funds, USD Dollar Funds, and Shariah-compliant Sukuk Funds—have become the fastest-growing retail and corporate treasury asset class in East Africa and emerging markets. Retail savers want to invest as little as KES 100 or $10 via M-Pesa, watch their compounded daily interest grow on their phone every morning, and withdraw funds back to M-Pesa in under 60 seconds when an emergency arises. Corporate treasurers want a portal where they can park idle weekend or mid-month payroll float at 14%+ annualized yield and liquidate on demand.

Yet many licensed Fund Managers and Investment Banks still run fund administration on brittle spreadsheets or legacy desktop registries that crash past 25,000 unit holders, take until 3:00 PM to compute yesterday's daily yield, struggle to reconcile Trustee and Custodian bank accounts, and require investors to fill out PDF redemption forms that take 3 business days (T+3) to pay out. At devManue Capital Markets & Wealth-Tech Engineering, we build high-precision Unit Trust Registry, Daily NAV/Yield Accrual, and Instant Liquidity Platforms on Python, Django, and PostgreSQL.

1. Core Unit Trust, MMF & Wealth Management Modules and Build Costs

Our architecture enforces strict separation of duties between the Fund Manager, Custodian Bank, and Corporate Trustee while delivering a sub-second mobile/web experience to investors:

Wealth & Fund Admin Module Portfolio, Registry & Regulatory Deliverables Timeline Estimated Cost (USD / KES)
1. Digital KYC Onboarding, Risk Profiling & Sub-Accounts Individual, Joint, Minor, and Corporate onboarding, automated ID/KRA PIN verification, goal-based sub-buckets (Emergency, School Fees, Land Deposit). 2 Weeks $2,500 / KES 325,000
2. Portfolio Valuation, Daily Yield & NAV Engine T-Bills, T-Bonds, Call/Fixed Deposits, and Commercial Paper accrual; daily management/trustee/custody/CMA fee deduction; 8-decimal unit registry. 2.5 Weeks $3,400 / KES 440,000
3. Instant M-Pesa (T+0) Liquidity Buffer & Bank Sweeps Automated C2B Paybill unit creation, instant B2C redemption buffer up to daily limit (e.g., KES 300k instant, above KES 300k routed to Custodian T+1 EFT). 2 Weeks $2,800 / KES 365,000
4. Withholding Tax, Monthly Statements & IFA Agent Portal Tax-exempt (Pension/NGO) vs. 15% WHT investor tax tiers, automated monthly PDF statements, Independent Financial Advisor (IFA) trail-commission ledger. 1.5 Weeks $2,000 / KES 260,000

2. High-Precision Daily MMF Yield Distribution & 8-Decimal Unit Accounting

In a constant-NAV Money Market Fund (where par value is maintained at 1.00 per unit and net daily interest is credited and compounded monthly or daily) or a variable-NAV Equity/Balanced Fund (where unit price fluctuates daily based on mark-to-market asset valuations), floating-point numbers (float) are strictly forbidden because binary rounding errors create reconciliation breaks between total investor units and the Fund's net assets.

We store all unit holdings and interest accruals in PostgreSQL using NUMERIC(24, 8) precision. Every night at 00:05, our batch distribution engine computes the Fund's gross daily interest income across all fixed deposits and government securities, deducts the exact daily pro-rata slice of annual fund expenses (Management Fee, Trustee Fee, Custody Fee, and CMA Levy), applies each investor's statutory Withholding Tax tier (15% for retail residents vs. 0% for registered retirement schemes), and posts an immutable daily accrual record across 100,000+ accounts in under 4 seconds:

# Production Money Market Fund (MMF) Daily Net Yield & WHT Distribution Engine
from datetime import date
from decimal import Decimal, ROUND_HALF_UP
from django.db import transaction
from .models import MoneyMarketFund, InvestorUnitAccount, DailyYieldDistributionLog

@transaction.atomic
def run_daily_mmf_yield_distribution(
    fund_id: int,
    distribution_date: date,
    gross_daily_portfolio_income: Decimal,
) -> dict:
    """
    Deducts daily pro-rata fund expenses (Management, Trustee, Custodian, Regulator)
    from gross portfolio income and distributes net daily yield across eligible unit holders.
    """
    q8 = lambda v: v.quantize(Decimal("0.00000001"), rounding=ROUND_HALF_UP)
    q2 = lambda v: v.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)

    fund = MoneyMarketFund.objects.select_for_update().get(id=fund_id)
    accounts = list(
        InvestorUnitAccount.objects.select_for_update().filter(
            fund=fund, settled_units__gt=Decimal("0.00000000")
        )
    )
    total_eligible_units = sum((a.settled_units for a in accounts), Decimal("0.00000000"))
    if total_eligible_units <= Decimal("0.00000000"):
        return {"status": "SKIPPED_ZERO_AUM"}

    # Daily Expense Ratio = (Annual Expense Rate % / 365) * Total Eligible AUM
    daily_expense_rate = (fund.annual_total_expense_ratio_pct / Decimal("100.0")) / Decimal("365.0")
    total_daily_fees = q8(total_eligible_units * daily_expense_rate)
    distributable_net_income = max(Decimal("0.00000000"), gross_daily_portfolio_income - total_daily_fees)

    # Effective Daily Yield Factor per Unit (before investor-specific WHT)
    daily_yield_per_unit = q8(distributable_net_income / total_eligible_units)
    annualized_gross_yield_pct = q2(daily_yield_per_unit * Decimal("365.0") * Decimal("100.0"))

    logs_to_insert = []
    for acct in accounts:
        gross_investor_interest = q8(acct.settled_units * daily_yield_per_unit)
        wht_rate = Decimal("0.00") if acct.is_tax_exempt else Decimal("0.15")
        wht_deducted = q8(gross_investor_interest * wht_rate)
        net_investor_interest = gross_investor_interest - wht_deducted

        acct.uncompounded_accrued_interest += net_investor_interest
        acct.unremitted_wht_liability += wht_deducted
        acct.save(update_fields=["uncompounded_accrued_interest", "unremitted_wht_liability", "updated_at"])

        logs_to_insert.append(
            DailyYieldDistributionLog(
                fund=fund,
                account=acct,
                distribution_date=distribution_date,
                eligible_units=acct.settled_units,
                gross_interest=gross_investor_interest,
                wht_tax_deducted=wht_deducted,
                net_interest_credited=net_investor_interest,
            )
        )

    DailyYieldDistributionLog.objects.bulk_create(logs_to_insert, batch_size=2000)
    return {
        "distribution_date": distribution_date.isoformat(),
        "annualized_gross_yield_pct": str(annualized_gross_yield_pct),
        "accounts_credited": len(logs_to_insert),
    }

3. How T+0 Instant Redemptions Work Without Breaking Custodial Controls

Under Capital Markets Authority (CMA) regulations, underlying fund assets are held by an independent Custodian Bank. To offer retail investors instant 24/7 M-Pesa redemptions without violating custodial governance, we implement a Ring-Fenced Liquidity Float Account pre-funded with a small operational buffer (e.g., 2%–3% of AUM, replenished daily via a Custodian-approved sweep). Small retail withdrawals up to your instant ceiling (e.g., KES 150,000 per day) are paid out in 10 seconds via M-Pesa B2C, while larger institutional redemptions automatically route to a Dual-Maker-Checker Custodian Bank approval workflow.

Launching or modernizing a Money Market Fund, Unit Trust, or Wealth Management platform? Size your PostgreSQL ledger with our PostgreSQL & pgBouncer Config Sizer or book a 30-Minute Capital Markets Architecture Call.

4. Frequently Asked Questions (FAQ)

How does the system enforce cut-off times (e.g., deposits after 2:00 PM start earning interest on T+1)?

Every incoming M-Pesa C2B or bank deposit is timestamped upon settlement. Deposits received before your configured daily cut-off (e.g., 14:00 EAT on business days) are allocated into settled_units for that night's yield run; deposits arriving after cut-off or on weekends are held in pending_value_date_units and automatically promoted into active earning units on the next business morning.

Can Independent Financial Advisors (IFAs) and sales agents track their AUM and trail commissions?

Yes. Each IFA receives a dedicated referral code and advisor portal showing their onboarded clients, total Assets Under Management (AUM), daily accrued trail commissions (e.g., 0.50% per annum accrued daily on active client balances), and monthly withholding-tax-adjusted commission statements.

Does the platform support WhatsApp and USSD investing alongside the web and mobile app?

Yes! Investors can check their live MMF balance, view yesterday's interest earned, trigger an M-Pesa STK Push top-up, or request an instant withdrawal via USSD, WhatsApp, or the responsive Web/Mobile Portal.

Architectural Continuity & Deep Dives

For related production architectures and system implementations, explore these companion guides:

Interactive PostgreSQL Memory & Tuning Calculator

// Real-Time Production Memory Allocator
PostgreSQL 14 / 15 / 16 / 17

Adjust your server resources below to calculate optimized postgresql.conf memory thresholds, autovacuum scale factors, and cost weights.

16 GB
2 GB 64 GB 256 GB
8 Cores
2 16 64
100
20 200 1,000
generated-postgresql.conf
INI
# Memory Allocations
shared_buffers = 4GB
work_mem = 40MB
maintenance_work_mem = 1GB
effective_cache_size = 12GB

# Concurrency & Background Workers
max_connections = 100
max_worker_processes = 8
max_parallel_workers_per_gather = 4
max_parallel_workers = 8

# Autovacuum Tuning (Prevent Bloat)
autovacuum_max_workers = 4
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02
autovacuum_vacuum_cost_limit = 1000

# Planner Cost Constants (NVMe SSD)
random_page_cost = 1.1
effective_io_concurrency = 200
Need hands-on database profiling? We analyze query execution plans, resolve lock trees, and eliminate replication lag.
Book Database Audit (30m)
// Production Systems Architecture • Database Diagnostic Audit

Diagnosing Production PostgreSQL Bloat, Lock Contention, or Replication Lag?

Theoretical tuning only goes so far. We provide hands-on architectural reviews of query execution plans, autovacuum parameters, connection pools, and read-replica lag for high-concurrency systems.

All Insights
Chat on WhatsApp