Inspiration

We kept hearing the same story from sales and operations teams: repetitive outbound calling either consumes valuable employee time or requires engineers to build every campaign from scratch.

We wanted business users to describe their process in plain English and receive a working, reusable voice workflow without needing an engineer for every change.

What it does

Veyra helps businesses run outbound campaigns faster and more consistently. A user describes a calling process in plain English, and Veyra converts it into an editable workflow containing conversation stages, branches, qualification rules, and information to collect.

After the user reviews and approves the campaign, CALL-E conducts the real phone conversations. Veyra returns the outcomes as structured, actionable results instead of requiring teams to manually review every call.

Past campaigns can be cloned, adjusted, and reused, reducing setup time and engineering effort for future outreach.

How we built it

We built the interface and application APIs using Next.js, React, and TypeScript. A separate FastAPI workflow engine uses Gemini to transform plain-English instructions into validated workflow graphs.

A custom compiler traverses the graph and converts its nodes, branches, qualification rules, and output fields into:

  • A personalized, natural-language CALL-E task for each contact
  • A compatible JSON result schema for structured data extraction

Supabase provides authentication and PostgreSQL storage for users, workflows, campaigns, contacts, approvals, and call results. Before launch, Veyra generates an exact campaign preview and approval digest, meaning changes to recipients or instructions require fresh approval.

RabbitMQ connects campaign launch to the CALL-E dispatch process. Instead of placing calls inside a web request, Veyra publishes one durable job per contact to the queue. A separately deployed worker consumes these jobs, submits calls to CALL-E, and uses stable idempotency keys to reduce the risk of duplicate calls.

Finally, authenticated CALL-E webhooks update the database, and the Results dashboard displays the call status, summary, transcript, and structured fields.

Challenges we ran into

The most difficult part was reliably connecting RabbitMQ to the independently deployed dispatch worker. The web application, queue, worker, database, and CALL-E API all required consistent production configuration while still allowing jobs to survive temporary connection failures and worker restarts.

We also needed to prevent the same queued job from calling a recipient twice. This required campaign-claiming rules, durable queue messages, stable idempotency keys, and careful handling of uncertain provider responses.

Another challenge was flattening an editable branching graph into one clear instruction. CALL-E conducts the conversation naturally rather than directly executing Veyra’s graph, so our compiler had to preserve every branch and outcome without turning the conversation into a monotonous script.

Accomplishments that we're proud of

We built an end-to-end system where a plain-English business process becomes:

  1. An editable workflow
  2. An approved outbound campaign
  3. Real CALL-E phone conversations
  4. Structured, actionable results

We also implemented important safety boundaries: fake mode is enabled by default, every live campaign requires an exact preview and explicit approval, and queued calls include duplicate-dispatch protection.

What we learned

We learned that reliable voice automation depends as much on queues, workers, webhooks, validation, and idempotency as it does on language models.

We also learned how important visibility and control are. Businesses need to see who will be called, what the agent has been instructed to accomplish, and what information will be collected before approving a campaign.

What’s next for Veyra

Next, we want to improve recovery from delayed webhook delivery, strengthen the reconciliation of uncertain call outcomes, and make scheduled campaigns fully production-ready.

Longer term, we plan to introduce campaign-level analytics that reveal qualification patterns, common objections, customer intent, and operational trends across calls.

Built With

Share this project:

Updates

Submission history