
CleanHaus
Rental cleaners update jobs by text or voice, under the same login rules
CleanHaus cleaners report from the property, on their phones, in many languages. We made its AI assistant reachable by text, picture message and a live voice call, each signed in to the same account and role as the app.
Real Estate & HospitalityTurnover operations SaaSAI added to a live product
The challenge
Cleaners report from the field, often by text and in different languages, and existing tools needed app installs and heavy onboarding. The assistant could not be reached by text or voice.
What we did
Text and picture messages that sign in by phone number, a live voice call for cleaners that never hands their login to the voice service, and replies in each user's language, all on the app's own accounts.
The outcome
Texts and photos run on a production short code, cleaner voice calls went to a client trial, and CleanHaus reported its app and AI agent live.
- Status
- App and AI agent live, texts on a production short code
- Channels
- App chat, SMS and MMS, Slack and voice calls
- Voice
- Cleaners only, role checked on every call
- Languages
- Replies in each user's language, chat translated
The starting point
CleanHaus connects property owners, cleaner managers and cleaners around every short-term rental turnover. Cleaners work at the property itself and report updates, issues, photos and supplies from their phones, often by text, in different languages and time zones.
What had to change
Existing tools needed app installs and heavy onboarding and did not handle several languages, which the client named as a cause of delays and missed tasks. The assistant could not be reached by text or voice.
What could not break
- Every channel signs in to the same Cognito account the app uses
- A cleaner acts only on their own jobs, by text, by voice or in the app
- Text threads must know who is writing without the app
- A user's login never passes through the voice service
The calls we made
We treated each channel as another door into the same assistant, signed in to the same account with the same role, and built the doors inside CleanHaus's own backend and apps.
- 01
The phone number is the login
Cleaners text from their own phones, so SMS signs them in by phone number against their existing Cognito account and keeps a thread per person; the client tested phone-only sign-in before it replaced the first one-time code flow.
Ruled outAsking field staff to install and sign in to an app before they can report anything.
- 02
Photos land on the job
With MMS and a media webhook, a cleaner texts a photo and a few words about the house, and the assistant adds them to the right job as a note.
- 03
The voice service never sees the login
A new endpoint in CleanHaus's backend passes the caller's own login to the assistant, which checks the cleaner role, holds the login in a one-time record that expires in two minutes and returns a token for a single call room.
- 04
Realtime models for voice
Voice needed low latency, so calls run on OpenAI's realtime models through LiveKit, greet the cleaner by first name and reply briefly in the caller's language.
Ruled outSeparate speech-to-text and text-to-speech steps, the voice plan in the first scope.
- 05
Every user's own language
The assistant replies in each user's language and translates property chat, so a cleaner and a host can work the same turnover in different languages.
How the system fits together
What we built
SMS and MMS channel
Twilio text and picture messages with phone-based sign-in, a thread per person, a media webhook that turns photos into job notes and a production short code.
Cleaner voice calls
A call button for cleaners only, a realtime agent on LiveKit with gpt-realtime-mini that greets by first name and replies briefly in the caller's language, a live transcript with tool cards, and a call that stays up while the cleaner opens a job or the calendar.
Replies in each user's language
The assistant answers in the user's language on every channel and translates property chat for the people in it.
Slack with linked identity
The same assistant answers in Slack through Socket Mode, with each Slack identity linked to the user's account so role rules still apply.
How it works
Reach
A cleaner texts the assistant's short code, chats in the app or taps the call button, whichever is at hand.
Recognize
The assistant matches the phone number or login to the cleaner's account and checks their role.
Understand
It reads the text, photo or speech in the cleaner's language and finds the property and job they mean.
Update
It updates the job or adds the note through CleanHaus's own API and confirms in the same channel.
What changed
Text and picture messages run on a production short code under the same identity and role rules as the app, and cleaner voice calls went to a client trial. CleanHaus reported its app and AI agent live and credited our team.
“CleanHaus has been moving quickly to deploy our app and Broomy AI Agent with the key assistance of the Datics team. We couldn't have reached this point without your excellent bench of developers.”
Under the hood
- Datics role
- AI added to a live product
- Messaging
- Twilio SMS, MMS and a production short code, Stream Chat channels in the apps, and Slack through Socket Mode with identity linking.
- Voice
- LiveKit with gpt-realtime-mini for cleaner calls, after a first realtime session on the OpenAI Realtime API over WebRTC; calls end after ten minutes or a minute of silence.
- Identity
- Amazon Cognito for app, phone and voice sessions, phone-based sign-in for SMS, a one-time login record for each voice call and a fresh role check on every call.
AI and models
Cloud and infrastructure
Apps and APIs
Also in the stack
How it shipped
SMS and in-app voice
The first iterations added a Twilio SMS endpoint with Cognito sign-in and a realtime voice session on the OpenAI Realtime API over WebRTC.
Photos, phone-only sign-in, production
MMS with a media webhook, phone-only sign-in tested by the client, then a production short code with the open login APIs secured.
Languages and Slack
Replies in each user's language and property chat translation came first, then Slack through Socket Mode as the product went live.
Cleaner voice calls
Voice calls for cleaners moved to LiveKit with a session endpoint in the client's backend, a voice picker, a live transcript and a tuning panel for the client's trial.
Both sides of the client's stack
The voice session endpoint went into CleanHaus's own backend as a Lambda with tests, and the call panel into its own web app, so the channels run on the product the client already operates.
Client testing before production
The client tested phone-only sign-in before it reached production and trialed cleaner voice calls with a voice tuning panel.
Same accounts, every channel
Each channel was built against the backend and Cognito login the product already used, so no new account system ever reached the field.
What this unlocked
Next, each environment gets its own voice setup so calls can be tested before production, and voice reaches hosts as well as cleaners.
Related work
Have a product with the same kind of constraints?
Tell us what already exists and what you want it to do. We will tell you what it takes.
