
Every cleaning business acquisition starts the same way: finding an owner ready to sell.
The right age. The right revenue. The right geography. No succession plan. And no one has ever sat down with them to discuss what the business is worth.
There are hundreds of these businesses in the UK. The problem is finding them without spending 50 hours on a spreadsheet.
Before I automated this, building a list took three to four minutes per company. 900 companies. 50+ hours of work with almost no opportunities, fewer conversations, and zero heads of terms. I was spending mornings, lunch breaks, and evenings running the same manual routine. My goal was to sign the first heads of terms by the end of Q2. That process wasn’t going to get me there.
Since automating it, eight positive replies from 425 contacts. Two opportunities are ready to sign NDAs. The pipeline tripled.
Eight replies aren’t a finished pipeline. It’s proof that the machine is working.
This post breaks down the OutboundOS — the automated system I’ve built to find acquisition opportunities at scale.
Where it started
Before I automated anything, building a list looked like this:
Open Plimsoll. Run the search. Screenshot the results.
Open Companies House. Find the director. Note the name and age.
Open Hunter. Search the company domain. Copy the email.
Open the spreadsheet. Paste the row. Repeat.
Open Google. Search LinkedIn and Apollo for manual enrichment.
Roughly three to four minutes per company. At 900 companies, that’s 50+ hours of work that built a pipeline unfit for purpose.
Something had to change.
What I built instead
One command. One double-click from my homescreen. Four prompts — input file, test mode, run Hunter, push to HubSpot. Press Enter. Ten to twenty minutes later, it’s done.
The system reads the Plimsoll export, deduplicates against every company already processed, and scores each one against three factors:
Revenue (£1M–£5M)
Director age (50 or above)
Geography (54 postcode prefixes across London & the Home Counties, the South Coast, and the Midlands)
Three tiers:
Tier 1 has all three — full enrichment, HubSpot, priority outreach.
Tier 2 is missing one or more — enriched but deprioritised.
Tier 3 is below £600K or outside geography — logged, not touched.
Then enrichment. Hunter runs against every qualifying domain first. On the first run of 902 companies, it returned addresses for 510. The 392 Hunter couldn’t reach, go through a Chrome enrichment script that searches Apollo and LinkedIn in batches of 25. What Chrome can’t find goes to a manual workbook — Tier 1 and Tier 2 only, worked by hand. 50+ hours reduced to 75 minutes.
Every address runs through MillionVerifier. Hard bounces are filtered before anything touches HubSpot.
Then HubSpot. Every contact is populated with revenue band, director age, geography, tier, enrichment source, and outreach sequence. Contacts are filtered into lists: active in a current campaign, or ready for the next launch.
Campaigns are pre-populated in Instantly. I’ve been testing four sequences over the last ten weeks. When they end, I’ll refine the best-performing ones before the next launch.
Then the campaign goes live. Manually. Every time. Ten minutes of review before 400+ emails go out.
How it was built
I’m not a developer. Ive never written code. Every script in this pipeline was built by Claude.
I described what I needed. Claude built it. I tested it. We iterated until it worked.
The full build took nearly two weeks and around 24 hours of working sessions. Each day had a defined output — Hunter script, MillionVerifier integration, HubSpot import, Make scenario — and Claude wrote, debugged, and rewrote each component until the end-to-end test ran clean.
To be clear: a non-developer built a nine-tool automated acquisition pipeline in under two weeks. No agency, no freelancer, and no prior experience writing Python.
The implication is simple: operators can now build acquisition-grade systems without technical staff or a developer budget.
The stack
Nine tools. Each one has a defined job. None of them are expensive. Claude Code connects them.
Plimsoll — target identification and financial screening
Companies House API — director verification
Hunter — email derivation from company domains
Million Verifier — bounce removal before CRM entry
HubSpot — CRM of record; contact management, deal pipeline, campaign lists
Make — reply automation; five-branch scenario handling
Instantly — outreach campaigns
Claude Code — every script, every integration, every fix
Superhuman — reply management
The full stack costs £8 a day.
Where it nearly broke
The version above is the one that survived. It didn’t work like this the first time, or the third.
Claude crashing Plimsoll. The original plan was for Claude to automate the Plimsoll search via Chrome. Run the search, star the matching companies, download the PDF, and hand it to the pipeline. Plimsoll’s JavaScript-heavy interface kept crashing the session. After three failed build attempts, the Plimsoll step stayed manual. Five minutes per batch, done by hand. Some things aren’t worth fighting.
Make credits burn without guardrails. Early in the Make build, a scenario loop burned through all my monthly credits in a single test run. No error handling. No iteration cap. Fix: hard limits added to each branch and a credit-monitoring alert before every test.
Chrome enrichment getting blocked. The Chrome enrichment script got flagged by CAPTCHA across Google, Bing, and DuckDuckGo. The script works in controlled batches. At scale, it doesn’t. Manual enrichment via the Apollo web UI is the fallback for Tier 1 & Tier 2 misses. Some automation ceilings are real, and hitting them is part of the build.
The pipeline works. But not on the first attempt. What’s running now is what made it through the testing.
The reply layer
Replies land in Superhuman from Instantly. Five types:
Positive — interested, wants a call. Discovery call booked within 48 hours.
Not now — not ready. Nurture sequence starts, follow-up task set.
Negative — not interested. Closed, no further outreach.
Unsubscribe — actioned same day. Don’t wait for the automation. GDPR.
No reply — sequence complete. Contact held for a 90-day cooling period.
Make handles every type except Positive — categorises it, sets reply_type it in HubSpot, and fires the appropriate sequence.
I only handle the Positive replies. Always human, always within two hours.
The human factor
The pipeline is 95% automated. The 5% that isn’t is deliberate.
Plimsoll — no API. ~5 minutes per batch. The pre-screen is judgment: residential-heavy, construction-adjacent, subsidiary? Cut here, not later.
Pre-send review — ~10 minutes. Human sign-off before every campaign goes out.
Positive replies — always human, always within two hours of a positive flag.
What this is building toward
OutboundOS is Stage 1. It exists to generate the discovery call.
What happens on that call — how I qualify a target, the framework I use to decide whether to move forward or walk away, and what the first conversation with an owner actually looks like — that’s the next step.
I’ll share it here once built.
That’s all for this week.
Matt Harris
The Growth Lab
The Growth Lab Capital acquires Soft FM businesses (cleaning, waste and grounds maintenance) across the South East. If the thought’s crossed your mind — even quietly — I’m worth a conversation. No broker. No pressure. Book a time here.
The Growth Lab newsletter is a playbook for buy-and-build by Soft FM operators. Deals, growth, operations — no theory, no fluff. Subscribe for the next one.
💼 Daily on LinkedIn — Soft FM buy-and-build, deals, and market intel across FM, housing associations, and construction. 4,000+ follow. Join them here.
𝕏 Building this in public on X. Soft FM. Buy & Build. Same operator, less polish. Follow here.