Verified listings, M-Pesa rent collection, leases and eTIMS tax compliance: one platform for Kenyan landlords and agents.

400K+Rental units managed
KSh 900M+Rent tracked
2,000+Landlords & agents
60K+Invoices issued

Project Summary

  • Client: Pangoni
  • Industry: proptech
  • My role: Lead Engineer & Architect
  • Core tasks: Platform architecture, Web & mobile apps, Payments integration, Search & data pipelines

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

Frontend
  • Angular 21
  • TypeScript
  • PWA
  • AG Grid
  • ApexCharts
  • Google Maps
  • Leaflet
Mobile
  • Flutter
  • Dart
  • Riverpod
  • go_router
Backend
  • Cloud Functions (Node 22)
  • TypeScript
Data
  • Cloud Firestore
  • Algolia
  • Elasticsearch
Infrastructure
  • Firebase Hosting
  • Firebase Auth
  • Cloud Storage
  • FCM
Integrations
  • M-Pesa Daraja
  • KRA eTIMS
  • Gemini
  • WhatsApp
  • 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