The person we built this for
Marcus is 29. He drives a forklift overnight in a Detroit warehouse and runs Uber and DoorDash in the mornings. His Dodge Charger is financed, which means his lender requires full coverage. He pays around $438 a month, which is roughly normal for Detroit and roughly the worst number in the country.
He does not know that the moment he turns the Uber app on, his personal policy stops covering him. That is the Period 1 gap. If someone hits him while he is waiting for a ping, his insurer can deny the claim and drop him. A driver in his DoorDash group found this out the expensive way.
Marcus tried to shop once. He started around 11:40pm after a shift, got through five screens, hit the question asking whether he uses the car for business, clicked "no" because he did not want to pay more, and by doing that voided the coverage he was buying. Around midnight three lead-gen numbers started calling him. He closed the laptop.
We did not build for a market. We built for him.
What it does
One intake form, then the agents go to work.
Our system shops across the carriers available to a driver, and then it does the part the comparison sites cannot: it places real outbound phone calls to the brokers and independent agencies that never put a quote form online. Those channels matter specifically for drivers like Marcus, because the rideshare endorsement that closes his Period 1 gap is disproportionately sold through agents, not through the online funnel.
The call is not a demo of a talking robot. It has a job. It confirms the rideshare endorsement is available, gets a premium, asks which discounts can be stacked, and then asks for the quote reference number. If it does not get a reference number, we do not record the call as a success. We record it as partial.
Then Marcus gets an email with the three best options. Each one shows the quote number, the premium, what is actually covered including Michigan's PIP tier, the phone number and email to finish the purchase, business hours in his timezone, and a single line telling him what to say when he calls. That last line exists because Marcus told us his real fear is not the price. It is sounding stupid on the phone.
How we built it
The system is asynchronous on purpose. Marcus fills out the form at midnight, when every broker in Michigan is closed. A spinner that says "please wait while we call six people" is not a product. So intake writes to the database, call jobs get queued against each provider's business hours, a worker resolves each job through the voice agent, and the report generates when the jobs reach a terminal state.
The voice stack is Vapi for orchestration on Twilio telephony, Deepgram for streaming speech to text, Cartesia for speech, and Claude for the reasoning turn and for structured extraction from the transcript afterward (Claude Haiku on the live turn for speed, Claude Sonnet for the extraction). The app is Next.js on Vercel with Supabase behind it. Vehicle details auto-fill from the NHTSA vPIC VIN decoder, which is free and needs no key.
We measured about 1070ms time to first audio at p50, with end to end turn latency of 1228ms p50 and 1821ms p95. Human conversational turn-taking sits near 200ms, and anything past roughly 1200ms starts to read as "hello, are you there." Three things moved the number: streaming STT with endpointing so the recognizer is already done when the speaker stops, switching the speech engine to Cartesia which cut voice latency from about a second to under 350ms, and a small fast model on the first turn. Barge-in cancels speech immediately, which matters more than raw latency for whether a call feels human.
The intake form is 25 questions that behave like six steps. Progressive disclosure, safe defaults on everything risky, VIN decode instead of typing, and conditional branches that only appear when they fire. Financed forces full coverage and surfaces gap. Answering yes to gig work turns on the rideshare endorsement. Completion ran around 140 seconds in our runs, under the three minute target.
Challenges we ran into
You cannot negotiate an insurance rate, and pretending otherwise would have sunk us. Auto rates are filed with state regulators. A CSR offering you a discount off a filed rate is committing rebating. So the entire narrative had to be rebuilt around what a phone agent can legally do, which is reach carriers with no online presence, qualify and stack discounts, restructure coverage like Michigan's PIP tiers, and add endorsements. Access and structuring, not haggling.
We cannot get live multi-carrier rates in a day. Comparative raters require an active licensed agency with carrier appointments. Aggregator APIs are business development relationships. So the rate feed is simulated with realistic filed-rate figures, and every record in the system carries a provenance flag: verified on call, stated by agent, quoted online, or simulated. The badges are visible in the UI and the email. We would rather show you the seam than have you find it.
Latency and naturalness pull in opposite directions. We optimized for speed first and got a voice that was fast and obviously synthetic, which is the wrong trade when your whole claim is human-grade turn-taking. We went back and took naturalness first.
A bot on the phone raises real questions we do not want to hand-wave. Every call opens with a one-sentence disclosure that it is an automated assistant and the call is recorded. Michigan is a one-party consent state, but we disclose regardless. The agent has a hard denylist enforced in code, not just in the prompt: it will never speak or request a social security number, a license number, or payment information. It gathers enough to get a quote and never enough to bind.
What we learned
Insurance distribution is not one channel with a slow tail. It is two channels, and the second one has no API because it is a person answering a phone. Roughly half of what a driver can actually buy is unreachable by software today. That is not a scraping problem to solve, it is a phone call nobody wants to make.
We also learned to be careful about our own story. "One form, every carrier" is marketing and it is false. You reach the carriers your appointments and the brokers who pick up allow. The honest version is narrower and stronger: for hard-to-place drivers the coverage that actually protects them is disproportionately agent-only, and the online funnel structurally cannot surface it.
And the quote reference number turned out to be the most important field in the system. Not the premium. Anyone can render a number. A reference ID pulled out of a live transcript is the proof that the call did work instead of just talking.
What is next
The metric that decides whether this is a company: does the phone channel actually beat online for a meaningful share of drivers. Our threshold is 25 percent of profiles by a real margin. Under 10 percent and we are a shopping app with a good demo. We are going to measure that on 50 real broker calls, not on a teammate playing broker, because real brokers have IVRs, hold music, and a reasonable suspicion of bots.
After that, the harder problem. The industry gap is not shopping, it is binding: most drivers who shop never switch. Our email currently ends at "here is who to call." Closing that last mile through a licensed agency is the difference between a tool and a business.
Built With
- anthropic
- cartesia
- claude
- deepgram
- elevenlabs
- insurtech
- next.js
- nhtsa-vpic
- node.js
- playwright
- postgresql
- react
- resend
- speech-to-text
- supabase
- tailwindcss
- text-to-speech
- twilio
- typescript
- vapi
- vercel
- voice-ai
- webrtc
- zod
Log in or sign up for Devpost to join the conversation.