The problem
The client sells property management software used by residential landlords to manage tens of thousands of units. Tenants submit maintenance requests as free text and photos: "water under the sink," "heater making a noise," sometimes a single blurry photo. Property managers had to read each one, decide the category and urgency, and pick a vendor. Requests sat unread overnight and on weekends, urgent ones such as active leaks got buried, and vendors often arrived without the right parts because the request was vague. The platform was ten years old, profitable, and not something anyone wanted to rewrite.
What we actually did
A separate service, not a rewrite
We built triage as an independent service that subscribes to the platform's existing "request created" event. It reads the request text and photos, then writes its results back through the platform's existing public API as structured fields the product already supported: category, urgency, and internal notes. The core application's database schema did not change at all, which kept the client's release process and risk profile the same.
What the triage actually produces
For each request, a multimodal model classifies the trade (plumbing, electrical, HVAC, appliance, and so on) and estimates urgency against an explicit list of emergency indicators, such as active water, a gas smell, or no heat in winter. When the request is vague, it drafts two or three clarifying questions for the tenant, and it suggests likely parts for the vendor. Emergency indicators trigger an immediate alert to the on-call manager regardless of the time of day.
Rolled out behind feature flags
Each property management customer was enabled individually. In the first phase, triage only suggested values that staff confirmed; we compared its suggestions against staff decisions on several thousand requests before turning on automatic categorization for customers who opted in.
Challenges and tradeoffs
- Tenant privacy. Photos can include people or personal items. The triage service processes images without storing them, and results never leave the client's own cloud account.
- Latency budget. Tenants expect an instant confirmation. The request is accepted immediately as before, and triage results appear within seconds, so the existing flow never waits on the model.
- Multiple languages. A meaningful share of requests are not in English. The model handles them directly, and staff see a translated summary alongside the original text.
Results
For customers using automatic triage, median time from request submitted to vendor dispatched fell by 3.4 times, largely because requests no longer waited for someone to read them. Category suggestions matched staff labels 93% of the time. Because vendors arrive with better information and suggested parts, repeat visits for the same issue dropped 18%, which property managers noticed directly in their vendor invoices.
What we'd do differently
We would ship the tenant clarifying-question feature first. It improved request quality for every downstream step, including human triage, and it would have produced better training signal for the rest of the system earlier.