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.

  1. Import or seed a lead list (synthetic Delhi NCR sample, or CSV).
  2. Create a campaign with a written objective. The agent identifies as an AI assistant.
  3. Run a labeled SIMULATION, or launch one confirmed live CALL-E call.
  4. Read a structured result: batteries, chemistry, volume, disposal route, interest, next step.
  5. 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

Share this project:

Updates

Submission history