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.

A design decision worth calling out
Urgency detection is rule-anchored, not purely model-judged. The model extracts evidence (standing water, gas smell, no heat, no power), and a small, reviewed rule set decides what counts as an emergency. That makes emergency escalation predictable, testable, and easy for the client's support team to explain to customers.

Challenges and tradeoffs

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.