I've been building AI front desks for small businesses on the Monterey peninsula. The same thing kept coming up. The owner is out on a job, the phone rings, it goes to voicemail, and the caller rings the next shop on Google. That job is gone before anyone knows it existed.
A plumber can't pick up with both hands under a sink. So I wanted the missed call itself to do the work: text the caller back in seconds, find out what's wrong, book a real slot, and take a deposit, with the owner getting a summary instead of a voicemail.
Every one of these showed up in live testing with a real phone, and none of them threw an error.
Voicemail counted as answered. The first real test forwarded to a phone that was busy, voicemail picked up, and Twilio reported the call as completed, so no text went out. That is the exact case the product exists for. The fix was call screening: the owner hears "press 1 to take this call", voicemail can't press 1, and only a bridged call counts as answered.
Replies vanished. The toll-free number sat inside Twilio's default Conversations messaging service, which quietly took incoming texts before they reached the app's webhook. Twilio marked them received and nothing happened.
The deposit link was dead. Stripe now turns on Managed Payments by default, which rejects products without a tax code, so the app fell back to a placeholder link. Turning it off for deposit links fixed it.
The dashboard was showing old data. Next.js was caching the database reads, so the board said zero leads while the database had them.
Built With
- nextjs
- stripe
- supabase
- twilio
- typescript
- vercel