Commercial property — tenant maintenance SLA engine
A portfolio of office and retail buildings — dozens of tenants, multiple property managers, a contractor roster that changed by trade and borough. On paper every tenant had a lease; in practice, maintenance ran on whoever answered the phone fastest.
Requests came in everywhere: tenant emails, WhatsApp voice notes to the building supervisor, front-desk scraps, calls straight to contractors who'd worked the building before. The same AC fault could get reported three times through three channels before anyone treated it as one incident.
Leases didn't help. HVAC response times differed from plumbing; common-area issues followed another clock; some retail tenants had after-hours clauses, office tenants didn't. PMs kept PDF lease extracts in personal folders and guessed at obligations under pressure. Breaches surfaced when tenants threatened to withhold rent — not when the clock actually started.
Contractors often showed up blind: no fault history, no prior ticket on the unit, no record of the part replaced six weeks ago on the same floor. Repeat callouts were common, and so were disputes over who was responsible — landlord, tenant fit-out, or shared services.
They didn't need a tenant-facing app tenants wouldn't use. They needed intake that respected lease terms, stopped duplicate chaos, and gave PMs a live picture of what was breaching, what was about to breach, and what kept breaking in the same units.
We built a maintenance SLA engine that sat between tenant intake and contractor dispatch — lease-aware, channel-agnostic, and tied to unit history.
Requests were normalized from email, WhatsApp, web forms, and front-desk entry into one ticket structure — building, unit, category, urgency, tenant contact. Voice notes and messy messages were parsed into structured fields with a human confirm step when confidence was low. Duplicate detection ran against open tickets on the same unit and category, so three reports of one leak became a single incident with a timeline, not three dispatches.
Each unit was linked to active lease terms. When a ticket landed, the engine pulled the relevant obligation — response window, resolution target, after-hours rules, landlord vs. tenant flags — and stamped a countdown. A retail HVAC item with a 4-hour clause got a different clock than a next-business-day office plumbing job. Where leases said "reasonable time," PMs set building-level fallback rules once instead of re-debating every ticket.
Tickets sorted by time remaining, repeat-fault weighting, and tenant tier. Approaching breach escalated to the assigned PM; breached tickets surfaced on a dedicated view with elapsed time and a blocker reason — contractor acceptance, access denied, parts delay, responsibility dispute.
On dispatch, contractors received an auto-built brief: unit history, prior tickets on the asset, current photos and notes, access instructions, and a lease-responsibility summary — pushed through the channel they already answered, not a portal they'd never open.
Property managers got a building-level operations view: live SLA breaches with age and owner, mean time to first action by building and trade, repeat-ticket rate by unit, contractor response lag, a responsibility-dispute queue, and upcoming lease-driven risk. Every view answered a decision — reassign, call the tenant, escalate to legal, or flag a building-systems problem worth capex review.
| Metric | Before | After |
|---|---|---|
| Maintenance SLA breach rate (response window) | 23% | 7% |
| Median time to first action (urgent) | 5.8 hrs | 1.6 hrs |
| Duplicate dispatches on same incident | ~31% | 6% |
| Repeat ticket rate (same unit, 90 days) | 19% | 9% |
| Contractor callbacks for missing context | 4.2 / job | 1.1 / job |
| Rent-dispute escalations tied to maintenance | 14 / qtr | 3 / qtr |
| PM hours on manual chasing & status | ~22 hrs/wk | ~6 hrs/wk |
Complaints about silence dropped sharply — PMs started seeing breaches hours before the clock ran out instead of learning about them from angry emails. The repeat-fault view even caught a cooling-tower issue across one retail floor that had been treated as isolated tenant problems for months: one capex conversation replaced a dozen band-aid callouts.
Lease data wasn't as clean as the portfolio spreadsheet suggested. Early tickets pulled wrong SLA windows — an old revision still indexed, or a renewed term not linked to the unit. Two retail tenants got incorrect breach alerts before we added lease effective-date validation and a manual override log.
WhatsApp voice notes were harder than expected. Background noise in mall units and fast, mixed-language speech misfired on unit numbers and trade categories. We added a 30-second confirm screen for front-desk staff before the SLA clock formally started — slightly slower, much more accurate.
Contractors ignored the digital brief at first. Several still called the supervisor: "just tell me what's wrong." Uptake improved when we moved the critical info — unit, access code, fault summary — into the SMS job-acceptance message they already reacted to.
Building supervisors bypassed the system under pressure. When an anchor tenant called directly, supervisors dispatched their usual plumber and logged nothing. Rather than block informal relationships, we added a fast "retroactive log" path on mobile so capture happened even when the call came in hot.
"Reasonable time" clauses created arguments, not automation wins. The engine couldn't resolve ambiguous language, and disputed tickets piled up. We narrowed auto-SLA assignment to explicit time-bound clauses and routed ambiguous items to a human triage bucket with a 2-hour internal target.
Duplicate detection was too aggressive on common-area tickets. A water leak reported by three tenants got merged with a separate bathroom issue nearby because building and trade matched. We tightened merge rules to require a unit match or explicit common-area tagging.
- SLA automation starts with lease truth, not ticket volume. Get unit-to-lease linkage right before you automate countdowns.
- Intake normalization beats asking tenants to use a portal. Meet the request at the channel they already use — email, WhatsApp, the front desk — and structure it on the back end.
- Contractors are users too, but on their terms. A perfect brief in a portal they'll never open is useless; push minimum viable context through SMS or a phone summary.
- Repeat-fault tracking is a capex signal, not a helpdesk metric. A unit throwing HVAC tickets every six weeks gives PMs leverage in landlord decisions, not just faster closes.
- Ambiguous lease language needs a human lane. Automation handles explicit obligations well; "reasonable endeavours" needs a triage rule, not a fake precision timer.
- Capture informal workflows or they'll undermine the system. Supervisors will always take a direct call from a big tenant — design for retroactive logging instead of pretending the bypass won't happen.