Inspiration
Battery recycling companies still find feedstock by calling yards, workshops, and collection hubs. A spreadsheet has a name and a city. The facts that matter — monthly volume, chemistry, who decides, what currently happens to the packs — only appear in a conversation. Forms go unanswered. Chatbots never reach the floor.
We wanted an operator desk that uses CALL-E for that conversation, then tells a human who is worth a follow-up.
What it does
VoltX VoiceOps is a local operator desk for battery feedstock outreach.
- Import or seed a lead list (synthetic Delhi NCR sample, or CSV).
- Create a campaign with a written objective. The agent identifies as an AI assistant.
- Run a labeled SIMULATION, or launch one confirmed live CALL-E call.
- Read a structured result: batteries, chemistry, volume, disposal route, interest, next step.
- See Pending move to HOT / WARM / COLD / UNKNOWN, with a P1 / P2 / P3 follow-up queue.
Simulation never places a CALL-E call. Live dispatch uses the official @call-e/calle SDK (CalleClient.calls.create / calls.get). Scores are an operational ranking, not a revenue forecast.
How we built it
Next.js 16, TypeScript, React, SQLite, and Vitest. VoltX owns the lead list, campaign state, scoring, and operator review. CALL-E is the voice layer.
The CALL-E task asks for feedstock facts one at a time, discloses that it is an AI assistant, and stops on refusal. VoltX scores locally with a documented heuristic. Webhooks only trigger a refresh via calls.get; untrusted bodies are not applied as qualification. Live calling is fail-closed: env flags, E.164, and a typed confirm phrase. Placeholder +9111555… numbers are never dialed.
Challenges we ran into
The live Calls API rejected resultSchema / recipientResultSchema, so the create payload is task, recipient, metadata, and optional webhookUrl. Empty live payloads stay empty — we do not invent chemistry or volume. Hangup is not in the SDK, so pause / cancel / kill stop the next create only. India destinations can sit in queued before they ring. The 3-minute judged path is SIMULATION so judges are never shown fixture data as live CALL-E traffic.
What we learned
A phone call is the right interface when the decision maker is on a yard floor, not in a browser. The hard part is not “make it talk” — it is keeping live and simulation honest: labeled fixtures, no silent fallback to live, and no scoring theater. Structured extraction has to survive a messy conversation, and the operator still needs a next action, not a dashboard full of raw transcripts.
What's next
CRM writeback, callback-window follow-up, pickup scheduling, and multilingual outreach are not in this build.
Built With
- call-e
- css
- html
- javascript
- next.js
- node.js
- react
- sqlite
- tailwind-css
- typescript
Log in or sign up for Devpost to join the conversation.