Inspiration

Every small organization runs on the same currency: getting a stranger to say yes. A sponsor. A partner. A first customer.

Big companies just buy that. They staff a BD team, run a CRM, drop $36,000 a year on an enterprise "AI SDR." Everybody else does it by hand at 1am. Apollo for data, LinkedIn for context, Gemini for drafting, a spreadsheet to track it, Gmail to send. Five tools, half an hour per lead, zero memory of what worked last time.

That was us. We raised the sponsorship budget for Toronto's largest summer hackathon on exactly that stack, thousands of cold emails deep. Then we interviewed eight founders and BD leads and heard the same story back. The market gives you two options: cheap blasters that torch your domain reputation, or a seat priced like a salary.

The industry's answer has been volume. Volume is dead. Anyone can point a model at a list and fire off a thousand emails, which is exactly why inboxes learned to filter that. The bottleneck moved. It's two things now: being right about who you contact, and sounding like a human when you do. Both are judgment calls, and judgment is what agents finally got good at.

So we built what we wished we'd had. A five-person org shouldn't lose a deal to a five-hundred-person one because it can't afford a BD team. It should have one.

What it does

Give OutreachOS a goal in plain English. It spins up a fleet of agents and goes and gets it.

Try "find 40 companies who'd sponsor our robotics program and reach whoever signs off on it." Off that one sentence:

  • It checks your network before it goes cold. Drop in your team's connection exports and it builds a relationship graph, then ranks the warm paths into every company on the list. A warm intro beats the best cold email ever written, so the agent looks for one first.
  • It finds the right company, then the right human. Live web discovery, companies scored against your goal, then the actual decision maker picked out with size-relative seniority. The VP who matters at a 40-person company isn't the VP who matters at a 4,000-person one.
  • It never guesses an email. Addresses get resolved and verified against real mail infrastructure, or the person shows up flagged as unreachable. Nothing in the system can invent an address that merely looks plausible.
  • It has to prove a claim before it can write one. The research agent pulls sources, extracts each claim with a verbatim quote, checks that quote deterministically, then runs an entailment pass. Fail any stage and the claim dies. The email literally cannot cite what the system couldn't verify.
  • It writes in your voice, not the model's. Drafting retrieves your own best past emails as few-shot voice anchors, then a verification pass hunts for invented numbers, machine tells, and generic openers before anything reaches you.
  • It's multiplayer. Your whole team works one live goal. Claim a company, hand a lead to a teammate, redirect strategy mid-run, swap the house voice, all by prompt in a shared console. Anti-collision logic means two people never email the same person.
  • It gets sharper every time you hit send. Every edit you make is training signal.

Nothing goes out without a human. Agents do the research, targeting, writing, and sequencing. You keep the call.

How we built it

A multi-agent system with durable execution, top to bottom on Google Cloud.

The agent layer. A tool-calling loop on Gemini with about 40 typed tools: discover companies, qualify against a plain-language bar, find contacts, research, draft, restyle, reassign, queue. You pin files into the agent's context and it opens records back into your editor mid-turn. Less like prompting, more like pairing with someone.

Model tiering, which we'd argue is architecture. One model for everything is a waste. We run seven independently configurable Vertex AI tiers, routing each call to the right cost and capability point: fast for judging and extraction, a reasoning tier for drafting, a research tier for anything that ends up as a factual claim, a lite tier for structured-output repair, plus dedicated ranking and document transcription. Each is an env var, so rolling a tier back takes no deploy.

Retrieval. MongoDB Atlas Vector Search over 1024-dimensional Gemini embeddings, on two live paths: pulling your most relevant past emails as voice anchors, and relevance-ranking your verified fact bank to decide what a given email should cite.

Durable orchestration. Long agent runs can't live inside a web request, so runs are records in Mongo leased out to Cloud Run workers via Cloud Tasks with OIDC auth, with Cloud Scheduler driving autopilot cycles, paced sending, and recovery of anything abandoned. All resumable, with progress streaming from the database instead of a socket that drops.

The learning loop, the part we're most attached to. Every tool in this space claims to learn from replies. Replies are sparse and slow. We learn from your edits, which are dense and instant.

Rewrite a draft and an extraction pass turns the diff into a style delta, merged into your persistent voice profile with confidence weighting. A dimension holds value \(v\) at accumulated confidence \(c\), and a new observation \((\hat{v}, \hat{c})\) moves it:

