All posts Looking back, written after closing the timeout and alerting tickets in early September. Project · MitJulia (formerly Friseurtelefon) · interactive demo below

Eight months at MitJulia: what you learn when an AI answers the phone for hair salons

Since January I've been working on Julia, the AI receptionist by MitJulia (formerly Friseurtelefon). A progress report with numbers.

56 crashed calls in 90 days. That number opened a ticket last week, and it sums up this job pretty well.

Since January 7 I’ve been a freelance developer for MitJulia, formerly Friseurtelefon. Remote, next to my studies, in a small team. The product is Julia, an AI receptionist for hair and beauty salons. She picks up the phone, figures out what the caller wants, suggests slots and books, moves or cancels appointments directly in the salon’s booking system. And she says that she’s an AI. In August more than 70 salons were live.

Here’s how a call works, and the demo on this page shows the same thing with sample data. Twilio picks up the call and hands it to a voice agent at ElevenLabs, one per salon. The agent listens, and whenever it needs to know or do something, it calls a tool: look up the customer, fetch free slots, price and duration of a service, book or cancel an appointment. Every tool is an AWS Lambda function. It talks to the salon’s booking system through a driver, and because every provider works differently, every driver has the same 13 methods. Afterwards the salon’s dashboard shows the appointment in the calendar and the call in the log.

Live call

Sat 7:42 pm · outside opening hours

Sophie Regular client · recognised 01:12

Julia is listening

Init webhook · client recognised: Sophie

Hi Sophie, this is Julia, the digital receptionist at Sample Salon. How can I help?

Hi! I need an appointment next week, ideally Tuesday after work.

Sure. Wash, cut and blow-dry with Mia again?

Yes, exactly.

get-appointment-availabilities · Tue · Mia → 2 slots

On Tuesday Mia is free at 17:30 or at 18:30. Which suits you better?

18:30 is perfect.

create-booking → appointment-booked

Done. Your appointment is on Tuesday at 18:30 with Mia. See you then!

Thanks, bye!

Last 7 days

Revenue

TotalOutside opening hours 2,846 € 612 €

Bookings

TotalOutside opening hours 47 11

Calls

TotalOutside opening hours 1299Σ 2:41h · Ø 75s 31

Booking system · Tuesday

Julia books straight into the salon’s own booking system.

MiaJana 16:0016:3017:0017:3018:0018:3019:0019:30 ColourCutCutHighlightsColourUpdo

Calls

DateTimeDurationNameCall reasonCall resultBooked revenue
Sat17:580:48Paul Change Appointment moved–
Sat16:121:31Emma Transfer Transferred–
Sat14:400:36Unknown Price Information given–
Demo with sample data
Interactive demo A call with Julia next to the salon dashboard, with sample data. While Julia offers times, pick a free slot yourself.

I started with testing. I rebuilt a simulator where one language model plays the caller and a second one grades the conversation: correct, complete, right tools used, natural. I also split the existing 67 test cases into 267 small tests that don’t overlap.

Over the summer Belbo came in as another booking system. I wrote a driver with the full 13-method interface, around 9,150 lines, 2,497 tests green. At the same time a colleague built his own Belbo integration, which went live. In the end I merged the two lines. Not elegant, but that’s life in a small team. Along the way we got a data contract with eight rules that every booking driver has to meet. Belbo broke three of them.

Now, the 56 crashes. When a booking system didn’t answer, our code waited until the 30-second Lambda limit and then died. For someone on the phone, that means silence. Now there’s a 12-second budget, and after that a clean error Julia can actually tell the caller about. Plus a CloudWatch alarm, after a provider went down for 68 minutes on August 18 and we only noticed the next morning.

My rule for all of this: when in doubt, let it through. The new filter for incoming calls blocks known numbers, but on any error the call goes through. Better one spam call too many than a customer who can’t get through.

One more habit. Every topic gets an issue, a branch and a folder with evidence. I work fast and tend to document late. This way nobody has to reconstruct where I left off.

What I’ve learned in these months, and with what. You don’t test a voice agent like a function. You need simulated callers, a model that grades, and test cases that don’t overlap, or a red test won’t tell you what’s actually broken. Third-party APIs get a contract you can run before you believe them. Every call to the outside needs a time budget. And before a change I check which salons it actually affects instead of guessing.

Tools: TypeScript with bun and Turbo in a monorepo, Vitest, AWS Lambda with SAM, API Gateway, DynamoDB, S3 and CloudWatch, Twilio and ElevenLabs for telephony, React 19 and Express 5 for the simulator, Linear for issues, and Claude Code while building.