All work

An ops bot that suggests the right team for every booking

AI & Automation, 3 min read

For every booking without a team
3 picks
The problem
Every new booking needs a team, and picking the right one means checking our team rankings, drive times, past complaints and who's free that day. The office did that by hand, booking by booking.
My role
I designed the bot and built it in n8n with the Claude API. It reads our booking software and our KPI sheet and works with the office in Slack.
Result
Every booking without a team gets three suggested teams in Slack within about 10 minutes. The office also gets a daily check-in list, a 4pm list of tomorrow's uncovered jobs and a weekly list of at-risk customers.

Skills Automation (n8n), AI agents, process design

Context

MaidThis sends jobs to about 15 contracted cleaning teams at a time. Which team goes to which booking is the decision that matters most. The wrong team can mean a late arrival, a long drive or a customer we lose. My business manager and I run the business remotely, so we can’t see any of this in person.

What it does

  • Suggests teams. Every 10 minutes during the day it looks for bookings with no team. It ranks teams by our team rankings, the real drive time from where each team lives, the job each team has before it, and the customer’s history. A team a customer complained about doesn’t get suggested for that customer again unless I say it’s fine. It posts the top three picks in Slack, and a person still assigns the team.
  • Plain-English rules. Our rules live in a sheet written in plain English, and Claude applies them to the ranked list. It can reorder or drop teams but never add one. Anyone can change a rule from Slack by starting a message with “bot:”, and every change is logged so it can be undone.
  • Answers questions. The office can ask it in Slack who can take a job, and it answers in the thread from the same data.
  • Tomorrow check. At 4pm Phoenix time it posts tomorrow’s jobs that still have no team.
  • Customer check-ins. Each day it posts the calls and texts to make from yesterday’s cleans: a call after a customer’s first clean, a text after the second, a thank-you call after the third, and a text when a recurring customer gets a new team. The office replies “done” in the thread, and the bot follows up at 4pm and 5pm on anything still open.
  • At-risk customers. Every Wednesday it scores our active recurring customers red, yellow or green. The points follow the real reasons we’ve lost customers since 2024, so a recent quality complaint counts the most. The flagged customers go to the office to call.
  • Tracking. It records which team was actually assigned and whether it was one of its picks, so I can see how often the suggestions get used.

Drive times come from free services (the US Census geocoder and OSRM road routing). If either one is down, it falls back to straight-line distance.

What broke and how I fixed it

  • The bot runs on n8n on my laptop. In November its schedule stopped for three days with no error while my other workflows kept running. A restart fixed it, and I added a hook that restarts n8n every time my Mac wakes up.
  • A booking that lost its team during a quick edit used to set off a false alarm. Now the bot waits one more check, about 10 minutes, before posting a booking that had a team and lost it.
  • Our Airbnb turnovers live in Operto, which the bot can’t read yet. They get added to the tomorrow check once Operto turns on API access.

What’s next

  • Read Operto directly, so Airbnb and commercial jobs get the same suggestions and checks.
  • Text teams automatically when they’re running late.
  • Move n8n to an always-on computer so nothing depends on my laptop being open.