• 6 min read

Replacing a real estate booking form with an AI voice agent

Table of Contents

During my internship at MorpheLabs, I worked on a real estate platform whose viewing bookings all went through a contact form. Someone interested in a property would fill it out, and a staff member would follow up manually to confirm a time, check it against everyone else’s schedule, and get it onto the calendar.

That’s fine at a handful of bookings a week. It stops being fine once viewings overlap, staff are slow to respond, or a form submission just sits unread. The bottleneck wasn’t interest in the properties. It was everything that had to happen between someone expressing interest and a viewing actually landing on a calendar without conflicting with another one.

My job was to remove that bottleneck: let people book, reschedule, or cancel a viewing by talking to an AI voice agent, and have the entire scheduling workflow behind it run automatically, correctly, and without double-booking anyone.

Why a form was the wrong interface for this

A form works when the person filling it out already knows exactly what they want: this property, this date, this time. That’s often not true here. Someone browsing listings is usually still deciding, and what they actually want to ask is closer to “what’s available this weekend for the unit on the corner” than a fixed date and time they can type into a field.

That’s a conversation, not a form submission. A voice agent can hold that conversation: take a loosely specified request, ask for whatever’s missing, and land on a concrete booking, without making the visitor do the work of first figuring out the exact slot they want.

But a conversational front end only solves half the problem. The interesting part is what has to be true after the agent hangs up: the booking has to be checked against every other booking for that property, written down correctly, reflected on a calendar, confirmed to the right person, and followed up before the appointment. Get any of that wrong and you’ve just replaced a slow manual process with a fast automated way of double-booking someone.

What I built

A preview of the website

The voice agent itself doesn’t touch the booking data directly. It only handles the conversation: figuring out whether someone wants to schedule, reschedule, or cancel, and pulling out the property, date, and time from however they phrase it. Once it has that, it hands off a structured request to an automation layer built in n8n, which is where the actual scheduling logic lives.

Turning a request into a confirmed booking

A diagram of the scheduling workflow

The first workflow receives the agent’s request, validates the data, and routes it by intent.

For a new booking, it checks the requested date against existing bookings for that property before writing anything. If the slot is already taken, it computes the nearest open slots and sends those back instead of just failing the request, so the agent can offer alternatives in the same conversation rather than asking the person to call again. If the slot is free, it creates the booking, creates a matching calendar event, and sends a confirmation.

Rescheduling and cancellation go through the same shape: look up the existing booking, re-check availability if the time is changing, update or remove the calendar event, and confirm the change. Cancelling a booking marks it as cancelled rather than deleting the record, so there’s still a trail of what was booked and when it was cancelled.

Reminding people before they forget

A diagram of the reminder workflow

The second workflow runs on a schedule, checking every 15 minutes for bookings coming up in roughly three hours that haven’t been reminded yet, and sends a reminder for each one. Once it sends a reminder, it flags the booking so the same one never goes out twice.

Neither workflow depends on the voice agent staying involved after the initial request. Once a booking exists, the reminder flow picks it up entirely on its own.

What this changed

Booking a viewing no longer depends on a staff member being available to read a form and manually check a calendar. The conflict check that used to happen in someone’s head, cross-referencing a request against everyone else’s bookings, now happens before a slot is even offered back to the visitor, so a booking that gets confirmed is a booking that’s actually free.

It also meant fewer no-shows: reminders go out automatically on a fixed window before every viewing instead of depending on someone remembering to send them.

What I learned

The hard part of this project was never getting the voice agent to sound natural or understand what someone was asking for. Conversational AI is good at that out of the box.

The hard part was treating the agent as an input to a workflow rather than the workflow itself. Once the agent decides what someone wants, that decision has to survive a conflict check, a calendar sync, and a notification without silently producing a bad outcome. I ended up spending most of my time on the boring parts: validation, availability checks, and making sure every branch, schedule, reschedule, cancel, confirmed the same way it wrote.

That’s the part that doesn’t show up when you demo the voice agent, but it’s the part that decides whether the automation is actually trustworthy enough to replace a human doing the same job manually.