How We Run Outbound on Our Own System

Virtual Minds runs its own outbound on LeadsMind and Cortex. The system sources prospects, discovers and filters contact addresses, scores them, runs email, LinkedIn and WhatsApp sequences, and stops the sequence the moment a human replies. We are describing the architecture and the approval gates here, not our results — no outbound performance figure of ours has been cleared for publication, so none appears in this post.
You have probably been pitched an outbound system by someone who does not use one. This post walks through the mechanism we actually run on ourselves — sourcing, validation, scoring, sequencing, reply routing, and the funnel we report internally — and then the parts that do not work. The order is: why we are our own first customer, the pipeline stage by stage, how audiences and offers are held, the approval gate, what happens on a reply, the reply detection we were missing, how deliverability is protected, what the funnel reports, and what the system does not fix.
We use it before we sell it
Lead Generation and Outreach is one of three capability lines on Cortex, alongside GEO and AI visibility and custom AI dashboards. The pitch is short: a managed pipeline that sources, validates, enriches and scores prospects, then runs the outreach, so your team only handles real conversations.
We can describe that mechanism in detail because it is the mechanism we use. Virtual Minds has been operating since 2022 with seven consumer AI apps live and 500K+ users, all of which arrived through app stores and search rather than outbound. The B2B side had no pipeline at all. So the same modules a client would get were pointed at our own market first: Lebanon and the UAE. Cortex is in testing with design partners; LeadsMind is launching. Neither is generally available, and a post claiming otherwise would be the first thing a buyer could check.
Two workforces run it. Humans decide, agents execute — a division that exists here as a state in the state machine, not as a line in a deck.
The pipeline, stage by stage
Five stages, each with a named instrument rather than a verb.
| Stage | What runs | What comes out |
|---|---|---|
| Sourcing | Google Places Text Search API, queried by business category and location | Business name, address, phone, website, rating and rating count |
| Address discovery | A crawler fetches the prospect's own site and its contact and about pages | Published addresses, taken from the company's own pages |
| Validation | A junk filter drops noreply, donotreply, admin, webmaster, postmaster and template placeholders such as name@ and test@ | A list without role addresses nobody reads |
| Ranking | A preferred-prefix list ranks info, contact, hello, office, sales, enquiries | One best address per company, not five guesses |
| Scoring | A stored numeric score on each lead, filterable and sortable | An ordered list, and audiences defined by a threshold |
The crawler identifies itself: a named user agent with a link back to virtualminds.tech, and it gives up after eight seconds. A scraper that hides what it is makes the company running it harder to trust than the data is worth.
On scoring, the honest version: the score prioritises the list, and audiences can be defined as a threshold on it — score >= 60, for instance. It is an ordering signal, not a prediction, and we are not going to dress it up as one.
Audiences are filters, offers live on the campaign
A campaign targets a pool. A pool stores a filter, not a frozen list of lead ids, so the audience keeps matching prospects sourced after the campaign was built. Sourcing on Tuesday adds to a campaign that launched on Monday without anyone re-uploading a list.
The offer sits on the campaign rather than on the product or the template. Each campaign carries a product, a promise written as one sentence in the prospect's own terms, a proof point, a call to action, an optional price hint and a note on the audience. Two campaigns can sell the same product on two different promises — "cut your proposal time in half" and "stop losing leads in WhatsApp" are the kind of promise a campaign carries, not campaigns we are reporting on.
The price hint is nullable on purpose. Some campaigns deliberately avoid price in a first message; that is an editorial decision per campaign, and a system that forced pricing into every template would make it for us.
The approval gate is a state in the machine
A campaign moves through six states: draft, review, active, paused, completed, cancelled. Two of them carry the entire autonomy question. Draft never sends — whether the draft was written by an agent or by hand. Review means an agent has finished and is waiting for a founder to approve it. An agent can write a complete campaign, every node, every variant, and still cannot send a single message.
Every campaign also carries an owner — a named founder who receives the reply alerts — and a link to the team board where reply tasks are filed. Accountability is a required field rather than a promise in a deck.
The scheduled agent that watches outbound is deliberately read-only. On each run it reports rather than acts: replies waiting on a human, campaigns stalled, channels that have stopped working, pools that have run dry. It cannot change a campaign's state. An agent that silently flipped campaigns on a schedule would be spending the company's sending reputation with nobody watching.
What happens when someone replies
A reply halts the machine instead of continuing it. One handler receives replies from all three channels and always does the same four things: it halts that person's enrollment so no further message goes out, advances the lead's stage, files a task on the team board for a human, and writes an event for the record. Channels differ in how a reply is recognised. They never differ in what happens next.
WhatsApp is in the stack for a specific reason: our own inbound replies arrive there as often as in email, so a system watching only an inbox would miss conversations it started. That is our observation of our own pipeline, not a measured figure about the Lebanese market.
Matching an inbound reply to a lead is best-effort, and we will say so plainly. A reply arrives from a phone number or an email address, not a lead id. Resolution tries the exact identifier, then a normalised phone number. An inbound message that matches nothing is recorded as unattributed rather than guessed at. A wrong attribution is worse than a missing one, because it corrupts the funnel it was supposed to measure.
The reply detection we were missing
For a period, nothing in the system detected a reply on any channel. The email webhook mapped opens, clicks and bounces only. The WhatsApp webhook returned early on anything that was not a send confirmation, so inbound messages were parsed and dropped on the floor.
The consequence is worth stating exactly, because it is the failure mode of every outbound stack that is measured on sends: a four-step sequence with no reply detection keeps emailing someone who has already answered "yes, let's talk". The automation then loses the deal it just won. We built the single reply handler in response to that, which is why the reply path is the part of this system we describe with the most confidence and the part we are least willing to compromise on.
The related admission: at our list sizes, A/B variants live on the individual message rather than on the campaign. Campaign-level A/B would need two full sequences and twice the leads to say anything. Lebanese SMB audiences run to hundreds, not tens of thousands, and a test design that cannot reach significance is decoration.
Protecting deliverability, and what we have not built
Five settings carry all of it. We are not going to describe infrastructure we do not run.
| Mechanism | Setting | Why it is set there |
|---|---|---|
| Email cap | 30 per hour | Conservative by design; the list is small enough that throughput is never the binding constraint |
| WhatsApp cap | 15 per hour | A personal-feeling channel; volume is the fastest way to get reported |
| LinkedIn cap | 20 per day | Per day, not per hour. The adapter drives a real logged-in account, and aggressive automation gets accounts restricted |
| Send window | 09:00-18:00 Asia/Beirut, Monday to Friday | Messages land in working hours in the market we sell into |
| Scheduled agent | Read-only | It can report a broken channel; it cannot change campaign state to fix one |
What we have not built: no inbox warm-up, no domain or inbox rotation, no seed-list testing, no deliverability monitoring. Sending reputation is a slow asset and a week of careless volume can destroy it. The caps and the narrow window are our answer to that; a warm-up stack is not, because we do not have one. If you are buying outbound from anyone, ask which of those four things they actually run, and apply to their answer the scepticism you are applying to ours.
An unconfigured channel is a precondition rather than a crash. Each channel adapter reports whether it is configured, and the runner checks before a campaign goes active, so a missing LinkedIn credential blocks the LinkedIn campaign instead of breaking the schedule that drives the email ones.
What the funnel report shows, and what we are not publishing
The founder-facing snapshot reports on a fixed set of fields: active, paused and draft campaigns; leads enrolled; replies received; replies whose team-board task is still open; sends and failures in the last 24 hours; campaigns that are blocked, with the reason; campaigns whose enrollments have run out; and a reply rate. The funnel underneath it is sent → accepted → replied → booked.
Those are the fields. We are not publishing the values. No reply rate, no meeting count, no send volume, no list size, and no comparison to what we did before — none of it has been cleared for a public page, and a post that invented a plausible number would undo everything else in it. If you want the numbers, they come up in a call, with the period and the instrument attached, the same way we would expect yours.
The field worth noticing is the fourth one: replies whose task is still open. It measures us, not the prospect. A reply sitting unanswered is the one failure in this pipeline that automation cannot cause and cannot fix.
What the system does not fix
A sequence engine multiplies the message it is given. The pool decides who is contacted and the offer decides what they read; the runner only executes, faithfully, at volume. A wrong ICP is amplified exactly as efficiently as a right one, and this is our reasoning about our own architecture rather than a measured result.
Three failures follow from that, and none of them is a software problem:
- Cold outreach without a real ICP wastes the list. Sourcing is cheap now, which means a bad definition burns a whole market's worth of first impressions rather than a day's.
- Automation amplifies a weak message rather than improving it. If the promise does not survive being read by a stranger in four seconds, sending it to more strangers does not help.
- Deliverability is slow to build and fast to lose. The caps above buy patience. Nothing buys a domain's reputation back quickly.
Why this is not run as a Lebanon search play
The demand is not there to run. "lead generation company lebanon" returns null volume on DataForSEO in-country and 0 on Keywords Everywhere globally, September 2026, while "ai lead generation" measures 1,600 searches a month in the US at keyword difficulty 30 and "apollo alternative" 390 (DataForSEO, United States, September 2026). The Lebanese demand for this work does not arrive through a search box, which is a large part of why we run outbound at all. We wrote up who does hold the Lebanese SERP in our review of the AI companies actually ranking in Lebanon in 2026, and the visibility side of the same problem in how GEO differs from SEO when you are competing to be cited inside an AI answer.
Context from outside our market, caveat attached: 51% of B2B buyers now start software research with AI, 69% chose a different vendor than the one they planned on after AI guidance, and one third bought from a vendor they had never heard of (G2 Buyer Behavior 2026). G2's sample covers North America, EMEA and APAC with no MENA cut, so read it as a direction of travel rather than a local fact. It is why outbound and AI visibility run as one programme here rather than two.
Where we are smaller
On the Lebanese SERP for "ai lead generation company lebanon", Think Unlimited ranks #2 and Sulsaly #3 on the Lebanese SERP for "ai lead generation company lebanon" — ahead of every directory on the page. L'Atelier Growth takes #6, behind Sortlist at #4 and The Manifest at #5 (DataForSEO SERP pull, Lebanon, September 2026). None of those positions is ours. ZIXOU positions on AI agents and automation across Lebanon and the GCC, the closest stated overlap with what Cortex does. Apollo and ZoomInfo hold verified-contact databases at a scale we do not have. Those are real results by other firms, and we are not going to claim a comparison we have not measured.
What we can offer is inspection. The sourcing, the filter, the approval gate, the reply handler and the funnel fields described above are the same modules a client engagement runs on. Reply and we will show you ours — the live campaigns, the gate, and the fields with the numbers in them.
Frequently asked questions
Does Virtual Minds actually use this system on itself?
Yes. Virtual Minds runs its own outbound on LeadsMind and Cortex, and the sourcing, scoring, sequencing, reply handling and funnel reporting described in this post are the same modules a client engagement runs on. We are our own first customer on this capability line, which is why the mechanism can be described at this level of detail.
Do the AI agents send messages on their own?
No. A campaign has to pass through a review state and be approved by a named founder before it can send anything; a draft campaign never sends, whether an agent or a person wrote it. The scheduled agent that watches outbound is read-only by design — it reports replies waiting, stalled campaigns and broken channels, and cannot change a campaign's state.
Which channels does it use, and why WhatsApp?
Email, LinkedIn and WhatsApp. WhatsApp is in the stack because our own inbound replies arrive there as often as in email, so a system watching only an inbox would miss conversations it started — our observation of our own pipeline, not a measured market figure. Each channel sits behind the same adapter interface, so the sequence engine does not know or care which provider is behind it.
What happens when a prospect replies?
The reply halts that person's sequence immediately, advances their stage, files a task for a human on the team board and writes an event. One handler does this for all three channels, so behaviour on a reply does not change with the channel it arrived on. Matching is best-effort: a reply comes from an address or a phone number, and an inbound message that matches no lead is recorded as unattributed rather than guessed at.
What does the funnel report show?
The fields are active, paused and draft campaigns, leads enrolled, replies received, replies still awaiting a human, sends and failures in the last 24 hours, blocked campaigns with the reason, campaigns with no active enrollments left, and a reply rate — over the funnel sent → accepted → replied → booked. We publish the fields, not the values. No reply rate, meeting count or send volume of ours has been cleared for a public page, so none appears here.
How do you avoid burning a domain or getting a LinkedIn account restricted?
Three mechanisms: conservative per-channel caps set in code (30 emails an hour, 15 WhatsApp messages an hour, 20 LinkedIn actions per day, because that adapter drives a real logged-in account), a 09:00-18:00 Asia/Beirut weekday send window, and a scheduled agent that can report a problem but cannot change campaign state. We run no inbox warm-up, no domain rotation and no deliverability monitoring, and will not describe infrastructure we have not built.
What does this system not fix?
A wrong ICP and a weak message. The pool decides who gets contacted, the offer decides what they read, and the engine only executes — faithfully, at volume. Automation amplifies the message it is given rather than improving it, which is why the first week of any engagement is spent on the ICP definition and the offer rather than on the sequence.
Can you run this for my company, and in which markets?
Lead Generation and Outreach is a capability line on Cortex, powered by LeadsMind, in Lebanon and the UAE. Be aware of the stage: Cortex is in testing with design partners and LeadsMind is launching, so this is not a product you can sign up for on a pricing page today. Tell us what you sell and who you sell it to and we will show you the gate and the funnel fields with our own numbers in them.
How is this different from buying seats on Apollo or ZoomInfo?
Ownership of the mechanism. Sourcing, address discovery, scoring, sequencing and reply routing sit in one system we operate, rather than a data subscription plus a separate sequencer plus a separate inbox. Apollo and ZoomInfo hold verified-contact databases at a scale we do not, so the trade is real in both directions. We publish no cost comparison.


