-
-
The full message with its transcript, one link per listing, and a call Betty flagged as a possible scam.
-
Your inbox on the answering machine's LCD, the link you share instead of your number, and the message Betty took from the call.
-
Betty is a 90s answering machine: charcoal body, microcassette, red LED. The same device is the app icon.
-
-
-
-
-
-
Inspiration
In Colombia and I think, of the rest of world, the moment you post your phone number on a listing to sell a car, rent an apartment or run a small business, you start getting calls from everyone. Buyers call, and so do robocalls, salespeople and scammers running the "fake relative" or "your bank needs to update your data" scripts. The apps I found only tell you who is calling. You still have to answer.
Big companies have a receptionist for this. I wanted to give one to people who can't afford her.
What it does
Other apps tell you who's calling. Betty picks up for you.
Instead of your number, you share a Betty link (gobetty.co/your-listing) or a QR code. Whoever opens it talks to Betty right in the browser over WebRTC, with nothing to install. Betty asks who's calling and why, takes the message, and the app gives you a push notification, a summary, the full transcript and a verdict: important, spam, or possible scam.
You create one link per listing, so Betty picks up already knowing why people are calling: "Hi, this is Betty. Are you calling about the apartment?" A phone number could never do that.
You teach Betty your listing by calling her. No forms and no uploads: you call Betty, tell her the price, the mileage, the neighborhood, whether it's still available, and from then on she answers those questions herself. Callers get their answer on the spot, and the messages you receive are the useful ones: "wants to see it on Saturday".
Links can be turned off at any time without changing your number, and Betty never says your name or whose line it is. Your name is never in the agent's prompt, so she can't leak it.
Who it's for: people selling or renting something, anyone waiting on a job call, small businesses that live on the phone, and anyone tired of unknown numbers. Scam screening is included for all of them.
How it makes money. Calls cost real money (AI voice minutes), so plans have a monthly call quota:
- Free: 5 answered calls a month.
- Betty Pro: 15 calls a month, US$4.99 monthly or US$49.99 yearly (COP $15.900 / $159.000 in Colombia). The yearly is exactly ten months. 7-day free trial on both.
- A real phone number is a premium add-on sold through a waitlist, priced by the backend, not the store.
How we built it
Solo developer, with a lot of help from Claude Code.
- App: Flutter, iOS first, then Android. Sign in with Apple and Google.
- Voice agent: a managed voice-AI platform, called over WebRTC from the link page in the browser. After launch it moves to a self-hosted open source stack (LiveKit Agents, Whisper, Kokoro).
- Backend: AWS SAM, Lambda, DynamoDB, API Gateway. A proxy starts each call, writes the attribution (
call → user + link) before it rings, and injects the listing context into the greeting. - Monetization: RevenueCat end to end.
purchases_flutterin the app, and the RevenueCat webhook writes the plan to our backend, and the backend enforces the quota.TRANSFERevents are ignored on purpose: Family Sharing travels that way and would hand a user's call recordings to someone else. Paywall variants are driven by offering metadata, so an experiment launches without a release. - Push: OneSignal, with a deep link straight to the message. Scams and spam don't notify.
- Web: Firebase Hosting for the landing and the link page.
- Design: a 90s answering machine. Charcoal body, green LCD with segment type, a red LED, microcassette icon. Every message is "a tape"; hit your quota and "your tape is full this month".
Challenges we ran into
I built the wrong product first. Betty started as a real phone number per user. I had it working: a Colombian mobile number, SIP routing, OTP sign-up, carrier call forwarding. Then the numbers came in:
- Each number cost $15 register and $15 a month before a single call was answered. A free tier was impossible, and the paywall had to start where nobody in Colombia would pay.
- Conditional call forwarding worked end to end on one carrier. The other two block it at the network level.
On August 14, six weeks before the deadline, I dropped the phone network as the foundation. Over a long weekend Betty became internet-native: the link. Fixed cost per user went to $0, the free tier became possible, the price dropped to something people pay without thinking, and Betty works in any country from day one. The number-based code isn't deleted; it sits behind a flag and came back as the premium add-on.
Smaller ones: Google Play's 14-day closed test with exactly 12 testers and no margin, and a push SDK that kept shipping a location module into the build no matter what flag I set, until I switched the iOS build from Swift Package Manager back to CocoaPods.
Accomplishments that we're proud of
- Live on the App Store since August 29, 2026, inside the Shipaton window. Google Play: in production review since Sept 22, after closed testing.
- Active customers: 135 · New customers: 77 · Paying: 1 · Calls answered by Betty: 27
- A pivot of the core mechanism in one weekend, without throwing away the first product.
- The dictated listing: the owner teaches Betty by phone, in her own voice and name, and she answers callers' questions from it. Shipped in 1.0.0, a week after it was an idea.
- Betty answers in Spanish and English, and the link page speaks the language she will answer in.
- Betty has a consistent character, with three voices: the device's LCD, Betty talking to you, and Betty talking to strangers.
- A unit economics that closes at full quota today (~35% margin), with a documented path to ~80% by moving the voice stack to open source (LiveKit Agents, Whisper, Kokoro).
What we learned
- A small number on a paywall reads as a ceiling. "15 calls a month" was the most repeated objection. Nobody knows how many calls they'll get before buying, so the number only raised a question with no answer. I moved it out of the paywall (it's still visible in Settings from day one) and sold what Betty does on each call instead.
- The Shipaton paywall roast was right. Yearly first and pre-selected, and the number waitlist moved below the CTA: sitting between the plans and the button, it made the button look like it bought the number. Shipped in 1.1.0.
- Measure with emails, not taps. Features I couldn't afford to build blind (the real number, carrier forwarding) are waitlists that ask for an email. Anyone taps a button. Few people leave an email, so I trust that signal more.
- Betty speaks in first person on the paywall: "I work from $4.99 a month". She is an assistant telling you her salary. The A/B against an outcome-led headline is wired through RevenueCat Experiments.
- People share Betty because of scams, and buy her for a use case like selling a car. I stopped marketing her as an anti-scam app.
- Validate a phone route by calling it, not by reading the quote.
What's next for Betty — Picks Up for You
Near term: the real-number add-on for businesses, Galaxy Store, and the self-hosted voice stack that makes a bigger quota affordable.
The bigger idea. Betty is a receptionist because I wrote that role for her. The same setup (an agent that anyone can reach through a link in the browser) would work for roles that users write themselves.
Take a traffic lawyer who answers the same ten questions every day. A host agent interviews her and builds an agent from what she knows. She shares its link the way Betty users share theirs, her clients talk to it, and she only gets the cases worth her time. She writes no code and no prompts.
Two pieces already exist. The dictated listing is a small version of that interview: the owner teaches Betty by talking to her. I also have a proof of concept of a super app that loads mini apps over the air, where each agent could be one mini app. And Betty has shown that people share a link to an agent, that strangers talk to it, and that it sells as a subscription with a quota. Betty would be the first agent in that app.
Built With
- amazon-dynamodb
- amazon-web-services
- aws-lambda
- aws-sam
- claude
- dart
- firebase
- flutter
- google-sign-in
- node.js
- onesignal
- revenuecat
- sign-in-with-apple
- webrtc
Log in or sign up for Devpost to join the conversation.