A machine that turns 30,000 cold companies into signed customers — mostly on its own.
This is a sales tool. Its job: find companies that might buy, contact them at scale, and hand the promising ones to a human only at the moment a real conversation is worth having. Below is every moving part, explained from zero.
The business problem, in one paragraph
Imagine a company that sells a service to other businesses — and to grow, it constantly needs new customers. The old way: a room full of salespeople who Google companies, find a phone number or email, cold-call or cold-email them, and slowly work the few interested ones toward a contract. It's slow, expensive, and most of the effort is wasted on companies that were never going to buy.
What this product does: it automates the boring, high-volume 90% of that work — finding companies, researching them, emailing them, even preparing the phone calls — and saves the humans for the 10% where judgment actually pays off: the live sales conversation and the close.
Everything in the system is one long assembly line (the industry calls it a pipeline or funnel). A company enters at the top as a cold name and moves down, stage by stage. At each stage most drop out and a few advance — so the funnel is wide at the top and narrow at the bottom, where the signed deals come out.
The five stages of the funnel
Read top to bottom. Each band is one stage. It narrows because fewer companies survive each step — and it shifts from cool to warm colours at the exact point the machine hands the work to a person.
Only the first two numbers (30,000 companies, 20,000 emails) are real targets from the spec. The later stages narrow to progressively fewer, higher-quality prospects — exact counts depend on the campaign.
Every term, in plain words
The code and the German UI use specific words for everything. Here's what each one actually means, with an everyday comparison.
The life of a campaign, module by module
Let's start a brand-new campaign and watch which module takes over at each step, in order. The example throughout:
Who's selling: a staffing agency. The product: "FlexCrew" — on-demand waiters, cooks and dishwashers a restaurant can book for busy shifts. Who they want to sell to: restaurants & cafés in Munich — always short of staff, so an easy customer to picture.
Each step below shows the module doing the work, whether you click something or the system runs on its own, and — in the dashed box — how the algorithm actually decides.
01You create the campaign
In the admin area you make a new campaign: "FlexCrew — Munich Restaurants." You attach the product (FlexCrew staffing), set a budget (how much it may spend on paid data/AI), and write one rule for who belongs in it.
benchmark score > 70 — or a written instruction the AI reads
("restaurants that look busy and are hiring floor staff"). Whichever you choose is saved and applied automatically later.02Research goes and finds the companies
On the campaign you set the search: postcodes (Munich) + industry (restaurants & cafés) + how many to find. You press "run" (or let it run automatically every hour). The Research module then does the digging: it searches Google Maps, reads their websites, checks job ads (e.g. "hiring waiters") and public registers.
03Each company gets a score and joins your campaign
The system gives every new target a benchmark score from 0–100 (how good a prospect it is). Then it checks your rule from step 1. Companies that match drop into your campaign; the rest wait in a shared pool.
78 → above your
cutoff of 70 → it joins the campaign. Leftovers in the shared pool are handed out fairly, one-by-one (round-robin) so no campaign hogs them.04You set up the "senders"
Emails can't come from nowhere — they need a From-address. The Virtual Companies module holds these sender identities (a fake company name + real mailboxes). They're kept "warmed up" in the background so they look trustworthy and don't land in spam.
05Outreach writes and sends the emails
You write the email scripts pitching FlexCrew (a first email, plus follow-ups). From then on the Outreach module runs itself: for each restaurant it asks the AI to write a personalised version of your script, then sends it from one of your virtual senders. No reply? It sends the next follow-up a few days later.
06Replies get sorted automatically
The system checks the mailboxes every few minutes. When a company replies, it figures out which target it belongs to and routes it:
07An agent calls the promising ones
A supervisor builds a calling shift. A Connect agent starts it and works through the list in a live "cockpit" screen — the system dials each number for them (via CloudTalk). After each call the agent picks the outcome from a list: not reached, gatekeeper, interested, appointment booked, not interested…
08A closer wins the deal
Every booked appointment is shared out evenly among Closing agents. A closer runs the actual sales meetings. When the company says yes, they send the contract for e-signature, and once it's signed the system sets up payment collection automatically.
The one-line summary: you set up a campaign for a product — FlexCrew staffing (CAMP) — and after that the system does the heavy lifting: it finds restaurants (RES), scores and sorts them (CAMP), emails them from your senders (VCO + OUT), and learns which emails and call scripts win (Bandit). People only step in for the phone call (CON) and the close (CLO). A spending limit (budget) and a full history (audit) run under all of it the whole time.
Under the hood: the machine room
The funnel above is the what. Here's the how —
what actually happens inside the app at each stage. Almost nothing runs on a button press; the work
is done by background jobs pulled off queues and by scheduled tasks that
wake up on a timer. Names in mono are the real classes/jobs in the codebase.
research:process-cron-triggersOrchestratedResearchPipeline: one focused Serper query per postcode×industry combo- Free sources fired together, then paid ones one-by-one — each gated by
GuardCampaignBudget PersistResearchCandidatewrites the Target + every fact (with its source)RecalculateTargetBenchmarkscores it across the 5 dimensionsEvaluateAndAssignTargethands it to campaign assignment
targets:rotate-unassigned for leftovers- Stage 1: if research already knows the origin campaign, use it
- Stage 2: otherwise a fair
RotateUnassignedTargetsround-robin over the catch-all pool AssignTargetToCampaignwrites the link + an audit record (score, tiebreaker, reasoning)- If the target's data is > 60 days old → fire
ReResearchTargetto refresh first
CheckOutreachWaitWindows — finds targets due for their next email- The bandit picks which email version to send (learns from past replies)
GenerateOutreachMailbuilds an XML-sanitised prompt, calls Claude, validates the JSON, rejects hallucinated pricesSendOutreachMailsends it from a round-robin virtual-employee mailbox via Graph- Row written to
outreach_messages(unique per target+step, so no double-sends)
PollVirtualEmployeeMailboxes → RouteInboundMessage matches on In-Reply-To. A positive reply moves the target straight to Closing. Three failed emails → TransferToConnect.- A "package" of targets is pushed to CloudTalk (
PushPackageToCloudTalk) - The agent works a live cockpit; call events stream back in real time
- A finished call fires
CallCompleted→UpdatePipelineFromCall+ a bandit event - Outcome sets the pipeline stage (reached / gatekeeper / appointment / rejected…)
PositiveReplyReceived) or a scheduled appointment- The target is round-robin'd to a closing agent
- Agent works the meetings through the closing pipeline stages
- On "yes": contract sent for e-signature via SignRequest
ContractSignedwebhook →SendGoCardlessLinksets up payment
Sold, Not sold, or UnqualifiedThe plumbing that makes it all tick
Five cross-cutting systems run underneath every stage:
HorizonSix named queues (research, outreach-mail, connect-sync, webhooks…) run the slow work in the background so the UI stays instant.
cronTimed jobs wake up (hourly / daily) to trigger research, check email wait-windows, refresh stale data, enforce budgets.
ReverbWebSockets push real-time progress to the browser — research runs and the call cockpit update without refreshing.
Every paid API call is checked against the campaign's budget first; hit the limit and the campaign auto-pauses.
Every business change is logged immutably — who, old value, new value, when. Nothing can be edited or deleted away.
The four kinds of user
Admin
Runs the system itself: settings, API keys, the virtual sender companies. The technical owner.
Supervisor
Sets up campaigns, hires connect agents, builds calling shifts, decides who can see what.
Connect agent
Does the cold-calling. Sees only the campaigns they've been released to — nothing else.
Closing agent
Runs meetings and signs deals. Sees only the specific targets assigned to them.