The brief was simple: 'we spend three days every month pulling rent collection numbers from WhatsApp screenshots, M-Pesa SMS, and a Google Sheet.' The fix wasn't another dashboard — it was a pipeline.
We built a small ingestion layer that accepts photos, PDFs and SMS forwards, runs them through a vision LLM with a strict JSON schema, and writes structured rows to Postgres. A reconciliation step matches against expected rent rolls and flags variances.
The result: a 12-minute close, with an audit trail the auditor actually likes. Here's how we'd build it again.