Outbound prospecting without buying a list
Prospecting here starts from criteria and public research rather than an uploaded list, attaches evidence to every claim it records, and stops at a compliance check before anything is sent. The rule that shapes the whole thing is that no email address is ever guessed: a prospect with no discoverable address stays researched and takes a different next action.
The stages, in order#
- Discovery criteria — what kind of organisation, where, and why.
- Candidate collection — the organisations that match.
- Public-source research — what can be established about each.
- Evidence capture — the source behind each claim, attached to it.
- Qualification and scoring — which are worth a person approaching.
- Contactability — whether a real, discovered route to a human exists.
- Compliance check — suppression, unsubscribe, complaints, do-not-contact.
- First outreach — under the channel autonomy rule, like any send.
- Reply classification — what the answer means.
- Opportunity or stop — the pipeline, or a recorded end.
Stages six and seven are where most of the attrition happens, and both are deliberate. prospect_identity_resolution also stops an organisation you already deal with being approached as though it were new, which is a quieter failure than a bounced address and a more expensive one.
Why no address is ever guessed#
No pattern-generated address is produced, tested, or sent to. Not first.last, not initial-surname, not a mailbox that 'usually' exists at a domain. prospect_contacts.py is the module and the refusal is absolute.
The cost of that is volume, and it is paid knowingly. Guessed addresses produce bounces, spam complaints and domain reputation damage, and the damage lands on the same mailbox your customers write to. A researched prospect with no address is still worth having: it keeps its evidence and gets a next action that does not depend on an address existing.
Evidence, and what it changes#
- A claim without evidence does not reach the record
prospect_evidence.pyattaches the source to the claim. What survives into the prospect record is therefore checkable, which is what makes it usable in a first message without embarrassing anybody.- Research spend is routed
prospect_cost_router.pyruns a deeper pass only where it can change a decision. A hundred shallow prospects and ten researched ones are not the same purchase, and the router is why.- Freshness governs re-research
prospect_freshness.pydecides when what is known has aged. Re-researching everything on a schedule is the expensive way to be wrong less often.- Counting is done by the database
- The old summary derived every headline from the newest 500 rows, so a workspace with 540 contacts was told it had 500 organisations — really 530 — and none already contacted, when 40 were. Contacts are counted in batches now, each batch fetched in one query, and organisations are counted by the database.
What has to be set up#
| Thing | Why | Consequence if skipped |
|---|---|---|
| A sending mailbox with a role and signature | Outreach and a customer reply are two paths with different gates and are never merged | Outreach on the mailbox customers write to, which is not what you want |
| Knowledge about what you actually sell | The message has to be grounded, and a commercial term must be supported | Refusals instead of messages |
| Autonomy set for outbound explicitly | Outbound is where ask_before_send earns its cost most clearly | Messages you would not have approved |
| Discovery criteria that describe a real segment | Everything downstream is filtered from this | Research spend on organisations nobody wanted |
| Somebody who reads Needs You | Approvals, refusals and compliance stops all surface there | A queue that grows |
The limits, plainly#
- No SMS prospecting. Outbound SMS is provider-dependent and the live carrier carries none. In India commercial SMS also needs DLT registration with the operators.
- No cold calling from discovery. Phone follow-ups are placed under the same gates as any outbound call, but a discovered organisation is not a call list, and a number found by research is not consent to ring it.
- No do-not-contact override. The compliance check is one place and the Assistant cannot clear a do-not-contact entry, whatever it is asked.
- No invented commercial terms. A price or an SLA in an outreach message has to be something Knowledge supports; otherwise it is refused and escalated.
Questions#
Can I upload a list I already have?
Yes — prospect upload exists, and an uploaded record goes through the same compliance check and the same evidence rules as a discovered one. What the upload does not do is make a guessed address acceptable: an address that arrived in a spreadsheet is an address somebody provided, and the responsibility for where it came from stays with the workspace that uploaded it.
Why did prospecting find fewer contactable organisations than I expected?
Usually contactability, which is the stage that refuses to invent a route to a human. It can also be identity resolution removing organisations you already deal with. Both are visible on the prospect record with the reason attached, so the shortfall is explainable rather than mysterious.
How much research does each prospect get?
As much as can change a decision and no more. The cost router runs the deeper pass selectively rather than uniformly, and freshness decides when an existing record is old enough to be worth revisiting. That is why a big shallow sweep and a small deep one bill very differently.