Project One Motors · 2026

A WhatsApp bot that knows when to stop talking.

100%of enquiries answered without a salesperson

A hand holding a phone with a WhatsApp conversation open, in a dark Dubai supercar showroom at night, city lights through the window behind.
Asked at 2am. Answered at 2am.

Role

  • automation
  • ai
  • product

Stack

  • TypeScript
  • Node.js
  • Claude
  • Cloudflare D1
  • pm2
The problem
Every enquiry landed on one WhatsApp number at any hour, in Arabic, Russian, Hindi or broken English, mixed in with people selling cars, people wanting jobs, and people wasting time. The sales team answered all of it by hand.
What I built
An assistant on the showroom's own number that answers from the live catalogue, works out who it's talking to, and hands the conversation to a salesperson the moment it should stop talking.
The result
55 conversations and 534 messages in four weeks, each one labelled by type and on the record instead of living in somebody's phone.

Almost every car enquiry in Dubai starts on WhatsApp. For Project One Motors that meant one number carrying everything: buyers at 2am, someone offering to sell a Cybertruck, a job applicant from Kuwait, and a steady trickle of people who were never going to buy anything. All of it in Arabic, Russian, Hindi and English, and all of it answered by hand whenever somebody got to it.

I'd already built this showroom a WhatsApp bot that sends car photos to the sales team. That one was easy in a way this one isn't: it only ever talks to salesmen. If it misreads a request, a colleague sends another message. This bot talks to the customer, in public, on the showroom's own number - and there, a wrong answer isn't an inconvenience, it's a liability.

So the interesting part of this build isn't the answering. It's knowing when to stop.

The rule about what it can never say doesn't live in the prompt. It runs in code, after the model, on every single reply.

The hard part is knowing when to shut up

Every turn produces one structured decision: what to say, in which language, what kind of enquiry this is, what was learned about the person, and whether a human is needed. Code enforces that decision rather than trusting it. The model proposes; it doesn't get the last word.

It answers only from the live catalogue, so it can't quote a car or a price that isn't in stock. It won't discuss the things a showroom doesn't discuss with a stranger over WhatsApp - a chassis number is the obvious one. And that rule doesn't live in the prompt, where a determined person could talk it loose. It runs as a check in code after the model has spoken, on every reply. If a reply trips it, the reply doesn't go out and a human gets the conversation instead.

Price negotiation, complaints, and anyone who asks for a human get one. That isn't a limitation, it's the point. A bot that negotiates on a car worth more than an apartment is a bad idea.

Escalating without giving sales a new tool

The obvious way to hand off is to dump the chat into a dashboard and hope someone opens it. Sales teams don't open dashboards.

Instead the question arrives in the salesperson's own WhatsApp, from the showroom's number, and they answer it there - the same way they'd answer a colleague. Nobody had to learn anything, install anything, or change how they work. That's most of why it survived contact with a real sales floor.

The answer doesn't go back as-is, though. A salesperson types shorthand, on a Saturday, between two other conversations. So the bot takes the substance and writes it out properly, in whatever language the customer has been using. The salesperson answers in their own words; the customer gets it in theirs. Then the bot picks the conversation back up.

It never talks over a human

Any salesperson can take a chat, and the bot goes silent for that customer immediately. That sounds trivial and it isn't: a model call takes a few seconds, which is easily long enough for a human to start typing. So it re-checks whether a person has arrived right before sending, and again before every scheduled follow-up. The failure it's designed around is two voices answering the same customer, which reads worse than a slow reply.

Quiet buyers get a small number of follow-ups, and only inside showroom hours. Nobody gets a message at 3am from a company they enquired with once.

Most of the work happened after it went live

The build was the short part. Real conversations surfaced things no specification would have predicted.

It replied in the wrong language when someone wrote broken English. It mirrored "brother" and "habibi" back at people. It answered a customer who'd just said "ok" with "noted, I'll follow up." It offered photos nobody had asked for. It asked about financing the showroom doesn't arrange. And its own links to car pages tripped the filter meant to catch chassis numbers, because a long ID in a URL looks exactly like one.

Each of those became a specific rule with a test behind it. It now works out that a +971 number means a UAE customer instead of asking. It stores a viewing time as an absolute Dubai date while still saying "tomorrow at 5pm" to the customer, because those are different jobs. It answers a closing "thanks" with silence, which is the correct answer. It doesn't argue with people trying to talk it out of its instructions. It transcribes voice notes so a voice message is handled like any other message.

None of that is clever. All of it is the difference between a demo and something you'd leave pointed at real customers.

The inbox the team actually opens

The bot writes every message to a CRM inside the showroom's existing site, so there was no second system to log into. It's a three-pane inbox: conversations on the left, the thread in the middle, the lead and the car on the right. Every message stores the original alongside an English translation, so a Russian conversation is readable by whoever is on shift. Sales users see only the leads for their own cars.

Tested before a customer ever saw it

I ran full scripted conversations against the real model and the real catalogue with the WhatsApp gateway faked and the CRM in memory, so it could be wrong repeatedly without messaging a single human being. Then it ran on the real number restricted to an allowlist, where I watched it handle supervised conversations before it was allowed near a customer.

In its first four weeks it handled 55 conversations and 534 messages, labelled them by type, and answered roughly one in five in Arabic or Russian. Every enquiry has a record now, which is the part the showroom actually notices. Before this, whether a 2am message was a real buyer depended on who happened to be awake.

Two ways on from here: the next case study - Developing a dealer-only luxury-car marketplace for the UAE, or the films.