Hold-Time Call Bot
AI call assistant that waits on hold, walks phone trees, and texts you when a human answers. Twilio + voice agent weekend MVP.
A consultant blocks forty minutes for “call the insurance carrier.” The actual conversation with a human lasts six. The other thirty-four is hold music, a looping IVR, a “your call is important to us” that nobody believes, and a speakerphone face-down on the desk while they pretend to work. Nobody invoices that gap. It never hits a timesheet. It is why the morning felt productive and the afternoon is gone. The wait is not rare. community research’s brief puts average U.S. phone-tree-and-hold time at about ten hours a year. At $150/hr that is a four-figure leak with no QuickBooks line. For everyone else it is the lunch that dies on United, the DMV, the prior-auth desk. Adjacent Reddit already argues the job: r/CustomerSuccess (27.1K), r/automation (71.1K), r/ArtificialIntelligence (124K) — 222K people, plus 290+ comments on “best AI assistant” threads.
Built for Freelancers, Solo Founders, Weekend Builders, Small Business Owners.
Suggested stack: Next.js 14 + Vercel, Twilio Programmable Voice + Conference, OpenAI Realtime or gpt-4o-mini + Whisper, Convex or Supabase, Stripe Billing, Inngest or Vercel Cron. Weekend scope: about 10 hours.
The Problem
A consultant blocks forty minutes for “call the insurance carrier.” The actual conversation with a human lasts six. The other thirty-four is hold music, a looping IVR, a “your…
The Solution
Hold-Time Call Bot is a Twilio voice agent that joins the queue so you do not. You paste a customer-service number (or a saved “United / IRS / Amex” preset), optional account…
Market Research
AI assistants are already a multi-billion category. IMARC, MarketsandMarkets, and Grand View Research put 2025 in a $3.35B–$17.1B band, expanding toward $21.11B–$124.9B by…
Competitive Landscape
Google Duplex / Pixel Call Screen — Inbound spam screen, some outbound reservation calls, Pixel / Assistant distribution (Android, NA ~36% assistant share). Weakness: hardware…
Business Model
Demo ($0) — One live hold, capped minutes, watermarked SMS. The YouTube / Reddit clip is the ad.
Recommended Tech Stack
Next.js 14 + Vercel — Dashboard, saved numbers, Stripe customer portal. Edge route for Twilio status callbacks so you can return TwiML without a cold Node boot in the middle of a…
AI Prompts to Build This
Copy these build prompts into Claude, Cursor, or your AI coding tool. Create a free account to unlock the full research behind them.
1. Project Setup
Build the weekend MVP of the "Hold-Time Call Bot": it dials a customer-service line, presses the saved menu digits, waits on hold, and texts you a link when a human answers. You tap the link and are connected. Stack: Next.js (App Router), TypeScript, Tailwind, Supabase (Postgres, Row Level Security, Auth with email magic link), Twilio Voice with a conference and real-time transcription that posts text to a webhook, Twilio SMS for the ping, the OpenAI API (a small model) to label what it hears. Twilio needs a public URL, so deploy early or use a tunnel. Deploy on Vercel. Tables (Row Level Security on, each user reads only their own rows): - profiles(user_id, phone) - destinations(id, user_id, nickname, e164, dtmf_macro, language) - calls(id, user_id, destination_id, twilio_call_sid, conference_name, state, started_at, human_at, bridged_at, ended_at, wait_seconds, error_code) state is dialing, ivr, hold, human, bridged, failed or canceled - call_events(id, call_id, label, confidence, created_at) the label only; no transcript text is stored Screens: /login, /destinations, /call/[id] (live state), /history. Env vars (names only): NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY (server only), TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER, OPENAI_API_KEY. Do not build: billing, plans or wait-minute metering, websockets or media streams, audio recording or storage, a shared menu-tree database, a bot that speaks to a person, a reaper job. Done when: npm run dev starts, you can sign in, and the four tables exist with Row Level Security on.
2. Core Feature
Build the one feature that proves the Hold-Time Call Bot: tell hold from a human, then bridge the user in. 1. Start creates a calls row and places an outbound Twilio call from TWILIO_FROM_NUMBER to the destination's number, with a time limit equal to the maximum wait (60 minutes) and the saved digits sent after it connects. The call joins a named conference and stays muted. 2. Turn on Twilio's real-time transcription for the call, pointed at a webhook. For each chunk, ask the OpenAI API for JSON { label: "ivr_prompt" | "hold_music" | "please_wait" | "live_agent" | "silence" | "unknown", confidence: number from 0 to 1 }. Save only the label and the confidence to call_events. 3. Move the state from dialing to ivr to hold as the labels change. Move to human only after two live_agent labels in a row, each at 0.8 confidence or more, so one stray greeting on a recording does not trigger it. 4. On human, set human_at and SMS the user a join link to /api/join/[callId]. 5. When the user opens the link, have Twilio call their phone into the same conference, say to the agent "Connecting the account holder now" and drop the bot's leg. Set bridged_at. 6. Return TwiML from every webhook in under a second. Do the model call after responding. Rules: the bot never speaks and never invents digits; it only sends the saved macro. Never store audio or transcript text. At most 2 active calls per user. A Cancel button ends the call and sets canceled. Empty state: with no destinations, show the form for a number, a nickname and the digits to press. Done when: a test call to a second Twilio number that plays music and then a scripted greeting reaches hold, flips to human once, sends one SMS, bridges the user on tap and drops the bot, and a third concurrent call is refused.3. Landing Page
Build a one-page landing site for the Hold-Time Call Bot, a bot that waits on hold for you. Hero: "Sit on hold without sitting on hold." Sub: "A bot dials the number, presses the menu digits and texts you when a person picks up. You join for the part that matters." One button: Join the waitlist. Sections: the problem (thirty minutes of music, a six-minute conversation), a demo phone showing the text "A person is on the line. Tap to join", how it works in five steps (add the number, the bot dials, it waits, you get a text, you join), and an FAQ on recording (off, nothing is stored), what the bot says (nothing, it only presses digits), what happens if the agent hangs up and calling rules. Waitlist: store the email in a waitlist table in Supabase. No other service. Style: Geist, a dark background, one lime accent, a landline off the hook as the one image, no people, no tiny unreadable screenshots. Done when: the page renders on a phone and a submitted email appears in the waitlist table.
4. Branding Package
Use a design or image tool for this one. A coding agent cannot draw a logo. Brand for the Hold-Time Call Bot: pick a short working name, then design a wordmark and an icon that suggest a phone cord that stays untangled. Colors: near-black, off-white and one lime. Type: Geist, with tabular numbers for wait times. Deliverables: wordmark, icon, four call state chips (holding, human, bridged, failed) that differ by shape as well as color, the join text message layout, and one launch graphic. Done when: each deliverable is saved in one folder and the state chips are distinguishable without color.