Outbound qualification
Lead qualification engine
Reads public business listings, audits every website, and puts a ranked batch in front of a person. Most of the work is deciding who not to contact.
12,370
listings read in one run
Public business listings across 60 cities.
One run, 4 Oct 2026
2,739
sites held back before a word is written
330 carried another business's name; the rest did not load or had nothing worth raising.
One run, 4 Oct 2026
0
repeat sends
Checked by business and by address.
9 Sep – 3 Oct 2026
The actual tool

The same figures, restyled
One run · 4 Oct 2026
- Discover12,370
- Filters8,184
- Audit7,632
- Fit gate5,445
- Recipients3,008
- Batch250
Counts from the run. Each stage keeps only what passed.
The problem
Before and after
Before
- A list from a map search, sorted by nothing.
- Addresses copied off web pages, valid or not.
- The same owner reached twice through two listings.
- Sending stops when someone remembers to stop it.
After
- Every site audited and scored; sites that fail to load, belong to another business, or have nothing to raise are held back.
- Every address matched against a strict pattern, then checked by a verifier, before it is used.
- One sent-log, checked by business and by address.
- A bounce-rate breaker halts sending. A person approves each day’s plan.
Coverage — one run, 4 Oct 2026
Sixty cities read. Most of what was read never reaches a person.
One ring per city, sized by listings read; the filled disc is what passed the fit gate.
12,370
listings read
5,445
passed the fit gate
| Area | Rank | Read | Passed |
|---|---|---|---|
| City A | 1 | 1,862 | 854 |
| City B | 2 | 646 | 257 |
| City C | 3 | 559 | 243 |
| City D | 4 | 455 | 251 |
| City E | 5 | 445 | 139 |
| City F | 6 | 404 | 184 |
| City G | 7 | 401 | 247 |
| City H | 8 | 398 | 226 |
| City I | 9 | 371 | 162 |
| City J | 10 | 366 | 114 |
Run replay
One run, stage by stage.
From 12,370 public listings to a batch of 250: 4,186 dropped by hard filters, 552 sites that did not load, 2,187 held back by the fit gate, 2,437 with no usable recipient, then the top 250.
Design decisions
What we chose, and what we turned down.
The fit gate and the opening line are code, not a model.
Rejected
Have a model read each site and write a personal opening line.
Why
A line that goes to a real business can only restate a field the audit measured. A lookup table cannot invent a fact; a model can, and nobody reads 250 lines for it. Where the audit’s vocabulary is still thin, an unclassifiable booking path gets copy that makes no booking claim.
An address is validated twice: when it is extracted and again when it is used.
Rejected
Validate once, at extraction.
Why
Cached audit records are returned as stored, so they never pass a rule added later. One definition of “an address we will try to send to”, applied at both ends, fails closed.
A bounce-rate breaker with no timer.
Rejected
Pause for a day, then resume.
Why
The rate is measured over the last sends, so waiting changes nothing; the cause is in the data. Above 8% over the last 100 known sends the gate holds until a person fixes the cause and overrides on purpose. A newer mailbox halts at two hard bounces.
Deduplicate by address as well as by business, in a ledger this system owns.
Rejected
Key the log by business only, in a ledger shared with other systems.
Why
Two listings once published one owner’s mailbox; a business-keyed log would have written to it twice, minutes apart. A shared ledger ties this system’s failures to every other’s, so this one reads outside ledgers and never writes them.
Human in control
What a person still decides
The plan is computed before the day starts. Nothing sends until someone approves it on a local page. If no one does within 12 hours, the page closes and nothing is sent. Replies are drafted by the system and sent only after approval.
| Business | City | Address check | Contacted before |
|---|---|---|---|
| Example Guesthouse A | Example City | ok | no |
| Example Guesthouse B | Example City | risky | no |
| Example Guesthouse C | Another City | refused | no |
| Example Guesthouse D | Another City | ok | no |
The hard part
Placeholder addresses reached the send gate
In the first batch, 3 of 60 leads carried only obfuscated placeholder addresses, such as a masked “co*****@***.com”. Every send attempt to them failed over four days.
The extractor took mailto links verbatim. We required a full match against a strict address pattern.
Over the next five days the same masked values kept reopening the send gate.
Cached audit records are returned as stored. They had never passed the new check.
One definition of a sendable address, applied at extraction, on cached records, and again at send.
A malformed address cannot reach a send, whichever path produced it.
Stack
Python; a headless browser for listing discovery; a self-hosted address verifier; a transactional email API and an SMTP mailbox; scheduled jobs. State is JSON, written to a temp file and renamed, so a crash cannot leave half a file.
Cost to run
The qualification path makes no model calls and pays no per-lookup fee.
Where this engineering shows up
Start here
Know which vendors are actually covered. Every week, without chasing anyone.
Within 7 business days you get a deficiency report: each certificate, each requirement it fails, and the page that shows it. No contract, no sales call.