Ring +44 7455 702608. An AI answers, and a few seconds later it texts you back and tries to book you in.
It's a receptionist I built for UK plumbing firms in two weeks. £424.86 all in, no funding, barely any code.
It's a real company now. Incorporated, insured, Stripe live.
Here's the whole build, every pound spent and every bug found. 🧵
Tuesday I shared the three bugs a merchant found before launch. Here's the one I didn't see coming.
Launch day, someone outside the UK rang the demo line. One unhandled foreign number tripped an error and the whole missed-call flow quietly stopped. No crash, no alert. Just off, until I noticed.
Screenshot attached: the actual email that told me.
Fixes: per-module error handlers so one odd call can't stop the scenario, and it only answers UK numbers now, since it serves UK trades.
The lesson still rewiring my head: it failed silently, and silent is the worst possible failure mode for a tool whose whole job is catching what people miss.
Question for anyone running automations in production: how do you find out the moment a scenario dies? Polling feels dumb. What's your setup?
Full post-mortem is on my timeline if you want the gory version.
Ring +44 7455 702608. An AI answers, and a few seconds later it texts you back and tries to book you in.
It's a receptionist I built for UK plumbing firms in two weeks. £424.86 all in, no funding, barely any code.
It's a real company now. Incorporated, insured, Stripe live.
Here's the whole build, every pound spent and every bug found. 🧵
An ex-developer broke my AI receptionist in four texts.
Then on launch day, one foreign phone number quietly switched the whole thing off while the demo line was public.
I promised the post-mortem on Tuesday. It's Friday. Here it is. 🧵
So, harder to break than it was on Tuesday. That's the honest state.
Want to help? Do what the merchant did, or what @circuitoftmrw managed by accident. Text the demo line, UK numbers only, and try to confuse it: 07455 702608.
Last time someone did that, his fix shipped the same day. Whatever you find, I'll fix it and tell you how.
Under the hood it's deliberately boring:
1. Plumber misses a call. @twilio answers, plays a recorded greeting (@ElevenLabs voice), and hits a tiny relay function, the only real code in the whole thing.
2. That kicks a @make_hq scenario which texts the caller back within seconds and runs the conversation from there.
3. Every incoming SMS goes to GPT-5-mini with the full conversation history injected each turn and a strict JSON schema on the output. It works out the problem, name and postcode, one question at a time.
4. Booking is real: @make_hq pulls live free slots from the @calcom API, offers them numbered, and replying "1" writes it straight into the diary.
5. The important bits sit OUTSIDE the model. A shape check so raw JSON or an empty message can never reach a customer.
One re-offer max before it hands to a human. And any mention of gas overrides whatever the model wanted to say: fixed script, official emergency number, owner alerted.
Hardest-earned lesson so far: don't trust the model to remember or behave. Design the pipeline assuming it won't. Full post-mortem of it failing exactly that way coming Friday.
@kushmergedeck CallRescue: The AI receptionist for plumbing & heating firms.
It catches missed calls and turns them directly into booked jobs.
https://t.co/qZNSmr06mp
@markproduct CallRescue: The AI receptionist for plumbing & heating firms.
It catches missed calls and turns them directly into booked jobs.
https://t.co/qZNSmr06mp