$$v' = \frac{c\,v + \hat{c}\,\hat{v}}{c + \hat{c}}, \qquad c' = c + \hat{c}\,(1 - c)$$

A weak signal barely budges something you've already established, and confidence ratchets toward 1 rather than quietly decaying. Your voice becomes memory, not a diff prompt bolted on the end.

Outcomes drive a second loop. Per-strategy conversion is beta-smoothed against a hierarchical prior, so a strategy at \(w\) wins out of \(n\) attempts is estimated as:

$$\hat{p} = \frac{w + \alpha p_0}{n + \alpha}$$

The interesting part is where \(p_0\) comes from. It cascades: a new goal starts at a global benchmark, an angle forked mid-goal starts at that goal's pooled rate, and each strategy weans onto its own data as evidence arrives. A new approach inherits what you've already learned instead of starting from scratch, and capacity flows toward whatever is working.

Everything else. React and Vite on Firebase Hosting, Firebase Auth, Express on Cloud Run, Cloud Storage behind signed URLs, Amazon SES for transactional sending and inbound reply capture, Stripe for billing, OpenTelemetry traces into Cloud Trace. Hundreds of tests and three standing quality gates run before anything ships.

Challenges we ran into

Agents that are confident and wrong. Our first version wrote genuinely beautiful emails citing funding rounds that never happened. We rebuilt research as retrieve, quote, verify, entail, where every stage can kill a claim and an empty result is a correct result. "Nothing here was worth citing" is a feature.

You can't prompt your way to quality. We kept stacking rules into the drafting prompt and the drafts started reading like the rubric. The fix: teach voice by example instead of instruction, move every mechanically checkable rule out of the prompt and into deterministic code, and spend the model's one revision pass on what the email says, never on its shape. Our scored eval harness then overturned two changes we were dead certain about.

Multiplayer without leaking anything. Every query is tenant-scoped by construction. Adding teams meant building exactly one auditable crossing point rather than loosening that anywhere, so you can hand a teammate a company without handing them a colleague's private network graph.

Long work stuffed inside a short request. Hosting enforces a 60 second edge timeout, then reports a cheerful 200 for a request the browser already gave up on. That ate days. It forced the detach-and-poll architecture we should have built on day one, and now no model call blocks a request a user is waiting on.

"No JSON came back" is four different bugs. A reply with no usable JSON can be truncated, empty, malformed, or blocked, and the right move differs for each. Truncated wants more headroom, not a better prompt. Telling them apart turned a recurring mystery into four handled cases.

Accomplishments that we're proud of

  • Real revenue from a real customer. We've partnered with a full-scale hackathon organizing team and reached $263 MRR, billed through Stripe, live at outreachos.app.
  • Agents making the decisions that matter. Which companies to pursue, who to reach inside them, what evidence backs a claim, how it should sound. All agent calls, in production, not demo scripts.
  • An email that can't cite what it can't prove. In a category defined by AI slop, we shipped a system whose default is to shut up rather than invent.
  • Learning from edits, not just replies. Every correction compounds across your entire org.
  • Actually multiplayer agents. Not a shared login. A live workspace where several people and a fleet of agents work the same goal at once.

What we learned

The hard part of agentic software isn't getting the model to act. It's deciding what the agent isn't allowed to do. Almost every real improvement we shipped was a constraint: never construct an email address, never cite an unverified claim, never send without a human, never let one noisy signal overwrite something you already know.

Reply rate is also a terrible teacher. Sparse, delayed, often unobservable. Human edits are dense, immediate, and unambiguous, and moving the learning loop onto them meant improving in days instead of quarters.

And model choice really is architecture. Routing seven distinct workloads across seven independently tunable tiers is the whole reason we can sell grounded, high-quality outreach to a small business for $19 a month.

What's next for OutreachOS

  • Every relationship goal, not just email. Intros, applications, partnerships, fundraising. Same loop every time: who, why them, what do I say.
  • Deeper network intelligence. Richer graph signals, so we can name the strongest human route into almost any company you have a path to.
  • A shared learning substrate. Anonymized, privacy-preserving signal on what actually earns replies, so every small org on the platform benefits from what the others learn.
  • More channels, starting with LinkedIn and warm-intro workflows.
  • The real goal. Make a five-person organization as good at winning attention as a five-hundred-person one. That gap isn't talent. It's infrastructure, and infrastructure is something you can just build.

Built With

Share this project:

Updates