RentFlow ties every M-Pesa Paybill settlement to the right unit, the right tenant, and the right invoice — automatically, including on weekends. Less spreadsheet archaeology, more collected rent.
Paybill statements in one tab. A rent roll in another. A WhatsApp thread from a caretaker in a third. Someone spends the first morning of every week deciding which "MPESA REF QF…" belongs to which tenant. RentFlow does that the moment money lands.
// Before — manual, batched, late Paybill statement → export.csv Rent roll → sheet (v7-FINAL) Match → human, on Monday // After — automatic, instant onSettlement(tx) => { const unit = resolve(tx.account); await apply(tx, unit.invoice); } // matched in 38ms · receipt sent · ledger updated
No modules you'll never open. The features below are the ones property managers use every single day.
Paybill settlements matched to units and invoices the instant they settle — partials, overpayments and prepayments included.
Trigger a payment prompt straight to a tenant's phone. They tap, you're paid, the ledger updates itself.
Every tenant gets a clean running balance, downloadable statement, and an automatic receipt on each payment.
Aged-debt views and scheduled nudges over SMS — polite on day one, firmer by day fourteen.
Net out management fees and disburse to landlords via B2C — with a statement they can actually follow.
Compliant invoices and exports that line up with KRA eTIMS — so your accountant stops emailing you.
Settlements land at all hours. RentFlow listens on the Daraja callback and reconciles in real time, so a Saturday-afternoon payment is matched before the tenant has closed the app.
app.post("/mpesa/callback", async (req) => { const tx = parse(req.body); const unit = await units.byAccount(tx.billRef); await ledger.apply({ unit, amount: tx.amount, ref: tx.receipt, }); await receipts.send(unit.tenant); }); // Sat 14:32 EAT — matched, receipted, done.
Free for your first 15 units. No card, no Paybill migration, no Monday.