Engineering write-ups from the team behind CashTrace and Rentisha: M-Pesa reconciliation, KRA eTIMS filing, WhatsApp support in three languages, and what it takes to keep it all running on Google Cloud Run.
Kenyan SMEs get paid on M-Pesa first and by bank transfer second, and neither arrives with an invoice number attached. How CashTrace narrows a payment to a single open invoice, and where it still hands the decision back to a human.
Transmitting an invoice to eTIMS at the moment it is issued changes the failure modes. Notes on the device handshake, retry queues for when the gateway is unavailable, and keeping an append-only audit record per invoice.
Chasing rent in Kenya is a legal sequence, not a nudge. How Rentisha's escalation is worded, how far apart the steps sit, and what has to be logged for a landlord to rely on it months later.
Support conversations arrive as a mix of English, Swahili and Sheng, often switching inside one sentence. What that does to intent classification, and how we evaluate a classifier when the training data code-switches.
Standalone output, cold starts, and the cost lines that actually move. What we changed after the first month of bills, and the regional choices that mattered more than we expected.
Our security page lists controls we can point at in the codebase, plus a section for gaps we have not closed yet. An argument for why the second list is the more useful one to publish.
Handling tenant data under the Kenya Data Protection Act 2019: consent captured at onboarding, purpose limitation in practice, and the message frequency caps that keep automated follow-up from turning into harassment.
We are bootstrapped, so consulting revenue funds the product roadmap. What we take on, what we turn down, and how we keep engagements from quietly becoming the whole business.
Postgres, Cloud Run, and a deliberately short list of managed services. The reasoning behind each choice, and the places where it would not survive ten times the load.