Case file / 0142
The problem
Rental Manager had grown into a broad property-operations platform: payments, leases, tenant screening, maintenance, inspections, owner reporting, and portfolio analytics. The original application had accumulated tightly coupled workflows, which meant a single transaction could trigger slow database work across multiple modules.
As portfolios grew, the payment and ledger path became the constraint. Peak processing latency affected the operational dashboard, and every release carried migration risk because the legacy UI and business rules were interdependent.
The architecture decision
We separated the transaction path from the rest of the application. PostgreSQL remained the system of record, while Kafka handled durable domain events and Redis absorbed short-lived reads that did not need to hit the primary database.
Decision record / ADR-017Preserve transactional consistency in PostgreSQL. Move downstream notifications, reporting updates, and non-blocking work to event consumers. Deploy services on Kubernetes with infrastructure defined in Terraform.
The migration plan used parallel data validation and gradual traffic shifting. The new and legacy paths ran side by side until reconciliation checks passed, allowing the production cutover to complete with 0 min downtime.
The build
The interface was rebuilt in React around the actual jobs property teams complete each day: collect rent, resolve maintenance, approve applications, reconcile owner accounts, and identify exceptions. The Node.js service layer enforced clearer domain boundaries and exposed stable contracts for the web and mobile clients.
Delivery ran in weekly increments. Each increment included a working vertical slice, automated regression coverage, performance budgets, and a migration checkpoint. The 6-person senior team owned architecture, application code, infrastructure, QA, and release coordination.
The results
The rewritten transaction path processed work 3× faster. Median processing latency fell by 67%, and the production migration completed with 0 downtime events.
The less visible result was operational: releases no longer required coordinated changes across the entire application. Teams could modify a workflow behind a stable service boundary, test it independently, and ship it without putting rent collection at risk.
