The challenge: a growing portfolio, a flat operations team
A major Saudi real estate portfolio managing more than 40 properties and over 1,200 residential and commercial units across Riyadh had a leasing and maintenance operations team that hadn't grown in proportion to the portfolio. Tenant maintenance requests came in through phone calls, WhatsApp messages, and a basic web form, landing in three separate places that the operations team had to manually consolidate before anything got dispatched to a technician. Leasing inquiries followed a similar pattern: a prospective tenant's interest in a unit could sit unanswered for a day or more simply because the inquiry arrived after hours or during a period when the small leasing team was handling walk-throughs elsewhere.
The measurable pain point leadership brought to us was response time: the gap between a tenant submitting a maintenance request or leasing inquiry and someone from the property group actually responding. That gap was running into days for anything that didn't arrive during business hours through the preferred channel, which for a portfolio this size translated into a steady stream of tenant dissatisfaction and, on the leasing side, lost prospects who simply inquired elsewhere while waiting to hear back.
The approach: one intake pipeline across three channels
The core of the solution was collapsing three disconnected intake channels, phone, WhatsApp, and web form, into a single automated pipeline that treats a request the same way regardless of where it arrived. A custom LLM classifies and triages incoming requests: a maintenance issue gets categorized by urgency and trade type (electrical, plumbing, HVAC, general), a leasing inquiry gets matched against available unit inventory and routed toward scheduling, and anything ambiguous or high-stakes, a safety-related maintenance issue, a lease-dispute complaint, escalates directly to a human rather than being auto-processed.
Twilio handles the voice and WhatsApp intake layer, transcribing and routing phone calls and messages into the same pipeline the web form feeds, so the operations team works from one unified queue instead of three. Python orchestrates the workflow automation that connects triage output to actual dispatch: once a maintenance request is categorized, the system automatically identifies the appropriate contracted technician for that property and trade type, sends the request, and confirms scheduling with the tenant, all before a human touches the ticket, unless the issue was flagged for review.
Implementation: getting triage right before automating dispatch
The rollout was phased deliberately: the triage and classification layer went live first, running for several weeks with a human still making every dispatch decision, specifically so the operations team could verify the system's urgency and trade-type categorization matched their own judgment before any dispatch logic ran automatically. This surfaced a real gap early: the initial classification model underweighted certain maintenance descriptions that Arabic-speaking tenants phrase differently than the training data assumed, a wording pattern around water-related issues that wasn't being flagged as urgent as it should have been. That was corrected before automated dispatch went live, not after.
A constraint worked around during implementation was technician availability data, which didn't exist in structured form anywhere in the client's systems; contracted technicians' schedules lived in informal WhatsApp threads and phone calls with the operations coordinator. Rather than waiting for a formal technician-scheduling system to be built first, the pipeline was designed to work with a lightweight availability check built directly into the technician's own WhatsApp channel, keeping the rollout on schedule without forcing an unrelated systems change onto the client's contractor network.
Results: from days to minutes, at portfolio scale
Average response time across maintenance requests and leasing inquiries dropped by 76%, moving from a multi-day average for after-hours or off-channel requests down to a response window measured in minutes regardless of when or how the request arrived. That figure is measured as time-to-first-response, not time-to-resolution, since an electrical fault still takes a technician time to actually fix, but the tenant now knows within minutes that the request was received, categorized, and a technician is being dispatched, rather than wondering whether the request reached anyone at all.
The pipeline now runs across the full portfolio: more than 1,200 units across 40-plus properties, all fed through the same unified intake and triage system regardless of building or unit type. For an operations team that hadn't grown alongside the portfolio, the practical effect was the ability to keep managing an expanding number of properties without the response-time degradation that would otherwise have come with that growth.