Free code and guide
LEADS: find the owners ready to sell
Built for business brokers. Every morning it finds the companies in your trades that have been around for decades, scores which owners are likely to sell, writes them a confidential letter, and finds the buyers.
Your next listing is already sitting in a government database. You just don’t know which owner is ready. This kit reads the state registry, each company’s own website and the state license roster, and puts sellers and buyers in one sheet before you finish your coffee. No rented lists, no scraping tools. Official data and public websites.
Want our team to build it? See the done for you version
What you get
The files
- leads-kit.zipEverything in one folder: the scripts, prompts, templates and schedule files. Unzip it and hand it to your AI.
- 00-README.mdThe full guide: quickstart, keys and costs, every step, rules, troubleshooting.
- web-check.mdThe prompt that has your AI verify the top 25 on the web before you reach out.
- owner-letter.mdThe confidential owner letter.
- scoring-rubric.mdEvery signal and how many points it is worth.
Every file, plus the setup prompt, the web check, the owner letter, the email and call script, the scoring rubric and the buyer intake in full with a copy button, is in the full kit below.
How it works
Six steps, one command
- 1. Find: every company in your trades and your metro that registered with the state 20+ years ago. Official open data, free.
- 2. Read: each company's own website: founder's name, "since 1978", family owned, kids in the business, a site nobody has touched in years.
- 3. Check: the state license roster. An owner licensed since 1979 has been at it 45+ years. A lapsed license means skip it.
- 4. Score: how likely the owner is to sell in the next 12 to 24 months, with a plain English reason on every row.
- 5. Write: a confidential letter, email and call opener for the top 25, using only that company's real facts.
- 6. Flip sides: new holding companies and platforms in your industry that just raised money (SEC Form D), with the names of who filed.
It all runs with ./run.sh. Run it every morning and out/TODAY.md shows only what’s new since yesterday: new A tier sellers, new buyers, drafts waiting for you. Nothing is ever sent for you.
A real run
Denver, three trades, one morning
Our team pointed it at the Denver metro, HVAC, plumbing and landscaping, companies registered before 2006. One run:
| What | Result |
|---|---|
| Companies found in the state registry | 496 |
| A tier (call this week) | 12 |
| B tier (letter list) | 118 |
| Drafts written (letter, email, call opener) | 25, none sent |
| Buyer signals (SEC Form D, last 2 years) | 14 |
| Facts checked by hand against BBB, company sites, county and state license records | 58 of 62 right (32 companies) |
What the top of the list looked like (no names, on purpose):
- A plumbing and heating company 40+ years in business, with the founder's family name on the door and an owner who has held a plumbing license for over 40 years.
- A plumbing company in business since the 1950s, still run under the family name.
- And the ones it pushed down: a company that already changed hands, and one where the kids already run it.
We are not posting that sheet: it names real owners, and confidential means confidential. Point it at your own market and you get the same sheet, the drafts and the buyers in a few minutes.
What you need
Keys and cost
| Thing | Needed? | What it adds | Cost |
|---|---|---|---|
| State registry, websites, licenses, SEC filings | Built in | The whole list, the score and the buyers | Free, official data |
| OpenAI API key | Optional | Writes the drafts. Without it you get a prompt file to paste into ChatGPT or Claude | A few cents for 25 drafts |
| Google Places API key | Recommended | Phone, website, rating, review count and latest review for most companies, automatically | 1,000 free a month, then $35 per 1,000 (Google's pricing page) |
Colorado and New York are built in. Any other state: the setup prompt has your AI find your state’s business registry and license roster and plug them in. Most states publish both.
Continue the setup
Unlock the full guide
Get every setup step, prompt, checklist, and local download.
By unlocking, you agree to get emails from QWave Labs about new free tools, tips and offers. Unsubscribe anytime. Privacy policy
Free
The files
- leads-kit.zipEverything in one folder: the scripts, prompts, templates and schedule files. Unzip it and hand it to your AI.Download
- 00-README.mdThe full guide: quickstart, keys and costs, every step, rules, troubleshooting.Download
- web-check.mdThe prompt that has your AI verify the top 25 on the web before you reach out.Download
- owner-letter.mdThe confidential owner letter.Download
- scoring-rubric.mdEvery signal and how many points it is worth.Download
The 10 minute version
Let your AI set it up
Step 1
Install an AI agent
Claude Code, Codex, or any AI agent that can run code on your computer. You also need Python 3.9 or newer (on a Mac it’s already there).
Step 2
Download the folder
Download
leads-kit.zipabove and unzip it. You get aleads-kitfolder with the scripts, prompts, templates and schedule files.Step 3
Paste the setup prompt
Open your agent in that folder and paste this. It asks for your state, your metro, the two or three trades you broker and your name, then runs it once and shows you the top 10.
The setup promptsetup.mdDownload # Setup prompt (first time, 10 minutes) Paste into Claude Code or Codex inside the unzipped leads-kit folder: ``` Set up this LEADS kit for me. Read 00-README.md first. 1. Create a Python venv in ./venv and install requirements.txt. 2. Copy leads.env.example to leads.env. Ask me for: my state, my metro's cities, the 2-3 industries I broker, my name + firm, and my email for LEADS_UA. Fill them in. 3. If my state isn't CO or NY, find my state's official business-entity open data (Socrata/ArcGIS or a bulk download) and its contractor license roster, and add them to registry.py / licenses.py the same way CO is done. 4. Run ./run.sh once and show me out/TODAY.md and the top 10 of out/sellers_scored.csv. 5. Don't schedule anything until I say so. Never send outreach. ```Step 4
Verify the top 25
Before you reach out to anyone, have your AI check the top of the list on the web: current owner, phone, and whether it already sold or the kids took over. The next run merges what it found and re-scores.
The web check promptweb-check.mdDownload # Web check: verify your top leads like a researcher (Claude Code or Codex) Paste this into Claude Code or Codex, opened in your leads-kit folder. It turns the scored list into facts you can trust. ``` Read out/sellers_scored.csv. Take the top 25 rows by sell_score. For each company, search the web (company site, BBB profile, Google Business listing, state license lookup, local news) and verify or fill: phone, website, email (only if published by the company), owner_name (the current owner or president), owner_source (where you saw it), handoff_text (a past family handoff, quoted), new_owner_text (any sign it was ALREADY sold or acquired, quoted), verified_sources (the URLs, separated by " ; "), verified_note (one or two sentences a broker needs: e.g. "sons run it now, internal succession likely"). Rules: - Public business information only. Never guess. Leave a cell empty if you can't verify it. - Keep the "name" column EXACTLY as it is in sellers_scored.csv (it's the merge key). - Do not contact anyone, fill any form, or sign up for anything. Write the result to out/web_verified.csv with columns: name,phone,website,email,owner_name,owner_source,handoff_text,new_owner_text,verified_sources,verified_note Then run: python3 merge.py --in out/registry_old_$STATE.csv --with out/web_verified.csv and python3 score_sellers.py --in out/registry_old_$STATE.csv --out out/sellers_scored.csv Show me the new top 10 with one line each on why. ``` The next ./run.sh merges out/web_verified.csv automatically, so you only verify each company once.
The score
What makes an owner likely to sell
Every company gets points for the signals brokers actually look for, and loses points for the ones that waste a letter. Every row says why.
# Likely-to-sell-in-12-24-months score (score_sellers.py)
| Signal | Points | Where it comes from |
|---|---|---|
| In business 20 / 30 / 40+ years | +12 / +20 / +26 | state registry formation date, or "since 19xx" on their site |
| Owner's trade license held 30 / 40+ years | +12 / +18 | state license roster (Colorado DORA) |
| Individual is the registered agent (owner-operator) | +10 | state registry |
| Family name on the company | +10 | name matches owner/agent surname |
| "Family owned" on the site | +6 | their website |
| Owner talks about retiring / succession | +25 | their website (quoted) |
| Website untouched for years (old copyright) | +8 | their website footer |
| Not mobile friendly / no https | +5 / +3 | their website |
| Places confirms they have no website | +6 | Google Places |
| Core trade, 1-3 locations (Main Street sweet spot) | +8 / +8 | name + listing |
| Good rating but reviews slowing down | +4 / +6 | Google Places |
| Past family handoff (2nd generation already took over) | +6 | their website |
| Kids already in the business | -25 | their website ("my sons run...") |
| Web check says skip (no footprint, shell or sister entity) | -40 | `skip_reason` in web_verified.csv |
| New owner / already acquired | -20 / -25 | their website, BBB, registry agent change |
| Business license lapsed | -20 | state license roster |
| Online booking (actively investing) | -3 | their website |
| Supplier / too big | -15 / -10 | name |
A = 60+ (call this week), B = 40-59 (letter list), C = watch list. Every row carries a plain-English "why".
Check these by hand once a week. No API, and don’t scrape them:
- BizBuySell and BizQuest: listings in your trades that disappear without a sold note are owners who tried and stalled.
- Your local business journal: family business and anniversary stories. Fifty years in business is a conversation.
- Practice owners: the kit can pull dentists, CPAs or vets licensed 30+ years in your metro from the state roster.
Outreach
Letters owners actually open
Owners in their 60s and 70s don’t answer cold emails from strangers. A printed, hand signed letter marked Personal & Confidential sits on the desk until they’re ready. The drafts open with one true thing about their company, never assume they want to sell, and never say how you found them.
# Owner letter (printed, Personal & Confidential)
Mail beats email for owners in their 60s and 70s: it's private, it gets opened, and it can sit on a desk until they're ready.
write_outreach.py fills one of these per lead from real facts. The shape:
```
Personal & Confidential
[Owner name]
[Company]
[Street]
[City, State ZIP]
Dear [Mr./Ms. Last name],
[One true, specific line: "[Company] has served [City] since [year], and the [Family] name is still on the door."]
I'm [Name] with [Firm]. Owners in [trade] often ask me what a business like theirs would be worth today.
If that's ever useful, I can put together a free, confidential valuation range and show you what buyers are
paying for [trade] companies in [metro]. No obligation, and nobody else will know we spoke.
[Soft close: "If you'd ever like that, my direct line is below."]
Sincerely,
[Name], [Title]
[Firm] · [Phone] · [Physical address]
```
Rules: never say "retire" or "sell" unless the owner said it publicly. Never mention how you found them
(registry, license roster, score). Hand-sign it. Follow up once, 3-4 weeks later, then leave it.
# Email + call opener
## Email (max 110 words)
Subject: Confidential valuation range for [Company]
```
Hi [First name],
[Company] has been serving [City] since [year], and the [Family] name is still on the company.
I work with owners in [trade] who want to know what their business would be worth today. I can share a free,
confidential valuation range and what buyers are paying for companies like yours, no obligation.
Would that be useful?
If this isn't relevant, reply 'no' and I won't reach out again.
[Name], [Firm], [physical address]
```
CAN-SPAM (US, applies to B2B too): honest From and subject, your physical postal address, a clear way to opt out,
honor opt-outs within 10 business days. Send from a separate domain with SPF, DKIM and DMARC set, keep volume low
(20-40 a day, by hand), and keep spam complaints under 0.3% (Gmail/Yahoo sender rules; aim for under 0.1%).
## Call opener (10 seconds)
```
Hi [First name], this is [Name] with [Firm]. [Company] has been in [City] since [year], and I help owners in
[trade] see what their business would be worth, completely confidential. Is now a bad time for 30 seconds?
```
If they say no: thank them, mark them do-not-contact, move on. Don't cold text: texting without consent is a TCPA risk.
This is where it gets heavy: your state’s data, the web checks, the mail merge, the follow ups. If you’d rather have it built and running for your market, our team does that. Book a call with our team
The buy side
Find the buyers too
The kit reads SEC Form D filings for new platforms in your trades that just raised money (names like "HVAC Holdings" or "Plumbing Partners"), with the people who filed, plus new local holding companies from the state registry. Add searchers, independent sponsors and local operators by hand, and qualify every buyer before you show them anything.
# Buy side: find and qualify buyers
## Where buyers come from
| Source | What you get | How |
|---|---|---|
| SEC EDGAR Form D (free, official) | New "HVAC Holdings", "Plumbing Partners" platforms that just raised money, with the people's names | buyers.py |
| Your state registry (free, official) | New local holdcos: "<Trade> Holdings / Acquisition / Capital LLC" | buyers.py |
| Searchfunder.com | Searchers (ETA) and their target criteria | search "HVAC" / "home services" / your state, read profiles |
| LinkedIn | Search funds, independent sponsors, PE operating partners | search: "search fund" OR "acquisition entrepreneur" "HVAC" ; "operating partner" "home services" |
| Axial | Lower-middle-market PE and family offices with buy boxes | create a free member profile, read buy boxes |
| Competitors | Local multi-location operators already buying | your seller list: companies with "acquired", "now part of", new owner signals |
| Job posts | "Director of M&A / Corporate Development, home services" | LinkedIn or Indeed search |
## Intake questions (first call)
1. What size: revenue / EBITDA range? 2. Trades and geography? 3. Equity: committed fund, search fund investors, SBA?
4. How many deals closed in the last 24 months? 5. Owner stay-on and earn-out expectations? 6. Timeline to LOI?
Daily automation
Waiting for you at 7am
One line in cron runs it every morning. Or have Claude Code or Codex run it, fix anything that broke, and verify the new A tier companies for you. On a Mac that sleeps, use the launchd file in the kit so it runs when the Mac wakes up.
# Daily agent prompt (what the 7am job asks Claude Code / Codex to do)
```
You are my lead researcher. In this folder:
1. Run ./run.sh and wait for it to finish. If a step fails, read logs/ for today, fix the cause
(bad dataset field, timeout, a site that changed) in the script, and run again. Don't delete out/.
2. Open out/TODAY.md. For every NEW A-tier seller that has no verified_sources yet, do the web check
from prompts/web-check.md (max 10 per day), append to out/web_verified.csv, then re-run merge.py + score_sellers.py.
3. Re-run write_outreach.py for the top rows so the drafts use the verified facts.
4. Update out/TODAY.md with: new A-tier sellers (name, owner, phone, why), new buyers, anything that looks
already sold or handed to the kids (move those down), and how many drafts are waiting for me.
Never send any email, letter, text or message. Never fill forms. Public business info only.
```
Run a service business?
Same engine, finding customers
Flip one setting and it points the other way. Every company registered in your metro in the last two days needs insurance, bookkeeping, a website, signs, payroll. Every new pool permit needs a fence and landscaping. It finds them each morning and writes an opener from that real signal.
- New companies: the state registry, last 2 days, your metro.
- New permits: city open data. Austin, Chicago and Los Angeles are built in; your AI can add your city.
- Other broker niches: change the trades to auto repair, dental, CPA firms, anything with a name pattern or a license.
Read this once
The rules
- Public business information only. Everything comes from official open data or the company's own website, and the scripts respect robots.txt.
- Nothing sends for you. You read every draft and decide.
- US email (CAN-SPAM covers B2B too): honest subject, your physical address, a clear opt out, honored within 10 business days.
- Send from a separate domain with SPF, DKIM and DMARC set up, keep volume low, and keep spam complaints under 0.3% (Gmail and Yahoo sender rules).
- Call business lines. Don't cold text.
- UK and EU: cold email to sole traders needs consent, letters are the safe channel, and GDPR applies.
- Confidential means confidential. Never tell anyone which owners you're talking to.
Go deeper
The free pieces
- The brain: our full AI vault setup
- The order: the 5 step climb to running your business on AI
- Everything else: all our free resources
Done for you
Want it done for you?
You can run this yourself. If you’d rather have it built for your market and running every morning, that’s what our team does.
Book a call with our teamWho it’s for
Business brokers and M&A advisors who want a steady list of owners worth calling, and service businesses who want new customers the day they show up, without spending weeks wiring data sources together.
What you get
- The engine set up for your state, your metro and your trades, including your state's registry and license data
- Web checks on the top of the list so you only reach out to real, verified owners
- Drafts in your voice, with approval rules so nothing goes out without your OK
- The daily run on a schedule, with a morning summary
- A walkthrough so you know exactly how to run it
What happens on the call
We look at your market, the deals you want and how you find owners today, and we tell you what we’d build first. If it’s a fit, we map out the build. If it’s not, you still leave with the plan.