Verified listings, M-Pesa rent collection, leases and eTIMS tax compliance: one platform for Kenyan landlords and agents.
Project Summary
- Client: Pangoni
- Industry: proptech
- My role: Lead Engineer & Architect
- Core tasks: Platform architecture, Web & mobile apps, Payments integration, Search & data pipelines
- Appointed date: Jan 2021
- Completion: Ongoing
- Website: pangoni.io pangoni.io
Renting in Kenya runs on spreadsheets, WhatsApp threads and M-Pesa messages. Listings are scattered across a dozen sites, many of them stale or fake, and landlords reconcile rent by hand. Pangoni set out to fix both sides of the market: listings that seekers can trust, and a single system for landlords and agents to run their portfolios.
The problem
- Unreliable listings. The same unit appears on many sites at different prices, often long after it has been let.
- Manual rent collection. Paybill payments get matched to tenants by eye, receipts live on paper and arrears in notebooks.
- Compliance overhead. Invoicing, KRA tax filings and accounting exports happen separately, after the fact.
What I built
I designed and built the platform end to end, across web, mobile and backend:
- Landlord & agent hub. An Angular PWA for properties, units, tenants, leases, invoices, payments, maintenance, viewings and CRM, with analytics dashboards and role-based access.
- M-Pesa rent collection. Daraja STK Push plus Paybill/Till reconciliation that matches payments to invoices automatically and issues digital receipts.
- Tenant apps. Flutter apps so tenants can pay rent, see statements and raise maintenance requests from their phones.
- Verified listings pipeline. Listings from the major Kenyan property portals and social media are de-duplicated, location-matched, expired and verified before they go live.
- Natural-language search. Gemini turns queries like "2-bedroom in Kilimani under 80k with parking" into structured filters that run on Algolia.
- Tax & accounting. KRA eTIMS e-invoicing, plus exports to QuickBooks, Xero, Sage, Zoho, Google Sheets and Tally.
Under the hood
The backend is serverless Firebase: roughly 400 TypeScript Cloud Functions across 30+ business domains, Firestore with security rules that are covered by tests, and separate production and UAT environments. Rent escalations post to an append-only ledger inside transactions, so every tenant's history stays auditable. WhatsApp and email notifications, PDF and Word document generation, and a public API complete the platform.
The result
Pangoni is in production and growing. According to pangoni.io, landlords and agents use it to manage 400,000+ rental units, and it has tracked over KSh 900 million in rent across 60,000+ invoices.
Tech stack
- Angular 21
- TypeScript
- PWA
- AG Grid
- ApexCharts
- Google Maps
- Leaflet
- Flutter
- Dart
- Riverpod
- go_router
- Cloud Functions (Node 22)
- TypeScript
- Cloud Firestore
- Algolia
- Elasticsearch
- Firebase Hosting
- Firebase Auth
- Cloud Storage
- FCM
- M-Pesa Daraja
- KRA eTIMS
- Gemini
- Resend
What I did
- Designed the platform architecture and data model across web, mobile and backend
- Built the Angular hub, the Flutter tenant apps and the Cloud Functions backend
- Integrated M-Pesa Daraja, KRA eTIMS and accounting exports
- Built the listing ingestion, de-duplication and verification pipeline
- Set up production and UAT environments, security rules and rules tests
Key decisions
- A serverless Firebase backend, to keep operations lean while growing to hundreds of functions
- Separate production and UAT projects, with UAT access gated by custom claims
- LLM-parsed queries on top of Algolia rather than a custom search stack
- An append-only rent ledger with transactional escalations, for auditability
Challenges
- Matching M-Pesa payments to the right tenant and invoice when references are free text
- De-duplicating one unit listed across many sites with different photos, prices and spellings
- Keeping ~400 functions maintainable with shared types and per-domain modules
- Meeting KRA eTIMS e-invoicing requirements
- Serving landlords who live in WhatsApp and M-Pesa, not dashboards
Learnings
- Meet users where they already are: M-Pesa and WhatsApp first, dashboards second
- Invest early in a UAT environment and rules tests; they pay off at scale
Have a similar problem to solve? Let's talk.
Start a conversation