Oppora AI runs outbound sales as a sequence of cooperating agents: company finder, lead finder, email finder, enrichment, verification, scoring, campaign, reply handling. Eight of them. The engineering problem is that a customer should never be able to tell.

Eight agents that have to look like one

Each agent is reasonable software on its own. Together they are a distributed system with eight opinions about what a lead is, eight retry policies and eight ways to be half-finished. Users do not see agents. They see a list of prospects and expect it to be right.

So the agents never talk to each other directly. They act on a shared record and advance it. Whatever the models decide, the truth about a lead lives in one place, in a state everything else can read.

The vendor tax

Before that, most of the pipeline was rented. Search from one service, enrichment from another, verification from a third, warmup from a fourth. It works early and it stops working at exactly the point where the product needs to feel like one thing.

Every vendor brings its own latency profile, rate limit and failure mode, and none of them are yours. The quiet ones do the damage. A verification service that degrades keeps returning confident-looking results that are simply wrong, and the pipeline carries on.

Bringing verification, deliverability and warmup in-house was not a cost decision. It was about being able to state what the system actually knows, with real status and real limits, rather than forwarding a black box straight to the user.

State machine, not script

A lead moves through discovery, enrichment, verification and campaign stages with explicit transitions. The system always knows where a record sits and what it is allowed to do next, which is what makes a partial failure survivable instead of corrupting.

Slow and rate-limited work runs as background jobs with retries and backoff, so the API stays responsive while a vendor hiccup resolves itself. LLM steps get the same contract as everything else: structured input, structured output, and a defined path when a call is slow or comes back low-confidence. No step gets to be special.

Two front doors

Because the workflow contract lives in the backend and not in the UI, the same core exposes a REST API and an MCP interface. Agent clients and conventional clients drive identical state transitions. That was not extra work. It fell out of keeping the rules in one place.

What I built

  • Backend infrastructure for the AI sales workflows and assisted campaign execution.
  • Email verification, lead search, enrichment and deliverability tooling, replacing third-party services.
  • Warmup, outreach and AI-assisted content improvement behind a single workflow contract.

Eight agents shipping as one product is mostly a bookkeeping problem. That is not a complaint about agents. It is where the work is.