Building an AI Property Maintenance Coordinator

25 August 2026

I wanted to build an AI system that does more than reply to messages.

The idea was simple. A tenant reports a maintenance problem through WhatsApp, and the system handles as much of the coordination as possible.

Something like:

Water is pouring through my kitchen ceiling.

That sounds like one message. But for a property manager, it can turn into a lot of work.

You need to understand the issue, figure out how urgent it is, ask for missing information, find the right contractor, check availability, contact them, deal with rejection, check the quote, update the tenant, and sometimes involve a manager.

So I built a small property operations coordinator around that flow.

How I Built It

I used:

  • WhatsApp for communication

  • n8n for the workflow

  • OpenAI for understanding and decision-making

  • Airtable for customers, contractors, maintenance requests, and work orders

At first, it was tempting to make one big AI agent and let it handle everything.

But a lot of the work does not need AI.

Checking whether a contractor works in the right area is just a rule.

Checking whether they are available is a rule.

Checking if a $175 quote is below a $200 approval limit is also a rule.

AI becomes useful when the information is messy.

For example:

I can probably make it in around 40 minutes. Would be about $175.

From that, the system needs to understand that the contractor accepted, the ETA is 40 minutes, and the price is $175.

So I ended up using AI only where interpretation was useful, and normal logic everywhere else. That separation became one of the most important parts of the system.

The Tenant Flow

When a tenant sends a message, I first identify them from Airtable.

Then the AI looks at the problem and extracts things like:

  • What happened

  • How severe it is

  • What type of contractor is needed

  • Whether there are any safety concerns

  • Whether more information is needed

If something is missing, the AI asks one follow-up question.

This introduced one of the more interesting problems in the project.

What happens after the workflow asks a question?

It ends.

The tenant might reply five minutes later, and that reply comes in as a completely new workflow execution.

So the system needed memory.

Making the Workflow Remember

Before asking the tenant anything, I save the maintenance request in Airtable.

I store the problem, the AI assessment, previous messages, the last question, and the current status.

Then I mark it as Awaiting Tenant and let the workflow end.

When the tenant replies later, I look for an open request from that person.

If one exists, I load the previous conversation and continue from where the system stopped.

That changed the whole workflow.

Instead of thinking about one long-running AI agent, I started thinking about a case that can stop, wait, and resume whenever something happens.

Finding a Contractor

Once I have enough information, I move into contractor selection.

I do not send every contractor to the AI.

First, I filter them using normal rules:

  • Correct trade

  • Service area

  • Availability

  • Insurance

  • Emergency availability

  • Rating

  • Response time

Then the AI ranks the remaining options based on the actual situation.

For an emergency leak, for example, someone who can arrive quickly probably matters more than saving a small amount of money.

This also keeps the AI focused on the part where judgment is actually useful.

What Happens When Someone Says No?

This was one of the parts I liked most.

The system contacts the first contractor.

They might reply:

Can't make it today.

The AI reads that as a rejection.

Then the workflow automatically moves to the next contractor and sends them the same job.

Maybe the second contractor replies:

I can be there in 40 minutes, $175.

The AI extracts the ETA and quote.

Now the workflow checks the customer's approval limit.

If the limit is $200, the $175 quote can be accepted automatically.

The tenant gets the contractor details and ETA, while Airtable updates the request and work order behind the scenes.

I Still Keep Humans in the Loop

I do not think systems like this should try to remove humans completely.

If the contractor quotes $350 and the customer's approval limit is $200, the AI should not randomly decide that spending the extra money sounds reasonable.

It escalates the case to the property manager.

The same happens if no suitable contractor is available, everyone rejects the job, or the situation is too uncertain.

So the goal is not:

AI handles everything.

It is closer to:

The system handles the normal path. Humans handle exceptions.

Where I Want to Take It Next

There are still a few obvious things missing.

The biggest one is images.

If a tenant sends a photo of the leak, I want the workflow to download it and let a vision model add its findings to the maintenance request.

I also want contractor timeouts.

Right now, fallback works when someone explicitly says no.

But if they simply do not reply for ten minutes, the system should automatically move to the next person.

Manager approval could work the same way.

If the manager replies:

Approved.

The workflow should find the pending case and continue automatically.

From there, the same system could eventually track arrival, job completion, invoices, tenant confirmation, and case closure.

Takeaway

The biggest thing I understood while building this is that an AI workflow does not have to be one giant agent.

Most business processes already have rules.

Use those rules.

Then use AI for the parts where people normally have to read something, understand it, or make a judgment.

The other important part is state.

Real work does not happen in one prompt. People reply later. Contractors reject jobs. Managers need to approve things.

So the system needs to be able to stop and continue.

Once I started designing around that, it felt much less like building a chatbot and much more like building an actual operations system.