I find where a sales pipeline leaks, then I build the fix.
GTM engineer · signal-based outbound · London
A pipeline is the list of companies you are talking to, from first contact to a signed deal. Outbound means I contact them first, before they come to you. A signal is a public event that shows a company is about to need what you sell. Below are nine plays. Eight were built for different companies, and one is running for my own job hunt right now. Each shows the signal, the system I built, what came back, what it costs to run, and what I changed along the way. Then the tools I run on, the content, and a guarantee.
15+clients
1 of 10speakers · Claude Code Community Events London · 10 June
9GTM plays, eight for companies, one for my own job hunt
the plays
02
Nine plays, eight companies
Funnel job: proof · each play is a complete funnel
A funnel is the full path from a stranger to a paying customer. Each play was built for a different business selling to a different market. Each one shows the signal, the tactic, the offer, the close, and what came back. These plays are private work. I will walk you through any of them, but I will not hand them over.
play 01
SaaS01 · for a seed-stage B2B SaaS vendorThe absence graphCompanies that have grown enough to need a first salesperson, but have not hired one yet. Their first sales job post starts the outreach.+
314companies tracked41crossed a strike window inside 90 days23%connect-accept on the window cohort6meetings held
The cost
$632-682 +extrasto run, per month$105-114per qualified meeting
The pushback
"We're about to hire for this."
The answer: That is the best possible moment. That hire starts in about 3 months and is up to speed in 6. A sales process already running is something they inherit.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: email every company on the crunchbase list in the week it raises money+
The offer: A B2B SaaS product sold to founders of seed and Series A companies. These companies have grown past the founder selling alone, but have not made a sales hire yet.
Email every company on the Crunchbase list in the week it raises money.
Message anyone who is "hiring", without checking what the role is or whether it is their first sales role.
Send the same congratulations note that every other vendor sends that week.
1 · The signals4 signals. Primary: First job post for a sales, growth or RevOps role+
4 signals, 1 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryFirst job post for a sales, growth or RevOps roleTheirStack hiring-signal alerts; PredictLeads Job OpeningsA signal is a public event that shows a company is about to need this. Here, the founder has just decided the company needs a sales role. My message arrives while that decision is fresh.
supportingZero people in Sales, 8 or more staffLinkedIn Sales Navigator Department headcount filter; Premium InsightsThe company is big enough to need a sales hire, and it has none.
supportingA sales tool appears in their softwarePredictLeads Technology Detections; BuiltWith re-index alertsA CRM or an email sequencing tool before the hire means someone is building the sales process by hand.
supportingFounder likes or comments on go-to-market posts on LinkedInTrigify profile-engagement alertsThe founder is reading about this problem this week. This only sets when I send, never whether I send.
2 · QualifyThe roster (the companies I watch): raised in the last 6 months, 8-40 staff, no one in Sales+
The roster (the companies I watch): raised in the last 6 months, 8-40 staff, no one in SalesEach week I pull new funding rounds from Crunchbase. Then I check Sales Navigator for Department headcount (Sales) = 0. If the company has under 30 profiles, I run a people search instead.
The strike (the moment a roster company posts its first sales role)TheirStack sends an alert for sales, AE, growth, RevOps and GTM job titles, filtered to roster companies. The day the post is first seen starts a 14-day window to send.
Move up the list: one more signal inside 30 daysA new sales-tool detection or a founder engagement alert moves the company to the top of the day's list. Neither one starts outreach on its own.
B2B SaaS, based in the US or UK, none of the exclusions applyOut: already has Sales staff. The round is over 12 months old. Product-led only (PLG), with no sales process. A rival tool in their software. A hard no in the last 180 days.
3 · Research + assetAsset: The first message carries an image: a real screenshot of their job post, with one circle and a 1-3 word tag+
What I gather on each lead:
The dossier is one research file per company. First, the raise: date, round, amount, lead investor (Crunchbase).
Staff count by department, now and 6 months ago.
The job post: title, date first seen, URL, what the role covers.
Three similar companies, and their Sales headcount two quarters later.
The asset built for them: The first message carries an image: a real screenshot of their job post, with one circle and a 1-3 word tag. If they ask, a one-page PDF graph in their brand colours.
Built with: Deepline (adds company data, spots job changes, Postgres database); Claude (research agent, writes the dossier); Playwright (takes the screenshots); Python (draws the circle and tag, renders the graph)
4 · Outreach5 steps: LinkedIn message to the founder, sent through Unipile; Email through SmartLead, if they do not accept the connection in 7 days+
Channels: LinkedIn message to the founder, sent through Unipile; Email through SmartLead, if they do not accept the connection in 7 days
1 · LinkedInConnection request, no note Sent the day the job post is first seen.
2 · LinkedIn message, once they acceptScreenshot of their job post with a circle and tag, 30-60 words Names the job post. Asks if the hire fills a gap or follows a plan.
3 · LinkedIn message, day 3Plain text, one line from the dossier What three similar companies did with Sales headcount after their raise. Offers to send the full readout.
4 · LinkedIn message, day 8One-page PDF of the graph, attached Sends the readout. I only ask for a call after they reply.
5 · EmailPlain text, no link, no attachment The step 2 message in four lines, for founders who never accepted the connection.
Connection requests: 15-25 on weekdays, 3-5 at weekends, 07:00-19:00 their local time. Pause if fewer than 30% of requests are accepted.
The first message goes only after they accept, and it never asks for a call.
The screenshot is a real capture of their page. If I cannot capture it, the first message is text only.
A person approves every message and reply before it sends.
Every message is written at a 5th-grade reading level. One idea per sentence.
5 · Handling repliesYes: Reply with two time slots and a Cal.com link+
Yes →Reply with two time slots and a Cal.com link. The dossier becomes the call prep.
Question →Claude drafts an answer from the dossier and the thread. A person edits it, approves it and sends it.
Pushback →"About to hire": one reply back, that the new hire inherits a sales process already running. Then I close the thread.
Silence →Second message on day 3, third message on day 8, then one email. Then park the company until something new happens.
6 · The content sideOne LinkedIn post a week+
Content: One LinkedIn post a week. It shows one absence graph with the company name removed: raise date, staff by department, the month of the first sales post, and similar companies.
Free item offered: A free PDF: how many months each company took from its raise to its first sales job post.
7 · How it improvesFeed won deals back into the window scoring+
Feed won deals back into the window scoring. Then each window is ranked by which order of signals actually led to a sale.
8 · What it taught meEveryone emails when a company raises+
Everyone emails when a company raises. Few wait for the first sales job post.
Staff count by department shows the gap. Total staff growth hides it.
Next: Deepline job-change alerts turn the new hire starting into a second send window.
The analysis4 rounds. I now check roster careers pages and ATS boards directly each night, using PredictLeads Job Openings or a Playwright crawl+
Round 1
ShowedThe accept rate held steady. But replies to step 2 said the role was filled or closed. A growing share of roster posts were already closed by the day the first message went out.CheckedI took every strike in the cohort (the group of companies that hit a window). I compared the TheirStack first-seen date to the posted date on the company careers page or ATS (their hiring software). I counted windows where the post was already closed when the first message went out. I counted per strike, not per message.ChangedI now check roster careers pages and ATS boards directly each night, using PredictLeads Job Openings or a Playwright crawl. The window starts from the earliest of the three dates. I drop a strike when the post is already older than 14 days at first sight.MovedClosed-role replies stopped being the main reason a thread died. The 41 strike windows in the results are counted from the earliest date, with stale posts already dropped.
Round 2
ShowedAfter the window fix, I wanted to know whether 14 days was the right length or just a number I picked.CheckedI took every step 2 message sent and split it by days between the strike and the send. I counted replies per message sent in each bucket. Replies came from across the whole window. There was no drop-off before day 14.ChangedNothing. The 14-day window stayed as it was.MovedNothing moved. The check ruled out the window length as the reason threads died, so the next round went to the hidden-seller check instead.
Round 3
ShowedThe strike rate per roster company looked fine. But replies to step 2 said they already had someone on it. "We already have someone" came up more often than "we are about to hire".CheckedI took a sample of roster companies. On each one I ran a Sales Navigator people search with title words like BD, partnerships, growth, revenue and account. I counted how many companies had a hidden seller before trusting the zero.ChangedThe zero check is now two steps. Sales Navigator shows zero, and a title-word people search also finds no one. Any company where either step finds a seller is excluded.MovedThe roster got smaller and cleaner. "We already have someone" dropped out of the replies. "About to hire" became the main objection, and that is the one the play is built to answer.
Round 4
ShowedWindows opened kept rising. Connections sent per day dropped to zero. The median days from strike to first message climbed past the 14-day window. The account safety check had paused the whole LinkedIn account.CheckedI pulled accept rate per connection request sent, split by how many days after the raise it was sent. Requests older than 14 days counted as not accepted. Then I checked the whole-account rate the safety check reads. That rate also includes ballast requests (filler requests sent to keep it up).ChangedStrike requests go first each day, up to the daily limit. Ballast requests go to profiles in the buyer's own industry, at a volume that keeps the account rate above 30%. Any strike that misses its window moves straight to the email step, with no 7-day wait.MovedThe account stopped pausing, so connections sent per day stayed at the cap. The 23% accept rate in the results is the strike cohort on its own, not the padded account rate.
Kept human, on purpose:
A person approves every message and reply before it sends. The hidden-seller judgment stays with me too, because a title-word search finds candidates, not answers.
Whether a strike is a real opening or a repost that will never be filled is my call. The feeds cannot tell the two apart.
If I ran it again: I would treat the new hire starting as a second send window from day one, restarted by a Deepline job-change alert at step 2. "About to hire" threads died once the founder handed them to the new seller, and nothing restarted them.
The cost maths$632-682 +extras a month+
The maths: About $632 to $682 a month, plus €49 and £26. Sum: $119.99 + $49 + $40 + $295 + $40 + $39 = $582.99, plus Crunchbase at $49 to $99. About $105 to $114 per meeting ($632 to $682 a month over the 6 meetings held). The €49 and £26 lines add about €8 and £4 per meeting.
Prices, each linked to the vendor page. Crunchbase: $99 a month, or $49 a month billed yearly (Pro plan; Crunchbase shows the price at checkout, not on the page). LinkedIn Sales Navigator: US$119.99 a month (Core plan). TheirStack: From $49 a month (1,500 API credits; one job returned costs 1 credit). PredictLeads: Pay as you go: $40 monthly minimum at $0.04 a credit. The first 100 API calls each month are free. BuiltWith: $295 a month (Basic plan). Trigify: $40 a month (Starter plan, 4,000 credits). Deepline: No platform fee on Pay as you go. 50,000 enrichment calls a month come free with your own provider keys, then $0.005 a call. 314 tracked companies sit far inside the free band. Unipile: €49 a month (covers up to 10 linked accounts; this play uses one). Anymailfinder: £26 a month (400 credits). 41 strikes in 90 days is about 14 emails a month, so the smallest plan covers it. SmartLead: $39 a month (Base plan, 6,000 sends). Cal.com: Free (the individual plan costs nothing).
Playwright and Python are free. Claude, the Hetzner box and self-hosted NocoDB are already owned.
Luxury property02 · for a luxury property brokerageAds as market researchPaid ads show who the buyer is. I then reach the same people for free, through the pool and garden firms they follow.+
~200leads a month·roughly 15% reply, about a quarter positive~5meetings a week at peak·over £3m in attributed deal flow
The cost
$167-174 +extrasto run, per month$8-9per qualified meeting
The pushback
"Scraped followers are cold."
The answer: Following a pool builder is a choice they made. The like has a date on it. I open with the post they liked. The ad test showed this group books viewings.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: list the homes on rightmove and the other property sites, then wait for people to fill in the enquiry form+
The offer: A three-month email and LinkedIn campaign to high-net-worth buyers, for a brokerage selling luxury developments.
List the homes on Rightmove and the other property sites, then wait for people to fill in the enquiry form.
Buy a high-net-worth list that every rival brokerage has also bought.
Run Meta lead ads saying "register your interest", and pay for the same leads again every month.
1 · The signals2 signals. Primary: Follows a pool builder or garden designer+
2 signals, 1 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryFollows a pool builder or garden designerApify Instagram followers scraper on SPATA and SGD membersA signal is a public event that shows someone is about to need this. They chose to follow a firm that builds the kind of pool or garden these houses have.
supportingLiked or commented on a post in the last 90 daysApify likers and commenters scrapers; Apify LinkedIn engagersA follow could be years old. A like has a date, and on LinkedIn it has a name attached.
2 · QualifyUse the ad results to pick the age bands and regions that booked viewings+
Use the ad results to pick the age bands and regions that booked viewingsI run small Meta ad tests for four weeks. Ads Manager breakdowns show which age bands and regions booked viewings. I keep those, and then the ad spend stops.
Source firms: SPATA and SGD members with approved planning for pool workI take the member lists from both registers. I rank them with the PlanIt API: search="swimming pool", app_state=permitted, agent_company, target authorities. I harvest (pull the followers of) the top firms first.
Follows a source firm, liked or commented in the last 90 days, and is a private personI join the follower and engager lists. Anyone following two or more firms goes to the top. I drop bios that say pool, garden, estate agent or builder. UK only.
Director or PSC (person with significant control) of an active UK company; exclusionsCompanies House officer and PSC search. Email goes to company addresses only, to stay inside the PECR email rules. Everyone else gets LinkedIn only. Out: current CRM clients, opt-outs, anyone messaged in the last 6 months, and followers of rival brokerages.
3 · Research + assetAsset: The first message carries an image: a real screenshot of the post they liked, with one circle and a 2-word tag+
What I gather on each lead:
The dossier (one research file per lead): the firm they follow and the post they liked, with date and screenshot
Companies House: company, their role, county, date the company was formed
The best-fit development and home from current stock
Which ad segment they fit, and the channel: LinkedIn only, or LinkedIn plus email
The asset built for them: The first message carries an image: a real screenshot of the post they liked, with one circle and a 2-word tag. Directors also get a PDF of homes with pools sold nearby.
Built with: Apify (followers, likers, commenters); Companies House API; PlanIt API; HM Land Registry Price Paid Data
4 · Outreach6 steps: LinkedIn through Unipile (connection request, image message, voice note); Email through Smartlead, to company addresses only+
Channels: LinkedIn through Unipile (connection request, image message, voice note); Email through Smartlead, to company addresses only
1 · LinkedInConnection request, no note Connect first. Nothing sends until they accept.
2 · LinkedIn message, once they acceptScreenshot of the post they liked, with a circle and tag, under 60 words Two houses with this pool size come up in your county soon. Want plans?
3 · Email (directors only)Plain text, no link, no image Same opener in two sentences. Asks which county they are looking in.
4 · LinkedIn message, day 4One-page PDF: homes with pools sold nearby Says what the page shows, nothing else.
5 · LinkedIn message, day 920-second voice note, plus one line of text pointing to it The note asks whether the timing is wrong, or the house is.
6 · Email or LinkedIn message, day 14Plain text Asks if they would rather not hear about new homes. Closes the thread either way.
No link in the first email.
Email goes only to company addresses. Private individuals get LinkedIn only.
Messages go only after the connection is accepted.
Before every batch, remove anyone already in the CRM: clients, past enquiries, opt-outs, and anyone messaged in the last 6 months.
5 · Handling repliesYes: Send the Cal.com viewing link and the floor plans together+
Yes →Send the Cal.com viewing link and the floor plans together. The broker takes over from there.
Question →The answer is drafted from the dossier and the list of homes for sale. The broker approves it.
Pushback →"Not looking now": offer them first sight of new homes with pools. A second no closes the thread.
Silence →PDF on day 4, voice note on day 9, close on day 14. Put them back in the pool after 6 months.
6 · The content sideWalkthroughs of homes for sale, led by the pool and garden+
Content: Walkthroughs of homes for sale, led by the pool and garden. Plus a monthly post on what homes with pools sold for in each county. The source firms are tagged.
Free item offered: A free PDF, county by county, of homes with pools sold in the last 12 months, built from Land Registry data.
7 · How it improvesUpload the people who booked viewings to Meta as a custom audience+
Upload the people who booked viewings to Meta as a custom audience. Build a lookalike audience from them, and run the interest tests again against it.
8 · What it taught meFour weeks of ads define the buyer+
Four weeks of ads define the buyer. Then the spend stops.
The trade registers and the planning API pick the firms whose followers I harvest.
Next: run the same test for tennis courts, stables and annexes.
The analysis4 rounds. I cut the test to two or three broad cells+
Round 1
ShowedThe leads harvested from the winning age bands replied and booked at about the same rate as leads from the dropped bands. When I ran the test again, the winning cells (one age band in one region) changed. Meta had also shown the ads more in the cells it rated highest, so the breakdown showed where Meta spent money.CheckedIn Ads Manager I opened the breakdown by age and region and counted booked viewings per cell. I used the raw count, not a percentage. Cells with one or two bookings were showing as winners. I compared that count to Meta's own minimum events per variant. Then I checked reply rate per lead messaged, split by kept bands versus dropped bands.ChangedI cut the test to two or three broad cells. It runs until each cell has enough bookings to mean something. A small set of dropped-band leads stays in outreach, so the result can be checked against real replies.MovedThe segment choice stopped changing from run to run. The ~200 leads a month now come from bands that held up in replies, not from where Meta spent the money.
Round 2
ShowedBefore the first email batch, I wanted proof that the channel rule held. Email goes to company addresses only, to stay inside the PECR rules.CheckedI exported the Smartlead send list. For each address I matched the domain to the Companies House record of the company the lead is a director of. I also ran the list against the CRM suppression list: clients, opt-outs and anyone messaged in the last 6 months.ChangedNothing. Every address was a company address, and no one on the suppression list was in the batch.MovedNothing moved. The check ran before every later batch as well, so no private person was ever emailed.
Round 3
ShowedThe harvested count per source firm was high. The count matched to LinkedIn was a small fraction of it. The monthly lead number rose and fell with the match rate, not with follows or likes. On the Instagram-only matches, connection requests sat pending for weeks. The accept rate (the share of requests they accept) fell toward the 30% floor, where the safety check pauses the account.CheckedI counted matched people per harvested follower, per source firm. I counted private, no-photo and trade-bio accounts separately. Then I pulled accept rate per request sent, split by where the lead came from: LinkedIn engager or Instagram-only match. Requests older than 14 days counted as a no.ChangedI start with the LinkedIn engager pull now (people who liked or commented on a post). It returns name, headline and profile URL, and those people were active on LinkedIn inside 90 days. The Instagram follow only ranks up people already named. Instagram-only matches with a company address go straight to email step 3. Source firms whose followers are mostly trade or private accounts are dropped.MovedThe lead count stopped tracking the match rate. Accepts caught up with requests sent, and the first-message queue started moving. That is what turned harvested names into the roughly 15% reply in the results.
Round 4
ShowedEmail replies came back as "who is this" or "wrong person". LinkedIn replies on the same leads looked normal. So the problem sat on the email channel only.CheckedFor each emailed lead I counted the officer records Companies House returned for that name. I checked the officer's county and date-of-birth band against the LinkedIn profile. Then I worked out the share of emails sent where the name had more than one officer record.ChangedEmail goes out only when the name matches one officer record, or when the county and birth band agree with the LinkedIn profile. Everyone else stays LinkedIn only.Moved"Wrong person" replies stopped. The email channel stopped dragging the positive share down. The results line of about a quarter positive counts replies after this fix.
Kept human, on purpose:
The broker approves every answer and takes over on a yes. The viewing and the sale are their relationship.
I check each Companies House match by eye before any email goes out. A wrong match emails a stranger, and that cannot be taken back.
If I ran it again: I would start with the LinkedIn engager pull and treat the Instagram harvest as a rank-up from the first week. Much of the early effort went on matching usernames to names, and the named people were on LinkedIn all along.
The cost maths$167-174 +extras a month+
The maths: About $167 to $174 a month, plus €49. Sum: $29 + $99 + $39 = $167, plus a few dollars of scrape usage (two 3,000-person engager runs cost about $6.60). The four-week ad test is a one-off on top, at whatever budget you set. About $8 to $9 per viewing booked at peak ($167 to $174 a month over about 20 meetings, from 5 a week). The €49 line adds about €2.50 per viewing.
Prices, each linked to the vendor page. Meta Ads Manager: No listed price. Meta says "Your budget is your most valuable cost control tool". You set the test budget, and the spend stops after four weeks. Apify: $29 a month (Starter plan), plus usage: $1.20 per 1,000 Instagram followers and $1.10 per 1,000 LinkedIn engagers. One engager run returns up to 3,000 people for about $3.30. Prospeo: $99 a month (Growth plan, 5,000 credits; $74 a month billed yearly). A free plan gives 100 credits a month. Unipile: €49 a month (covers up to 10 linked accounts; this play uses one). Smartlead: $39 a month (Base plan, 6,000 sends). Cal.com: Free (the individual plan costs nothing).
The SPATA and SGD registers, the PlanIt API, the Companies House API, Land Registry data, Playwright and Python are free. Claude, the Hetzner box and self-hosted NocoDB are already owned.
Money lending03 · for a bridging & development lenderA planning permission is a loan applicationA planning approval means someone has to fund a build. The lender reaches them in the weeks before a broker does.+
~480approvals / month in band122matched + qualified8%reply5–7qualified calls / month
The cost
$138-144 +extrasto run, per month$20-29per qualified meeting
The pushback
"We already have a broker."
The answer: The broker starts when you ask them. This started the day your approval was published. A second term sheet costs you nothing.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: wait for brokers to bring in borrowers+
The offer: Development and bridging finance for small UK property companies with a newly approved scheme. I reach them before they go to a broker.
Wait for brokers to bring in borrowers. 61% of bridging lenders call brokers their top channel.
Buy a property-developer list. Nothing on it says who needs money this month.
Meet the same borrower at the same broker as four other lenders.
1 · The signals4 signals. Primary: Planning application marked Permitted in the last 7 days; Discharge of conditions filed on an approved site+
4 signals, 2 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryPlanning application marked Permitted in the last 7 daysPlanIt API, 420 UK planning authoritiesA signal is a public event that shows a company is about to need this. The owner can now build, and must pay for the build. The decision date starts the clock.
primaryDischarge of conditions filed on an approved sitePlanIt API, app_type=ConditionsIt asks the council to sign off the approval's conditions. It happens just before work starts, so money is needed now.
supportingSite bought in the last 24 monthsHM Land Registry Price Paid DataCash went out on the purchase. The build cost is next.
supportingNo charge on the company, or a charge held by a rival lenderCompanies House API, /company/{n}/chargesA charge is a lender's claim on the company. No charge means no bank on the site yet. A rival's charge means they will refinance.
2 · QualifyApproval plus one supporting signal, or a conditions filing alone+
Approval plus one supporting signal, or a conditions filing aloneEvery night I pull from PlanIt: decided in the last 7 days, Permitted, Full or Outline, Medium or Large. I join that to Land Registry Price Paid data and Companies House charges.
Site owned by an active UK limited companyThe Land Registry company-owners CSV file gives the company number. If that fails, I use PlanIt applicant_company. The company must be active, with a SIC code (its registered business type) of 41100, 41201, 68100, 68209 or 68320.
Scheme size fits what the lender will fund; one company, one conversationI read the units (homes) and floor area from the planning description. Under 2 units is out. Over the client's unit cap is out. One entry per company number.
ExclusionsOut: householder applications (app_size=Small). Councils, the NHS, utilities and housing associations. PLCs and national housebuilders. Companies with an existing charge to the client. Sites with a high-street bank charge.
3 · Research + assetAsset: The LinkedIn message carries a real screenshot of their council decision page, with the decision circled+
What I gather on each lead:
The dossier (one research file per lead). The application: council, reference, decision date, what was approved, link to the council portal
Site: address, owner company, last sale date and price
Company: age, accounts, SIC code, directors, every charge
A rough build cost: units or floor area, times the regional cost band
The asset built for them: The LinkedIn message carries a real screenshot of their council decision page, with the decision circled. After a reply, a one-page capital brief PDF (what could be lent on that scheme).
Built with: Python on Modal (PlanIt, Land Registry, Companies House); DeepSeek (first dossier draft), Claude (the brief, replies); Playwright (screenshots the council portal); Anymailfinder and Prospeo (director email, LinkedIn URL)
4 · Outreach5 steps: Cold email to the director; LinkedIn message with the screenshot; One phone call to the company number+
Channels: Cold email to the director; LinkedIn message with the screenshot; One phone call to the company number
1 · Email (day 0)Plain text, no link, no image Names the application reference and the decision. Asks if funding for the build is sorted.
2 · LinkedIn connect and message (day 2)Screenshot of their council decision page, decision circled The circle marks their approval. Asks if they have a price for build finance yet.
3 · Email (day 5)Plain text; capital brief PDF sent on reply Offers a one-page brief. It says what the lender could commit before a broker gets involved.
4 · Phone call (day 9)One-page call card: reference, site, key dossier lines Opens with the approval. Asks who handles finance and when the broker starts.
5 · Email (day 14)Plain text Two lines. The offer of a second term sheet (a lender's written loan terms) stands until the build starts.
30 emails a day per mailbox. Add mailboxes to send more.
No link and no image in the first email. The screenshot goes out on LinkedIn only.
First contact within 10 days of the decision. Older approvals go into the weekly digest email instead.
Never pitch the planning agent or architect named on the application.
Any reply stops every remaining step on every channel.
5 · Handling repliesYes: The booking link and the capital brief go out straight away+
Yes →The booking link and the capital brief go out straight away. The call happens within 5 working days.
Question →The answer comes from the dossier: loan size, timing, what the credit team will ask for. A person checks it.
Pushback →"We have a broker": one reply back, that a second term sheet costs them nothing. Then close the thread.
Silence →Five steps, then a 60-day hold. A discharge-of-conditions filing restarts step 1.
6 · The content sideA monthly LinkedIn post built from the PlanIt pull+
Content: A monthly LinkedIn post built from the PlanIt pull. It lists approvals in the lender's regions above a set number of units, and what each one needs to fund.
Free item offered: A weekly 'approved in your patch' email by region, with a checklist from planning approval to the loan paying out.
7 · How it improvesScore approvals by rough build cost (units or floor area, times the regional band), so the biggest likely loan is called first+
Score approvals by rough build cost (units or floor area, times the regional band), so the biggest likely loan is called first.
8 · What it taught meThe approval is public the day it lands, before any broker call+
The approval is public the day it lands, before any broker call.
Land Registry and Companies House turn a planning record into a named director.
Next: use the conditions filing as a second clock, and call the biggest schemes first.
The analysis4 rounds. An existing outstanding charge now makes the lead a refinance lead, with its own opening message+
Round 1
ShowedThe reply rate per emailed lead looked normal. But few replies were positive, and most said the funding was already agreed. Bigger schemes said it more than smaller ones.CheckedI split replies by outcome: already funded, has a broker, no one yet. I counted per reply, not per email sent. Then I split the same replies by unit band, and by whether the company already had an outstanding charge at Companies House.ChangedAn existing outstanding charge now makes the lead a refinance lead, with its own opening message. For larger schemes I added an earlier trigger: the application being validated or listed for committee. So the first contact lands while the loan is still being priced.Moved"Already funded" stopped being the top reply. The 8% reply in the results now carries more "no one yet" replies. Those are where the 5 to 7 qualified calls a month come from.
Round 2
ShowedThe 10-day first-contact rule sends older approvals to the weekly digest instead of the sequence. I wanted to know if the cutoff was costing replies.CheckedI split replies per emailed lead by days from decision date to first email. Then I counted replies from the digest list over the same weeks.ChangedNothing. Replies came mostly from contacts inside the 10 days, and the digest list rarely replied. The cutoff stayed at 10 days.MovedNothing moved. The check confirmed the rule and ruled out the cutoff as the reason the matched count was low. That sent me to the owner match next.
Round 3
ShowedThe matched count fell well below the number of approvals in band. Among the matches, a steady share of replies said "that is not our site" or "that company sold it".CheckedI split matched leads per approval by how the match was made: owner file or applicant_company. For owner-file matches I compared the file's registration date to the Price Paid last sale date. A sale after the registration date meant the owner was out of date. The file is monthly and lags months behind registration. A new SPV (a company set up for one scheme) was often not on it yet.ChangedWhen the last sale is later than the owner-file entry, the lead is held until the next monthly change file. Or I match on the planning description and applicant address instead. The charge check never runs until the company number is confirmed two ways.Moved"Not our site" replies stopped. The 122 matched and qualified in the results are leads where the company number was confirmed two ways.
Round 4
ShowedEmails found per matched director was low. Bounces clustered on guessed addresses. The 8% reply rate only held when measured on emails delivered, not on leads matched.CheckedI counted emails found per matched director in the Anymailfinder and Prospeo exports. Then I counted emails delivered per email sent in Smartlead, before any reply rate. I also counted matched directors with no LinkedIn URL and no working phone. Those leads had no channel at all.ChangedI use the director's other Companies House appointments to find their main trading company or group, and look for the email there. Where that fails, the sequence starts at step 2 on LinkedIn and the phone call moves forward to day 4.MovedMore matched directors got a first contact on some channel. The 8% reply in the results is measured on emails delivered. This round is why that denominator was chosen.
Kept human, on purpose:
The day 9 phone call stays with a person. A developer with a fresh approval talks about money on the phone, not to a script.
A person checks every loan-size answer against the dossier before it sends. A wrong number in front of a credit team costs the deal.
If I ran it again: I would pull from PlanIt on decided_start from the first night, since the recent filter works on the date received. Some councils went quiet for days and then dumped approvals already past the 10-day rule, so I would alert on any quiet council.
The cost maths$138-144 +extras a month+
The maths: About $138 to $144 a month, plus €49 and £26. Sum: $39 + $97 = $136, plus $2 to $8 of DeepSeek usage. Add £150 only if the optional LandInsight fallback is switched on. About $20 to $29 per qualified call ($138 to $144 a month over 5 to 7 calls). The €49 and £26 lines add about €7 to €10 and £4 to £5 per call.
Prices, each linked to the vendor page. Smartlead: $39 a month (Base plan, 6,000 sends; well above 30 emails a day from one mailbox). GoHighLevel: $97 a month (Starter plan). Unipile: €49 a month (covers up to 10 linked accounts; this play uses one). Anymailfinder: £26 a month (400 credits). 122 matched directors a month fits the smallest plan. Prospeo: Free plan, 100 credits a month. $99 a month (Growth plan, 5,000 credits) if the fallback runs hot. DeepSeek: Usage priced: at most $0.44 per million input tokens and $1.32 per million output (v4-flash, peak hours). Assume about 50,000 tokens per dossier. 122 dossiers is about 6 million tokens, so roughly $2 to $8 a month. Modal: The Starter plan includes $30 of compute free each month, then by-the-second usage. A nightly pull and joins should sit inside the free $30. LandInsight: £150 a month (Pro plan, excluding VAT). Optional; the play runs on the free PlanIt API.
PlanIt, Land Registry, Companies House, Playwright and the Cal.com individual plan are free. Claude Code and self-hosted NocoDB are already owned.
Cybersecurity04 · for a cybersecurity consultancyThe neighbour's house is on fireA company lands in a public register of data breaches. Similar firms in its sector get a note naming that breach, and the questions their insurer will ask next.+
68flares in the last two quarters~14peers harvested per flare9%reply to touch one11meetings held
The cost
$436-450to run, per month$240-250per qualified meeting
The pushback
"We have this covered internally."
The answer: Then the note takes you ten minutes to confirm. The firms on the ICO register thought the same the week before.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: email a bought list of cisos (chief security officers)+
The offer: A one-page note that shows which cyber insurance questions a UK mid-market firm cannot yet answer. It is built around a named attack on a firm in their sector, and sold to the person who owns risk there.
Email a bought list of CISOs (chief security officers). Mid-market firms rarely have one.
A campaign every autumn when insurance renews, with no real incident behind it.
Scary messages with no date and no company name. They get deleted.
1 · The signals4 signals. Primary: A firm in their sector is posted on a ransomware leak site; A firm in their sector gets an ICO reprimand or fine+
4 signals, 2 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryA firm in their sector is posted on a ransomware leak siteransomware.live API; Have I Been Pwned /breaches APIRansomware gangs post their victims online. A named UK firm in their sector was hit this week, and the date is public.
primaryA firm in their sector gets an ICO reprimand or fineICO enforcement registerThe ICO is the UK data regulator. Its notice is official, names the firm, and says which control failed.
supportingThe prospect's job ad names a rival security productTheirStack job postings API; Apify LinkedIn JobsThat means they have budget, someone in charge, and a tool they might switch away from.
supportingCyber Essentials certificate expires inside 90 daysIASME Cyber Essentials certificate searchInsurers ask for it. The expiry date is already in their diary.
2 · QualifyOne flare inside 14 days, plus one prospect signal inside 90 days+
One flare inside 14 days, plus one prospect signal inside 90 daysA flare is a named attack on a firm in the sector, from the leak site, Have I Been Pwned or the ICO. A signal is a public event that shows the prospect is about to need this. Here that is a job ad naming a rival product, or a Cyber Essentials certificate about to expire. A flare with no signal only makes a list.
Same sector as the victim, 50 to 500 staffI take the victim's SIC code (the Companies House industry code) and search for active companies with the same first two digits. Staff count comes from the latest filed accounts.
UK registered, trading, mailbox provider knownAccounts filed inside the last 18 months. An MX lookup shows whether their email runs on Microsoft 365 or Google Workspace, which sets the questions I ask. If the lookup finds nothing, I do not email them.
Who is left out, and the US versionThe victim is left out for 90 days. No public sector, security vendors or MSPs (IT support firms). For the US, the flare comes from SEC 8-K Item 1.05 filings, found through EDGAR full-text search.
3 · Research + assetAsset: The first LinkedIn message carries a real screenshot of the peer's public entry, with the entry circled+
What I gather on each lead:
The flare: the victim, the date, the gang or the ICO action, and what data was exposed
The peer: company number, SIC code, staff count, region
Their email provider, security tools named in job ads, Cyber Essentials expiry date
The risk owner, and the insurer questions this incident raises
The asset built for them: The first LinkedIn message carries a real screenshot of the peer's public entry, with the entry circled. Later comes a one-page PDF gap note: the insurer questions, a blank column for their answers, and no sales pitch.
Built with: Python scripts on a Hetzner server, checking ransomware.live, the ICO and Have I Been Pwned on a timer; Companies House API; TheirStack; Apify; Clay (tries several email finders in turn, checks the email provider, pulls company size and sector); Claude, DeepSeek, Playwright, Stirling PDF, NocoDB
4 · Outreach6 steps: LinkedIn: a connection request, then a direct message, sent through Unipile; Cold email to the risk owner (Smartlead); Phone, as the last step only+
Channels: LinkedIn: a connection request, then a direct message, sent through Unipile; Cold email to the risk owner (Smartlead); Phone, as the last step only
1 · LinkedInConnection request, no note Sent to the risk owner on the day the flare lands.
2 · LinkedIn DM, on acceptScreenshot of the peer's entry with the key line marked, plus 30-60 words Names the peer and the date. Asks if their insurer has raised it.
3 · Email, day 3Plain text, screenshot inline, no link The same peer and date, with one question, sent to the risk owner.
4 · LinkedIn DM or email, day 7One-page gap note PDF, attached Says what is in the note. It does not ask for a meeting.
5 · LinkedIn DM, day 12Second screenshot: the blank insurer-question row Points at the blank row and offers 20 minutes to fill it in. This is the first time I ask for a meeting.
6 · Phone, day 18Call, with the note on screen Opens with the peer name. Asks if the note reached them.
30 emails a day per mailbox.
Every message is about the peer or the insurer questions. I never comment on their own security.
Every draft runs through the claim checker before a person approves it.
The victim firm is not contacted for 90 days.
5 · Handling repliesYes: If they say yes, I book 20 minutes on Cal.com and send the filled-in note the day before+
Yes →If they say yes, I book 20 minutes on Cal.com and send the filled-in note the day before.
Question →If they ask a question, I draft the answer from the dossier (the research file on that lead) and the full message thread. A person checks every reply before it goes out.
Pushback →If they say "covered internally", I reply that the note takes ten minutes to confirm. A second no ends the thread.
Silence →If they go quiet: the note on day 7, the blank row on day 12, the call on day 18. Then I leave them alone for 60 days.
6 · The content sideOne LinkedIn post a week+
Content: One LinkedIn post a week. It lists this week's named UK incidents in one sector, what data was taken, and the insurer question each one raises.
Free item offered: A free PDF checklist for insurance renewal: the eight control questions insurers ask, one page per sector.
7 · How it improvesCount which incident types led to meetings+
Count which incident types led to meetings. The next batch starts from the flare type with the best record.
8 · What it taught meThe peer is the one who admitted the attack+
The peer is the one who admitted the attack. The prospect only has to answer an insurer question.
Three public feeds name the victim. Companies House gives me the list of firms in the same sector.
Next: score each flare type by meetings booked, and add SEC 8-K Item 1.05 filings for the US.
The analysis4 rounds. No peer gets a message until the flare has two sources+
Round 1
ShowedThe share of people who accepted my connection request stayed normal. But on some flares, step 2 replies were corrections or complaints about the named peer, with no questions about the insurer.CheckedI opened the flare log in NocoDB and filtered to that month. For each flare I read the correction replies first. Then I counted the flares where the leak site was the only source, as a share of all flares sent. Gangs post fake victims, old victims, and victims under the wrong name.ChangedNo peer gets a message until the flare has two sources. The second source can be Have I Been Pwned, the ICO, the press, or the victim's own statement. Unconfirmed flares wait 72 hours. The message now says the firm was 'listed on' the leak site. It never says the firm 'was breached'.MovedCorrection replies about the peer stopped. The flare count in the results is the count after the two-source rule, so every flare in it names a firm that was confirmed.
Round 2
ShowedConnection accepts stayed normal. Step 2 replies dropped only on flares where the victim's SIC code started with 'other'. Those replies said 'we are not in that line of work'.CheckedFor each flare I exported the peer list from NocoDB. I counted the peers whose SIC code was n.e.c. (not elsewhere classified), as a share of all peers found for that flare. Nearly a third of UK companies sit under an 'other' code, so this was common.ChangedWhen the victim's SIC code is n.e.c., I set the sector by hand from the victim's website. I then search Companies House on a keyword plus the SIC code. I capped the peers per flare, so one bad sector tag cannot fill a week of sends.MovedThe 'wrong sector' replies went away. The peers-per-flare figure in the results is the capped figure, and step 2 stopped being the step that leaked.
Round 3
ShowedICO flares got 'that was ages ago' replies. The ICO feed booked far fewer meetings per flare than the leak-site feed.CheckedI opened each ICO notice and wrote down the incident date and the publish date. I counted the days between them, flare by flare, and did the same for the leak-site feed. Then I compared meetings per flare for each feed. Example: the Post Office breach ran April to June 2024, and the reprimand came in December 2025.ChangedFor ICO flares the message now opens with the named control that failed, and leaves out the date. The two feeds are scored separately. The leak-site feed sets how often I send.MovedThe ICO feed stopped dragging the meetings figure down. The improvement line, count which incident types led to meetings, is this check made routine.
Round 4
ShowedI wanted to know if peers contacted late in the 14-day flare window replied less than peers contacted early.CheckedFor each peer I counted the days between the flare date and the connection request. I split step 2 replies into days 0 to 7 and days 8 to 14, as a share of accepts in each group.ChangedNothing. Replies were level across the window. The 14-day rule stayed as it was.MovedNothing. The window in the qualify step is the one the results were counted on.
Kept human, on purpose:
Reading the correction replies flare by flare. A count can tell me a flare is bad. Only a person can read 'we were never hit' and see a false claim about a real UK firm that must stop that day.
Setting the sector by hand when the victim's SIC code is n.e.c. The code is wrong too often to trust a script with it.
If I ran it again: I would run the two-source rule from the first flare. I would also score the ICO feed on its own from day one, instead of finding out from replies.
The cost maths$436-450 a month+
The maths: About $436 to $450 a month. Fixed tools: $49 + $29 + $167 + $55 + $39 + $97 = $436. DeepSeek usage adds a few dollars on top. About $240 to $250 per meeting held. 11 meetings over two quarters is about 1.8 a month, and $436 to $450 over 1.8 meetings is $242 to $250.
Prices, each linked to the vendor page. ransomware.live: Free. The PRO key is also free, it just needs registration. ICO enforcement register: Free public register. Have I Been Pwned: Free. The /breaches endpoint needs no key. TheirStack: $49 a month, Starter plan, 1,500 API credits. About 160 peers a month fits inside it. Companies House API: Free with a free API key. IASME certificate search: Free public search. Apify: $29 a month, Starter plan, $29 of platform usage included. Clay: $167 a month, Launch plan, 2,500 data credits. About 160 leads a month fits inside it. Prospeo: Paid through Clay data credits here, not as its own bill. Claude: Already owned. Runs on the existing Claude Code plan. DeepSeek: Usage based. 68 flares over two quarters at ~14 peers each is about 160 leads a month. At an assumed 100,000 tokens a lead that is 16M tokens, about $11 at $0.66 per million input tokens. Playwright: Free, open source. Stirling PDF: Free, open source, self-hosted. Unipile: $55 a month minimum (49 euros), covers up to 10 linked accounts. Smartlead: $39 a month, Base plan, 6,000 emails a month. The 30-a-day cap sits well inside it. GoHighLevel: $97 a month, Starter plan. NocoDB: Free, open source, self-hosted on the Hetzner box. Cal.com: Free individual plan. Python on Hetzner: Already owned. The server already runs.
The three flare feeds, Companies House and IASME are free. The server and the Claude plan are already owned.
Commercial law05 · for an employment law firmThe losing respondentEvery published tribunal judgment names the employer who lost. That firm gets a short note on the gap the judgment exposed.+
~90losing respondents a month above the headcount floor10%reply4-6calls a month
The cost
$191 +extrasto run, per month$32-48per qualified meeting
The pushback
"Our solicitor handles employment."
The answer: The judgment says otherwise, in public. They can keep their solicitor. The fix only covers the gap that just cost them.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: directory listings, accountant referrals, and waiting for the phone to ring+
The offer: A fixed-fee fix for the contract or procedure gap that a published tribunal judgment found. I sell it to the owner of the UK employer that lost the case.
Directory listings, accountant referrals, and waiting for the phone to ring.
A monthly 'protect your business' newsletter to a bought HR list.
The firm only learns an employer has a problem when the employer calls.
1 · The signals4 signals. Primary: Judgment published against the employer, claim upheld+
4 signals, 1 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryJudgment published against the employer, claim upheldGOV.UK employment tribunal decisions (search API, Atom feed)The tribunal names the employer and says what was missing.
supportingDefault judgment: the employer never filed a responseJudgment PDF text (Rule 22)Nobody was handling the claim. So 'our solicitor handles it' is already untrue.
supportingTwo or more judgments against the employer since 2017Tribunal Watch employer index; gov.uk name searchTwo losses means a process problem. The last fix did not hold.
supportingAnother hearing already listed against the employerCourtServe weekly Press ListThe cost is still running. The fix has a deadline.
2 · QualifyJudgment inside 30 days with a finding against the employer+
Judgment inside 30 days with a finding against the employerA daily pull from gov.uk, filtered to format=employment_tribunal_decision. Claude reads the PDF and pulls out which claims were upheld, what was missing, and the award. Cases where every claim failed or was withdrawn are dropped.
A supporting signal moves the lead up the list. A default judgment or a listed hearing adds a phone call.A signal is a public event that shows a company is about to need this. Default judgments are found by the Rule 22 wording in the PDF. Repeat losses come from a gov.uk name search. Listed hearings come from CourtServe each Wednesday.
An active commercial employer with 10 to 250 staff, contacted onceMatch to Companies House, status active, staff count from the latest accounts. Public sector, NHS, councils, schools and charities are left out. One thread per company number, so nobody is contacted twice.
Who represented them at the hearing sets the tierTier 1: nobody attended, or a director spoke for them. Tier 2: an HR consultant or a small law firm. Tier 3: a known employment law firm. Tier 3 gets email only.
3 · Research + assetAsset: A one-page PDF fix note in their brand colours+
What I gather on each lead:
Case number, judgment date, claim types, award, attendance
What the tribunal found missing, in its own words
Companies House: company number, directors, SIC code (industry code), staff count, and who makes decisions
Other cases, listed hearings, and the type of failure (the failure class)
The asset built for them: A one-page PDF fix note in their brand colours. It lists the three things that were missing and the step that fixes each one. Plus a real screenshot of the judgment with the finding circled.
Built with: GOV.UK search API and Atom feed; Playwright (downloads the PDF, takes the screenshot, builds the note); Claude (reads the judgment, labels the failure class, drafts the note); Companies House API; Tribunal Watch; CourtServe; Anymailfinder
4 · Outreach5 steps: Cold email to the director; LinkedIn connection, then a direct message with the screenshot; Phone call to the managing director (tiers 1 and 2)+
Channels: Cold email to the director; LinkedIn connection, then a direct message with the screenshot; Phone call to the managing director (tiers 1 and 2)
1 · EmailPlain text, no link. The subject line is the case number. The judgment says the appeal step was missing. I offer the three-item note.
2 · LinkedInConnection request, then a judgment screenshot with the finding marked, plus 30-60 words This paragraph is what costs employers the second time. Has anyone walked you through it?
3 · EmailOne-page fix note PDF, in their colours Names the three items. Says which one takes an afternoon and which one needs a lawyer.
4 · Phone (tier 1 and 2 only)A call. The note is already in their inbox. Did the note make sense? Which of the three items is still open?
5 · EmailPlain text with the partner's booking link The only direct ask in the sequence: 20 minutes with the partner. If not, I leave it there.
Check the email address works on the day I send, because directors move.
Name the gap. Do not mention the award, the claimant's name, or the word 'lost'.
Quote the tribunal's own words. If the judgment does not say it, I do not say it.
I only ask for a meeting in step 5.
Email: 25 new leads per mailbox per day. The sequence stops when they reply.
5 · Handling repliesYes: If they say yes, the booking link goes out the same day+
Yes →If they say yes, the booking link goes out the same day. The partner takes the 20-minute call with the dossier (the research file on that lead) and the note.
Question →If they ask about process, I draft the answer from the judgment text. Questions about the law go to the partner.
Pushback →If they say "our solicitor handles it", I reply once that the judgment says otherwise. Then I close the thread.
Silence →If they go quiet: five steps over 14 days, then stop. A new judgment or hearing restarts the sequence.
6 · The content sideA weekly LinkedIn post from the partner, covering one failure type from this week's judgments+
Content: A weekly LinkedIn post from the partner, covering one failure type from this week's judgments. It quotes the tribunal's words and says what would have stopped it.
Free item offered: A free checklist of the documents tribunals asked employers for last quarter. Updated every quarter.
7 · How it improvesSort judgments by failure type and write one fix template per type+
Sort judgments by failure type and write one fix template per type. The first message then drafts itself from the template.
8 · What it taught meThe buyer has already paid to find out what went wrong+
The buyer has already paid to find out what went wrong. My message names the fix.
The feed is free and daily: 50,000 claims in 2025/26, and 64,000 still open.
Next: CourtServe names employers before their hearing. That gives a second list and a second offer.
The analysis4 rounds. The match now uses the name plus the town or postcode in the judgment+
Round 1
ShowedBounced emails and 'wrong company' replies rose. Judgments with a short or generic employer name matched far less often than those with a full 'Limited' name.CheckedI exported the 30-day judgment list from NocoDB. For each judgment against an employer, I checked whether the Companies House search returned exactly one active company number. I counted those as a share of all judgments. Then I opened every row with several matches or no match by hand.ChangedThe match now uses the name plus the town or postcode in the judgment. A person reviews any lead with several matches. 'No match' is logged as its own status, so it never drops out unseen.Moved'Wrong company' replies stopped. The monthly count of losing respondents in the results only includes leads with one confirmed company number.
Round 2
ShowedTier 1 leads, the employers that never filed a response or did not attend, bounced or went silent far more than tiers 2 and 3. Some changed to 'active, proposal to strike off' on Companies House a few weeks after the send.CheckedFor each lead sent, I opened the Companies House filing history. I looked for a strike-off notice, a Gazette entry, a charge or an insolvency filing dated after the judgment. I counted these per tier, as a share of leads sent in that tier. In one year, over 390,000 pounds of tribunal awards went unpaid because the employer was dissolved, in liquidation or in administration.ChangedThe daily pull now reads the filing history and the insolvency data, not just company_status. Any lead with a strike-off or insolvency filing after the judgment date is dropped. The check runs again the day before the phone step.MovedTier 1 stopped wasting calls on firms that were closing. The reply rate in the results is counted on leads that were still trading when I wrote to them.
Round 3
ShowedThe delivered rate looked healthy. Replies per lead sat near zero on some domains and normal on others. Steps 1, 3 and 5 all looked like silence.CheckedI exported the month's leads with the Anymailfinder result for each address: valid, accept-all or unknown. Then I counted replies per lead delivered in each group. An accept-all domain takes mail to any address, so 'delivered' there means nothing.ChangedAccept-all leads now go to LinkedIn first, and to phone for tiers 1 and 2. I email them only after the LinkedIn accept confirms the person is there. Accept-all never counts as delivered.MovedSilence on accept-all domains stopped being read as a no. The reply figure in the results is counted on addresses that could actually be reached.
Round 4
ShowedReplies on one failure type ran a little below the others. I wanted to rule out Claude labelling the missing step wrong, which would make the note name a gap the tribunal never found.CheckedEach week I took a sample of judgments under each failure type. For each one I opened the PDF and checked that the paragraph quoted in the note contained the finding word for word. I counted the matches as a share of the judgments labelled that week.ChangedNothing. Every sampled quote matched its paragraph. The dip was small and did not repeat the next week.MovedNothing. The weekly sample stays, and the rule that I only say what the judgment says stayed as it was.
Kept human, on purpose:
Any lead with several Companies House matches. A wrong match sends the whole sequence to the wrong company, and a person can spot a trading name that a script cannot.
Questions about the law. I draft process answers from the judgment text. Anything legal goes to the partner.
If I ran it again: I would read the filing history from the first send, not just the company status. The tier 1 signal is strongest exactly where the employer is most likely to be closing.
The cost maths$191 +extras a month+
The maths: $191 a month in dollars ($39 + $55 + $97), plus £26 a month for Anymailfinder, plus £45 a year for CourtServe. About $32 to $48 per booked call ($191 a month over 4 to 6 calls). The pound items add about £5 to £8 per call (£26 a month plus £45 a year is about £30 a month, over 4 to 6 calls).
Prices, each linked to the vendor page. GOV.UK tribunal decisions: Free. The search API and Atom feed need no key. Tribunal Watch: Free public index. CourtServe Press List: £45 a year per tribunal, Employment Tribunal Express. The Premier tier is £90 a year. Companies House API: Free with a free API key. LinkedIn: Free. A normal account is enough for profile lookup. Python + Playwright: Free, open source. Claude: Already owned. Runs on the existing Claude Code plan. Anymailfinder: £26 a month, Basic plan, 400 credits. About 90 leads a month fits inside it. Smartlead: $39 a month, Base plan, 6,000 emails a month. Unipile: $55 a month minimum (49 euros), covers up to 10 linked accounts. GoHighLevel: $97 a month, Starter plan. NocoDB: Free, open source, self-hosted on the Hetzner box. Cal.com: Free individual plan. Hetzner cron: Already owned. The server already runs.
The judgment feed itself is free. The paid tools only handle reaching the person, not finding the signal.
EV · Fleet06 · for a fleet charging-payment platformThe unpartnered providerA provider's own site names no charging-payment partner while they are hiring. That gap on their page is the opening line.+
41of 187 directory members failed the absence test24showed hiring momentum29%accepted a connection3pilot conversations
The cost
$139-305 +extrasto run, per month$46-102per qualified meeting
The pushback
"Charging is the driver's problem."
The answer: Octopus EV's FAQ answers the charging question for the driver and names the partner. So does The Electric Car Scheme. Drivers read both before they sign.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: a stand at fleet shows, talking to whoever is there+
The offer: A card and app that lets drivers pay for public charging. I sell it to the commercial lead at UK salary-sacrifice EV providers. The target is any provider whose website names no charging partner.
A stand at fleet shows, talking to whoever is there.
"EV adoption is rising" slide decks sent to fleet managers, with no reason specific to their company.
Bulk email to bought leasing lists. The message is the same whether or not they already have a partner.
1 · The signals3 signals. Primary: No public-charging card, app or partner on driver pages; Hiring for salary-sacrifice sales or account roles+
3 signals, 2 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryNo public-charging card, app or partner on driver pagesFirecrawl crawl of the provider's site and driver FAQRivals name one in their FAQ. Theirs says nothing. A screenshot of that gap opens the conversation.
primaryHiring for salary-sacrifice sales or account rolesApify LinkedIn Jobs Scraper; Adzuna job-search APIThey are adding drivers while the gap is open.
supportingA new employer scheme win is announcedFleet News 'Salary Sacrifice' tag feedA dated batch of new drivers who are about to ask how to pay for charging.
2 · QualifyFails the absence test, plus a live job ad inside 60 days+
Fails the absence test, plus a live job ad inside 60 daysA signal is a public event that shows a company is about to need this. The first signal here is the absence test. A crawl of their site finds none of these words: card, app, Electroverse, Paua, Zap-Pay, Allstar, reimburse, public charging. Plus one open "salary sacrifice" job ad inside 60 days.
Fails the absence test, plus a scheme win inside 90 daysA Fleet News scheme win can stand in for the job ad. So can a listing on the GCA RM6268 government framework. Without an absence fail there is no lead.
The list to test: BVRLA lease and broker members, plus RM6268 suppliersThe BVRLA member directory (900 results) gives each name and website. I add the 33 RM6268 suppliers and The Electric Car Scheme's comparison list.
Active UK company, two years old, with some left outCompanies House: active, SIC code (industry code) 77110 or 77120, full or medium accounts. Left out: anyone who already names a partner, has no driver pages, or does rental only, vans only, or motorhomes.
3 · Research + assetAsset: A short PDF teardown of their driver journey, meaning a page-by-page review, in their brand colours+
What I gather on each lead:
The pages crawled, the date, and the words that returned nothing
Driver FAQ screenshot, charging section circled
The job ad and any Fleet News scheme win, with dates
What rivals say, who the commercial lead is, and the current HMRC mileage rates
The asset built for them: A short PDF teardown of their driver journey, meaning a page-by-page review, in their brand colours. Each page sits beside a rival's wording. It ends with the 7p-vs-15p gap at 10,000 miles.
Built with: Firecrawl (crawls the site and the driver FAQ); Playwright (screenshots, builds the PDF); Claude (reads the crawl, writes the research file and the teardown); Exa, Prospeo, Anymailfinder, Companies House API, NocoDB
4 · Outreach5 steps: LinkedIn: a connection request, then direct messages, sent through Unipile; Email (Smartlead, plain text)+
Channels: LinkedIn: a connection request, then direct messages, sent through Unipile; Email (Smartlead, plain text)
1 · LinkedIn connection, then DM1 on acceptFirst message: a screenshot of their driver FAQ with the gap marked, plus 30-60 words I could not find how a driver pays for public charging. Is it in hand?
2 · LinkedIn DM2, day 3Second message: the teardown PDF, in their colours Two pages with no charging answer, a rival's wording next to each.
3 · LinkedIn DM3, day 8Third message: a second screenshot, a rival's FAQ line beside their blank space Drivers read both FAQs. Worth 15 minutes on the driver page?
4 · Email 1 via Smartlead, if no accept within 7 daysPlain text, no image, no link The first message again in four lines: the page name, the date and the one question.
5 · Email 2, five working days laterPlain text. The teardown PDF goes out if they reply. I wrote up your driver journey. Reply and I send it.
The first message goes within 48 hours of them accepting. Accepting and then hearing nothing is where most leads are lost.
The teardown has no meeting ask in it. The ask sits in the third message or in my reply.
Send batches the week after an HMRC mileage rate review (1 March, 1 June, 1 September, 1 December).
Email: no images, no links, no tracking pixels. The PDF goes by reply or LinkedIn message, never as a web link.
5 · Handling repliesYes: If they say yes, I send the Cal.com link+
Yes →If they say yes, I send the Cal.com link. The teardown and the rival FAQ table go out the day before the call.
Question →If they ask a question, I answer with page names, dates and rates from the dossier (the research file on that lead). The PDF goes out on request.
Pushback →If they say it is the "driver's problem", I name two rival FAQs that answer it for drivers. Then I close the thread.
Silence →If they go quiet: second message, third message, email 1, email 2. Then I park the lead. The monthly re-crawl picks the lead up again if their page changes.
6 · The content sideA monthly LinkedIn scoreboard post+
Content: A monthly LinkedIn scoreboard post. It counts how many UK salary-sacrifice providers name a charging partner, who added one this month, and the 7p-vs-15p cost gap.
Free item offered: A free comparison table of every UK provider's driver FAQ: what it says, which partner they name, and the cost gap.
7 · How it improvesRerun the absence test every month+
Rerun the absence test every month. A provider that adds a charging answer after my first message gets a new opening message.
8 · What it taught meThe gap is on their own web page, with a date+
The gap is on their own web page, with a date. There is nothing to argue about.
The job ad and scheme wins show timing. New drivers are arriving now.
Next: the monthly re-crawl refreshes the list and writes the scoreboard post.
The analysis4 rounds. The crawl now runs with subdomains and PDFs switched on+
Round 1
ShowedAccepts stayed normal. First-message replies came back as corrections with a link to a page I had missed. Replies looked healthy, but few of them were positive.CheckedFor each absence fail I opened the Firecrawl job and compared the pages returned with the pages in the site's sitemap. I read the crawl error list and the robots_blocked list. Then I counted absence fails with a short crawl or a blocked driver page, as a share of all absence fails. By default the crawl stayed on the main domain, skipped help.provider.com and PDFs, and was blocked on some driver pages. Some providers also named Bonnet, Shell Recharge or Plugsurfing, and none of those were on my word list.ChangedThe crawl now runs with subdomains and PDFs switched on. I read the error list before any lead is created. Every partner name from a correction reply goes onto the word list. A person opens the driver FAQ by hand before the screenshot is approved.MovedCorrection replies with a link stopped. The absence fails in the results are the count after this recheck, so each one is a gap a person has seen on the page.
Round 2
ShowedLeads with a job ad replied at about the same rate as leads without one. A few 'we are not hiring' replies appeared. The same ad showed several posted dates for one company.CheckedFor each lead with a job ad I recorded the first-seen date and the repost count across Apify and Adzuna. Then I counted the leads whose only ad was a recruitment agency post, or a third-or-later repost. I took that as a share of all leads with a job ad. A ghost job is a role that is not really open.ChangedThe ad must now sit on the company's own careers page, or be an Adzuna ad with the company named. The 60 days count from the first-seen date. A repost more than 60 days after first-seen is not a signal.MovedLeads with a job ad began replying better than leads without one. The hiring count in the results is made with this rule, so it means a real open role.
Round 3
ShowedAccepts stayed normal. In the batch week after the HMRC rate review, first messages sent per accepted connection dropped. Replies per accepted connection dropped too, while replies per message sent held.CheckedI counted first messages sent inside 48 hours, as a share of all connections accepted that week. I counted per lead accepted, never per message sent. Each screenshot waited for a person to approve it, and accepts came in faster than approvals cleared.ChangedI now approve the screenshot and the first message text when the connection request goes out. The accept then triggers the send with no queue. Daily connection requests are capped at what approvals can clear.MovedAccepted connections stopped sitting with no message. The accept rate in the results now turns into first messages instead of leaking between accept and send.
Round 4
ShowedA few correction replies said 'we launched with Paua last month'. I wanted to know whether gaps were closing between the crawl and the send.CheckedFor each message sent I counted the days since the crawl date in the dossier. Then I counted correction replies per lead, split by crawl age, over all leads messaged.ChangedNothing. The corrections did not bunch on older crawls. The monthly re-crawl already catches a page that changes, and a changed page already gets the 'you added one' opener.MovedNothing. The monthly re-crawl in the improvement line stayed the answer.
Kept human, on purpose:
Opening the driver FAQ by hand before a screenshot is approved. The opener says I could not find the page, so a person has to be the last one to look.
Replies that name a partner. A person adds the name to the word list and decides whether the lead is parked or gets a new opener.
If I ran it again: I would crawl with subdomains and PDFs on from the first run, and approve the first message at request time from the start. Both leaks were visible in the first week's counts.
The cost maths$139-305 +extras a month+
The maths: $139 to $305 a month, plus £26. Low: $16 + $29 + $55 + $39 = $139 with Prospeo and Exa on free allowances. High: $83 + $29 + $55 + $39 + $99 = $305 if the crawl and email volumes outgrow them. About $46 to $102 per pilot conversation ($139 to $305 a month over the 3 pilot conversations), plus about £9 (£26 over 3).
Prices, each linked to the vendor page. BVRLA member directory: Free public directory. GCA RM6268 / Contracts Finder: Free public lists. Fleet News tag feed: Free to read. Firecrawl: $16 a month, Hobby plan, 5,000 credits. 187 sites a month fits if a site averages under 27 pages. Bigger crawls need the $83 Standard plan, 100,000 credits. Apify (LinkedIn Jobs Scraper): $29 a month, Starter plan, $29 of platform usage included. Adzuna API: Free API key. The developer page lists no price. Companies House API: Free with a free API key. Exa: Usage based, $7 per 1,000 searches. 187 lookups a month is about $1.31, inside the $10 of free monthly credits. Prospeo: Free plan, 100 credits a month, covers the 41 absence fails. Paid plans start higher ($99 a month for 5,000 credits). Anymailfinder: £26 a month, Basic plan, 400 credits. Claude: Already owned. Runs on the existing Claude Code plan. Playwright: Free, open source. Unipile: $55 a month minimum (49 euros), covers up to 10 linked accounts. Smartlead: $39 a month, Base plan, 6,000 emails a month. NocoDB: Free, open source, self-hosted on the Hetzner box. Python on Hetzner: Already owned. The server already runs. Cal.com: Free individual plan.
The three source lists are free. The server and the Claude plan are already owned.
Alumni · any B2B07 · runs for any B2B with customer historyThe alumni playPast fans who moved to a new company, contacts from lost deals, and heavy users who left. I track them from the CRM and open with the workflow they used to run.+
47tracked moves last quarter across the three lists28%positive-reply rate8meetings·fastest-converting list in the stack
The cost
$226-403 +extrasto run, per month$85-151per qualified meeting
The pushback
"New role, different priorities."
The answer: The first message names the report they ran and offers to set it up on the new team's data. Most of them still need it.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: buy net-new lists every quarter while closed-won and churned records sit unread+
The offer: The same product, set up again for people who used it at their last job, sold to their new employer.
Buy net-new lists every quarter while closed-won and churned records sit unread.
Send 'just checking in' to deals that died two years ago.
Spot a champion's job move six months late, by accident on LinkedIn.
1 · The signals3 signals. Primary: Closed-won champion started at a new company; Closed-lost contact started at a new company+
3 signals, 2 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryClosed-won champion started at a new companyCRM closed-won contacts; Clay Job Change; Sales Navigator alertsThey bought it and ran it. 2-4% of contacts move each month.
primaryClosed-lost contact started at a new companyCRM closed-lost contacts with lost reason; same job-change watch36% of new customers had a closed-lost deal on file (Champify).
supportingPower user from a churned account started somewhere newMixpanel cohort export; same job-change watchNot in the CRM as a contact. Only the usage table shows them.
Any list signal, ICP employer, move inside 90 daysClay writes the move to the alumni table. Python checks size, industry, region and title. Sales Navigator confirms before any send.
The old job actually endedThe previous primary role must show an end date. Advisor, board, fractional and side roles are not moves (known Clay false positive).
First touch 2-4 weeks after start; closed-lost ranked by reasonApollo or Anymailfinder verifies the new email first. Timing, budget or no decision goes first; lost to a competitor second, competitor named.
ExclusionsNew employer already a customer or open deal (hand to the account owner in Slack); do-not-contact list; promotion inside the same company.
3 · Research + assetAsset: A 60-second Loom of that workflow in a demo workspace named for their new company, plus an annotated new-role post screenshot+
What I gather on each lead:
Old deal: what they bought, closed date, lost reason
What they ran: top features, last-active date, workflow name
The move: new company, title, start date, likely scope
New company: headcount, stack, any competing tool
The asset built for them: A 60-second Loom of that workflow in a demo workspace named for their new company, plus an annotated new-role post screenshot.
Built with: Claude Code (reads CRM and usage rows, drafts); Clay (move detection, enrichment); Apollo (new work email); Playwright (post screenshot); Loom (demo)
4 · Outreach5 steps: LinkedIn DM from the AE or CSM; Email (plain text, same person); Phone (closed-won champions only)+
Channels: LinkedIn DM from the AE or CSM; Email (plain text, same person); Phone (closed-won champions only)
1 · LinkedIn DMAnnotated screenshot of their new-role post Congratulates them. Names the report they ran. Does the new team have one?
2 · Email, day 3Plain text, no link Offers to set that workflow up on the new team's data in a week.
3 · LinkedIn DM, day 860-second Loom under their new company's name Shows it already built. Asks for a 15-minute walkthrough.
4 · Phone, closed-won champions only, day 10-14Call from the old AE; one voicemail Names the workflow and the Loom.
5 · Email, day 21Plain text Closes the thread. The list is checked each quarter.
The sender is the AE or CSM who owned the relationship, never an SDR.
First touch 2-4 weeks after the start date, never on day one.
No meeting ask in step 1. The ask starts at step 2.
The Loom link goes in a LinkedIn DM. The email stays link-free.
The sender approves every draft before it goes out.
5 · Handling repliesYes: Cal.com link in the thread+
Yes →Cal.com link in the thread. Row tagged booked. Account owner pinged in Slack.
Question →Drafted from the dossier and usage history. The old AE sends it.
Pushback →"New role, different priorities": name the workflow again, ask if the team has one.
Silence →Email day 3, Loom day 8, call by day 14, close day 21. Watched.
6 · The content sideLinkedIn posts for the new-job moment: three reports to rebuild in 30 days+
Content: LinkedIn posts for the new-job moment: three reports to rebuild in 30 days. The AE comments on every alumnus new-role post.
Free item offered: First-30-days rebuild kit: the report as a template in the new company's name.
7 · How it improvesAutomate the quarterly re-export so new closed-won, closed-lost and churned contacts join the watch list on their own+
Automate the quarterly re-export so new closed-won, closed-lost and churned contacts join the watch list on their own.
8 · What it taught meThey know the product+
They know the product. The message names the thing they used.
The list refills itself: 2-4% of contacts move each month.
Next: cron the quarterly re-export; rank closed-lost by which reasons book.
The analysis4 rounds. I added two earlier warnings: a power user going quiet in Mixpanel, and a hard bounce on the old work email+
Round 1
ShowedMoves arrived in clumps instead of a steady trickle. Reply rate fell off for moves detected long after the real start date. Clay fires when the person edits their LinkedIn profile, and most people do that two to four weeks after they start.CheckedFor every detected move in the quarter, I compared the start date on the profile with the date the watch fired. I counted the share with a gap over 30 days, over all detected moves, from an unfiltered pull.ChangedI added two earlier warnings: a power user going quiet in Mixpanel, and a hard bounce on the old work email. Both flag a likely leaver before the profile changes. When the gap was big, the first touch was timed from the detection date instead.MovedLate detection stopped eating the two-to-four-week window after a start. The positive-reply rate in the results reflects the list after this change.
Round 2
ShowedDetected moves looked healthy but positive replies came in low. Some replies said the person was never really involved with the tool. The CRM export listed whoever was on the deal, often the signer, and the person who ran the reports was never added.CheckedI counted closed-won deals in the export with zero or one contact attached, over all closed-won deals. Then I counted replies saying they did not use the product, over all replies.ChangedI rebuilt the champion list from the usage table first: Mixpanel top users per account, then the CSM's named contacts. The CRM roles became the third source. The Mixpanel export already existed for churned accounts, so I pointed it at live accounts too.MovedReplies started coming from people who had actually run the product. That is the list behind the 28% positive-reply figure.
Round 3
ShowedStep 1 LinkedIn replies held, but the day-3 email step showed a big skipped-for-no-email share. A person two weeks into a new job is not in the email databases yet. Every meeting traced back to a LinkedIn touch.CheckedI counted qualified rows with a verified new email by day 3, over all rows that passed qualify. Then bounces from the AE's mailbox, over emails sent.ChangedThe email waterfall now re-runs weekly for 60 days after detection. Step 2 holds until an address verifies. When none exists by day 5, the same text goes as a LinkedIn DM instead. A guessed address never gets sent from the AE's mailbox.MovedThe sequence stopped stalling at step 2, and the AE mailboxes stayed clean. Meetings still come mostly through LinkedIn, and the channel order now reflects that.
Round 4
ShowedThe qualify step has a rule that the old job must show an end date, because Clay flags advisor, board and side roles as moves. I wanted to know if bad moves were still getting through.CheckedI read every detected move for the quarter and checked the previous main role for an end date, over all 47 detected moves.ChangedNothing. The end-date rule was already catching the advisor and board flags. The check ran and the step held.MovedNothing moved. The check confirmed the 47 tracked moves were real moves.
Kept human, on purpose:
The AE or CSM reads and approves every draft before it goes out. The message trades on a real relationship, and one wrong detail burns it.
The phone step stays fully human. A call from the old AE only works as a real conversation.
If I ran it again: I would build the champion list from the usage table on day one instead of trusting the CRM contact roles. I would also start the email waterfall at detection, so an address is ready before step 2 needs it.
The cost maths$226-403 +extras a month+
The maths: About $226 to $403 a month in dollar tools ($54-$167 Clay, $89.99-$119.99 Sales Navigator, $49-$59 Apollo, $32.50-$39 SmartLead, $0-$18 Loom), plus £26 Anymailfinder and €49 Unipile. About $85 to $151 per meeting ($678 to $1,209 over three months, divided by the 8 meetings a quarter in the results), plus the £26 and €49 subscriptions.
Prices, each linked to the vendor page. Clay: $167 a month billed monthly, or from $54 a month billed yearly (Launch plan). LinkedIn Sales Navigator: $119.99 a month, or $89.99 a month billed yearly (Core plan). Apollo: $59 a user a month, or $49 billed yearly (Basic plan). Anymailfinder: £26 a month for 400 credits; it only charges for verified emails. SmartLead: $39 a month, or $32.50 a month billed yearly (Base plan). Loom: Free up to 25 videos, then $18 a user a month (Business plan). Unipile: €49 a month minimum, before VAT. UserGems or Champify: UserGems publishes $3,333 a month (Core plan), so the Clay route carries this play until that scale. Cal.com: Free on the individual plan.
HubSpot or Salesforce, Mixpanel and Slack are the company's existing systems. NocoDB, Python and Playwright are free. The Hetzner box and the Claude Code plan are already owned. UserGems is excluded from the monthly total because the play runs on Clay until a few thousand contacts.
Recruitment08 · for a specialist recruitment agencyThe reposted-job distress signalThe same job reposted three times in sixty days. The opening line is how many days their own job has been open.+
58distress roles / month11%reply3–5briefs taken / month
The cost
$198-204 +extrasto run, per month$40-68per qualified meeting
The pushback
"We're handling it internally."
The answer: Open N days, reposted N times. The internal route has already run. Two profiles in five days, no fee unless one is hired.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: email hr lists with "top talent available" and unasked-for candidates+
The offer: Specialist permanent placements, sold to hiring managers at companies whose own hiring for a role has stalled.
Email HR lists with "top talent available" and unasked-for candidates.
Call every new job post the day it goes up, with every other agency.
Generic "we specialise in your sector" InMail to anyone titled Talent.
1 · The signals4 signals. Primary: Same role reposted on LinkedIn 3+ times, 60 days; Role open 45+ days from first sighting+
4 signals, 2 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primarySame role reposted on LinkedIn 3+ times, 60 daysDaily Apify LinkedIn Jobs scrape, keyed title+company+locationThree refreshes and still no hire. The internal team cannot fill it.
primaryRole open 45+ days from first sightingFirst-seen date from the scrape; Adzuna created; Reed dateA number the hiring manager already knows. Stricter than the 30-day practitioner line.
supportingAdvertised salary band raised between repostsAdzuna salary_min/max; Reed minimumSalary/maximumSalary; LinkedIn salaryInfoThey will pay more for the same bar. Budget is approved.
supportingTwo or more agencies already on the roleReed Jobseeker API postedByRecruitmentAgency; Adzuna company.display_nameThey already pay agencies, and those agencies have not filled it.
2 · QualifyOne primary fires, one supporting live inside 30 days+
One primary fires, one supporting live inside 30 daysDaily Python job over the job-snapshot table in NocoDB. One row per sighting; repost counter and salary diff run over those rows.
Role inside the agency's niche, seniority band and patchTitle allow-list and seniority keywords per client, matched on title and description. Location filter; Reed distanceFromLocation.
Direct employer, not an evergreen roleReed postedByDirectEmployer=true; drop names on the agency list. Drop titles posted 6+ months with several openings (drivers, care, warehouse).
Not already a client, no live brief on this roleMatch on company domain against the agency's CRM before the lead enters the queue.
3 · Research + assetAsset: A real screenshot of their LinkedIn job card showing the "Reposted" label, repost dates and days-open circled+
What I gather on each lead:
Role timeline: first seen, each repost, days open, boards
Salary band per sighting; applicant count (Apify applicantsCount)
Hiring manager (jobPosterName, jobPosterProfileUrl) or head of talent
Agencies on the role; Exa news; two closest placements
The asset built for them: A real screenshot of their LinkedIn job card showing the "Reposted" label, repost dates and days-open circled. No capture, text-only DM.
Built with: Apify LinkedIn Jobs scraper; Reed API; Adzuna API; Prospeo; Exa; Claude (dossier, drafts); Playwright (screenshot capture)
4 · Outreach6 steps: LinkedIn DM via Unipile; Cold email via Smartlead; Cold call by the agency consultant+
Channels: LinkedIn DM via Unipile; Cold email via Smartlead; Cold call by the agency consultant
1 · LinkedInConnection request, no note To the hiring manager who posted the job.
2 · LinkedIn DM, on acceptAnnotated job-card screenshot, 30-60 words Up N days, reposted N times. Two placements this quarter. Still open?
3 · Email, day 2Plain text, no link, no attachment Same days-open number and one proof line, to the hiring manager.
4 · Cold call, day 4One-page dial card from the dossier Timeline on the card. Asks what has been stopping the hire.
5 · LinkedIn DM, day 6Plain text with the newest signal A fresh repost, a raised band, or a second agency on the role.
6 · LinkedIn DM, day 12Plain text Two profiles if still open, otherwise no more messages.
The AI drafts; the consultant approves every DM and email before it sends.
No capture, no image. The screenshot is never redrawn.
Proof is one sentence. No deck, no candidate list.
Sequence pauses when the posting leaves every board. Re-opens on the next repost.
5 · Handling repliesYes: 15-minute brief on Cal.com+
Yes →15-minute brief on Cal.com. Two profiles inside five working days.
Question →Fee terms, availability, how the search runs: drafted, then the consultant approves.
Pushback →"Handling it internally": N days, N reposts, the internal route has run. No-hire-no-fee.
Silence →Day 6 and day 12 follow-ups, then park. Re-queue on next repost.
6 · The content sideWeekly founder post: longest-open roles in the niche by title and days open, no company names+
Content: Weekly founder post: longest-open roles in the niche by title and days open, no company names. Monthly salary-band post.
Free item offered: Monthly hard-to-fill report: open days, repost counts, salary bands by title and region.
7 · How it improvesSplit the opener by applicant count: few applicants gets a sourcing opener, hundreds gets a screening opener+
Split the opener by applicant count: few applicants gets a sourcing opener, hundreds gets a screening opener.
8 · What it taught meThe trigger is their own behaviour on public boards+
The trigger is their own behaviour on public boards. The message repeats their numbers.
One snapshot table feeds outbound, the weekly post and the monthly report.
Next: rank the queue by the size of the salary rise between reposts.
The analysis4 rounds. The queue now needs one signal that costs the employer money before a lead enters+
Round 1
ShowedDistress roles per month looked fine and reply rate held, but briefs per reply collapsed. Replies said on hold, not active right now, or we keep it open for the pipeline. Studies put a fifth to a third of listings as roles nobody is trying to fill. Those get refreshed on a schedule, so they look exactly like distress.CheckedI counted replies saying the role was on hold or not active, over all replies. Then I counted 3-plus-repost leads whose salary band and applicant count never changed across sightings, over all 3-plus-repost leads.ChangedThe queue now needs one signal that costs the employer money before a lead enters. That means a raised salary band, a second agency on the role, or a paid urgent label. A repost with the same band and the same applicant count is a refresh, and it waits.MovedThe queue got smaller and replies started coming from employers with a live hiring problem. The 3-5 briefs a month in the results rest on that filter.
Round 2
ShowedRepost counts hit three on day one for a few large multi-site employers, and those employers dominated the queue. Some applicant systems force one listing per city, so one role posted in four cities counted as reposts.CheckedI counted 3-plus-repost leads where every sighting shared the same first-seen date, over all 3-plus-repost leads. Then the share of the month's queue coming from the top five companies, over the month's queue.ChangedThe counter now keys on company plus a hash of the job description text. Same-day listings in different cities count as one posting. Titles are fuzzy-matched, so Senior Quantity Surveyor and Quantity Surveyor (Senior) count as the same role.MovedThe multi-site employers dropped out of the queue. Small single-site employers with a real stalled role started reaching the threshold.
Round 3
ShowedAccept rate held and reply rate held, but one group of leads never produced a brief. Their replies said we do not use agencies, or send it to careers. The name on the job card was the in-house recruiter, whose job is to fill the role without agency fees.CheckedI counted queued leads where the poster's title contained recruiter, talent, people or HR, over leads queued. Then replies that became briefs, per lead messaged, split by poster type.ChangedWhen the poster has a talent title, I read the job description for the reports-to line. Then I find the line manager on Sales Navigator by title and company. The DM and the call now run at the line manager. The talent contact stays on email only.MovedBriefs stopped sitting at zero on recruiter-posted roles. The reply figure stayed where it was; the change was in who was replying.
Round 4
ShowedThe whole queue depends on dropping agency-posted roles. I wanted to know if any were slipping past the Reed employer flag and the agency name list.CheckedI read a month of queued leads, over all leads queued that month. I checked each poster against the agency name list and the Reed direct-employer flag.ChangedNothing. The flag and the name list were already catching them. The check ran and the step held.MovedNothing moved. It confirmed the 58 roles a month come from direct employers.
Kept human, on purpose:
The consultant approves every DM and email before it sends.
The day-4 call stays with the consultant, because the brief gets agreed by phone.
If I ran it again: I would key the repost counter on the job description text from day one. I would also backfill first-seen dates from the Adzuna and Reed dates at launch. Then the 45-day signal works in week one instead of week seven.
The cost maths$198-204 +extras a month+
The maths: About $198 to $204 a month ($29 Apify, $39 Prospeo, $32.50-$39 SmartLead, $97 GoHighLevel), plus €49 Unipile. About $40 to $68 per brief taken ($198 to $204 a month over the 3-5 briefs a month in the results), plus the €49 subscription.
Prices, each linked to the vendor page. Apify: $29 a month (Starter); results cost $1 per 1,000, so the credit covers 29,000 cards a month. Reed Jobseeker API: Free API key sign-up; no price is published. Adzuna API: Free API key sign-up; no price is published. Prospeo: $39 a month for 1,000 credits (Starter), one credit per email. Exa: Pay as you go at $7 per 1,000 searches, with $10 of free credits a month. SmartLead: $39 a month, or $32.50 a month billed yearly (Base plan). GoHighLevel: $97 a month (Starter plan). Unipile: €49 a month minimum, before VAT. Cal.com: Free on the individual plan.
NocoDB, Python and Playwright are free. The Hetzner box and the Claude Code plan are already owned. Exa stays inside its free monthly credits at 58 roles a month, since 58 searches cost well under $1.
The job hunt09 · for a GTM role · running nowThe play I'm running right nowMyself, as a GTM engineer or founding operator, sold to founders and hiring managers at seed-to-Series-A startups. The call is an interview.+
No results yet. This one is running now. What comes back will show here.
The cost
€49, sharedto run, per monthn/a yetper qualified meeting
The pushback
What are your salary expectations?
The answer: Acknowledge the question, ask what they have budgeted for the role, then answer against their band. Never give the floor first.
Read it stage by stageThe before, the signals, qualify, research, outreach, handling replies, the content side, how it improves, what it taught me. Then the analysis, and the cost maths.
0 · The beforeWhat everyone else does: apply through the form, attach one general cv, wait+
The offer: Myself, as a GTM engineer or founding operator, sold to founders and hiring managers at seed-to-Series-A startups. The call is an interview.
Apply through the form, attach one general CV, wait.
A long LinkedIn note listing every achievement, CV attached again.
Deep research on every company first, so volume stays a handful a week.
1 · The signals3 signals. Primary: GTM Engineer or Founding Operator role on LinkedIn Jobs+
3 signals, 1 primary. A signal is a public event that shows a company is about to need this. A primary signal starts the outreach. The other signals rank the list.
primaryGTM Engineer or Founding Operator role on LinkedIn JobsLinkedIn Jobs board, Shamas's own account; 8-12 roles a dayEvery application starts from a JD found on the board.
supportingRecruiter-posted or anonymous postingThe poster: recruitment agency or talent partner; about a thirdRecruiter-mediated applications converted. The recruiter becomes the outreach target.
supportingA recent funding roundCompany press; Crunchbase; the funding pageThe strongest signal line in the outreach. A long gap is flagged privately.
2 · QualifyGTM or Operator track, strong or medium fit, no stop+
GTM or Operator track, strong or medium fit, no stopTriage table, one row per role, under 5k tokens, at most one search. Apply or skip. Engineer-titled roles converted; marketer-titled did not.
Salary floor: employer-published band under GBP 70k is a stopState whether the figure is employer-published or an aggregator guess. A third-party estimate never stops. Never say the floor to an employer.
Decline SWE or FDE roles, visa sponsorship; flag credential gatesRead the JD's coding bar; self-select out. IB, PE, VC or consulting required: strong match elsewhere only, name the screen risk.
Red flags named; Shamas's reply is the only build gateNo salary plus senior scope, stale funding, shrinking headcount, unmet hard requirements, location. 2-4 lines per role. Nothing built until he replies.
3 · Research + assetAsset: Per role: tailored CV PDF, a cover note opening on the problem the hire fixes, pre-written form fields, a four-touch message sequence+
What I gather on each lead:
One named target: LinkedIn URL, provider_id, connection status
Stage, funding, product, buyer, competitors, one 90-day signal
Why this role now: the problem this hire solves
JD stack mapped against claim-boundaries.md; salary with source
The asset built for them: Per role: tailored CV PDF, a cover note opening on the problem the hire fixes, pre-written form fields, a four-touch message sequence.
Built with: Claude Code with the job-apply skill; WebSearch and WebFetch; Unipile; NocoDB job_applications; job-hunt/references/claim-boundaries.md; render_pdf.py (headless Chrome); preflight_check.py
1 · Employer application formTailored CV PDF, cover note, form fields Opens on the problem the hire solves, then evidence. Shamas submits it.
2 · LinkedIn connection requestBlank request, no note Next working day, 08:45 recipient-local. Blank requests accept at about 55%.
3 · LinkedIn DMPlain text, one portfolio link, 60-95 words I applied for [role]. Three evidence bullets, the link, one fit question.
4 · LinkedIn DMPlain text, new substance only Day 3: one outside-in observation and the smallest useful first test.
5 · LinkedIn DMPlain text Day 7-8: still interested if active, open to future roles. Stop.
Shamas submits the employer form. Never automate Easy Apply or a logged-in session.
8 job invites a day, inside a 25-a-day LinkedIn ceiling shared with client outbound.
All sends 08:45 recipient-local, weekdays only. Never reattach the CV.
Never volunteer a gap. Never name the salary floor. Nothing false, ever.
Approval hashes recipient, channel, time and body. Every application gets a NocoDB row.
5 · Handling repliesYes: Row flips to interview+
Yes →Row flips to interview. Steps 3-4 still send; Day-7 close suppressed. Interview-prep takes over.
Question →No script. Each question gets a written answer the same day, from the dossier.
Pushback →Salary: ask what they budgeted, answer against their band. Other objections answered once, then left.
Silence →Runs to the Day-7 close, then stops. A rejection cancels everything that day.
6 · The content sideLinkedIn profile on the GTM Engineer keyword set, a pinned proof post, the demo video, twice-daily Stream B posts+
Content: LinkedIn profile on the GTM Engineer keyword set, a pinned proof post, the demo video, twice-daily Stream B posts. No Open-to-Work badge.
Free item offered: The GTM portfolio vault; their GTM system drawn and first 90 days written, free.
7 · How it improvesKeep an engineer-or-builder tagline on marketer-titled roles+
Keep an engineer-or-builder tagline on marketer-titled roles. Running since 2026-07-27; compare against the title-mirroring packs.
8 · What it taught meA cheap triage gate lets 8-12 roles a day die before any pack+
A cheap triage gate lets 8-12 roles a day die before any pack.
The JD is the record: route, CV variant and cover-note flag logged.
Next: a single-message sender, then email once address-finding pays.
The analysis4 rounds. Nothing yet+
Round 1
ShowedThe only source is the LinkedIn Jobs board on one account. A role goes live on the company's careers page or its Greenhouse or Lever board first. LinkedIn picks it up a day or more later, so the applicant count is often already high when triage sees the role.CheckedEvery application gets a NocoDB row, so I am logging the card's applicant count at submit time. The split I am waiting on is any employer response by day 21, by how old the posting was when I applied.ChangedNothing yet. The planned change is a daily watch on the careers pages of a named list of seed-to-Series-A AI companies, so the form goes in before the LinkedIn crowd arrives.MovedNot known yet. The response split by posting age will make the call.
Round 2
ShowedTriage is one row, under 5k tokens, at most one search. That cannot tell a real opening from a listing with no hire behind it. Reports put a fifth to a third of listings in that group, and their only answer is silence.CheckedI am watching rows that stay at applied with no status change, and whether roles older than 30 days at submit go quiet more often than fresh ones.ChangedTriage now carries three cheap ghost checks: a Reposted label, posting age over 30 days, and the same title open in several cities. Any one of them moves the role to the bottom of the day's list instead of a pack.MovedNot known yet.
Round 3
ShowedEight job invites a day plus client outbound share one LinkedIn account. LinkedIn caps invitations at about 100 per rolling week, and pending invites count against it. A full cap means invites sit pending and the DM steps never fire.CheckedI count invitations sent across both queues in the last rolling seven days against the 100 cap. I also count pending invitations older than 14 days, over invitations sent in the last 30 days.ChangedPending invites older than 14 days get withdrawn. The combined weekly total stays under the cap, with job invites taking first claim on weekdays. A daily heartbeat row logs how much of the weekly cap is left.MovedNot known yet. The number I am watching is the accept rate against the usual 55% blank-request level.
Round 4
ShowedA positive reply flips the row to interview, but steps 3 and 4 still send by design. A founder who has already replied could get the day-3 message as a fresh send in the same thread. It would read as a script running on its own.CheckedI read every positive-reply thread before the next send window, and check whether any queued step is still armed on that recipient.ChangedOn any positive reply, every queued step on that recipient is paused and the thread moves to interview prep. Only a reply I write myself goes out after that point.MovedNot known yet. No thread has been burned this way, and this rule exists to keep it at none.
Kept human, on purpose:
I submit every employer form myself, and never automate a logged-in LinkedIn session. The account everything else runs on is not worth one saved click.
Any message after a positive reply is written by me, never queued.
If I ran it again: I would start the careers-page watch before leaning on the LinkedIn board. I would also put the ghost checks into triage from day one instead of adding them after reading the silence.
The cost maths€49, shared a month+
The maths: €49 a month, and that subscription is shared with client outbound. Everything else is free or already owned. Not known yet. No results to divide by.
Prices, each linked to the vendor page. Unipile: €49 a month minimum, before VAT; already paid for client outbound, and the job hunt shares the same account. Vercel: Free on the Hobby plan. Perplexity Comet: Free; the browser has been free to download and use since October 2025.
LinkedIn Jobs, GitHub, Excalidraw, Playwright, Cal.com and NocoDB are free. The Hetzner box, the Claude Code plan and the Google Workspace account are already owned.
03
The vault
Funnel job: depth · take anything
The databases, skills and automations I run GTM from. Every item is a working tool. Download it and use it.
the shelves
DATABASESwhat I check before any strategy call
Growth Playbooks
How 143 companies got their first customers, and how they grew from there. Each entry records the growth motion (the main way they won customers), the channel mix, the stage and the revenue. It is built as a database, so you search it for an answer instead of reading it end to end.
143 companies · 14 growth motions · open the database ↗
CLAUDE CODE SKILLS + AUTOMATIONSsix packs, each a folder you can take. Enrichment means adding contact and company details to each lead. The automations are Python code, linked to the skills. They work with whatever tools you already run.
Cold email
8 Claude Code skills · 2 code automations · take the folder ↗
Cold DM / LinkedIn
7 Claude Code skills · 1 code automation · take the folder ↗
Signal sourcing
6 Claude Code skills · 2 code automations · take the folder ↗
Enrichment & data
6 Claude Code skills · 4 code automations · take the folder ↗
Content
7 Claude Code skills · 2 code automations · take the folder ↗
Reply & follow-up
5 Claude Code skills · 1 code automation · take the folder ↗
GTM role repo
Whoever takes the GTM role does not start from scratch. The skills above are collected into one repo, with notes on each tool and how to use it. I keep it updated.
open the repo ↗
n8n12 no-code workflows · free to takeThe automations, in one placeFor teams that run n8n. I build in code, so these are the no-code versions. They cover finding leads, enrichment, sending, reply handling and CRM sync. Each one is an n8n file you can import.
+
Agentic b2b lead enrichment
take the workflow ↗
Apollo cold email personalisation
take the workflow ↗
Apollo decision maker discovery
take the workflow ↗
Hiring signal to lemlist hubspot
take the workflow ↗
Lead capture scoring crm routing
take the workflow ↗
Linkedin comment trigger auto dm
take the workflow ↗
Linkedin lead capture crm sync
take the workflow ↗
Ai reply qualification
take the workflow ↗
Company enrichment from website
take the workflow ↗
Form lead verify enrich pipedrive
take the workflow ↗
Google maps lead scraper
take the workflow ↗
Linkedin hiring signal scraper
take the workflow ↗
The n8n shelf
Twelve no-code GTM workflows, free to take. Press a card to open the build on GitHub.
04
Content
Funnel job: authority · top, middle and bottom of the funnel
Posts do a job outreach cannot do. They warm up the list, so people have seen my name before any message lands. There are three tiers, each with a different job. Reach a wide audience, give something useful, then show the evidence.
the tiers
TOP OF FUNNELreach a wide audience · emotion first: funny, sad, a reaction, a view against the crowd, or a comment on something that happened. Reach is the job.
The teardown post
A reaction to something everyone does. Built to be argued with.
The contrarian post
One line against the common view. The reader repeats it that week.
The commentary post
The image makes the point. The text points at the image.
The carousel
One idea per slide. People save it more than they like it.
MIDDLE OF FUNNELgive something useful · a playbook, a how-to, an idea the reader can use that week.
The playbook post
How to do one thing, start to finish. Often paired with a magnet, a free item the reader gets by commenting. A DM delivers it.
What a magnet can beUsually handed out here, in the middle of the funnel, but any tier can carry one. Five types I use.+
BOTTOM OF FUNNELshow the evidence · a client result, a demo, a walkthrough of the solution, a number on screen.
The evidence post
What was built, who it was for, and what it did. The result makes the case, so I do not have to pitch.
LIVEClaude Code Community Events London · 10 June
I was one of ten speakers at London Tech Week. The talk is on pattern interruption in GTM. It covers why the signals everyone uses stopped working, and what breaking that pattern looks like in a live outbound system.
05
The guarantee
Funnel job: the close · I carry the risk
This holds whether it is a job, a contract, or a one-off consult. Before we speak, I draw your GTM system and write your first 90 days, using what is public about your company. It is free, and you keep it either way.
both, shown
Your GTM system, drawn
The signals in your market, how I would check each one is worth acting on, and how I would reach the people behind it. This is the template. Yours is built from your company.
Your first 90 days, written
What I would do in the first month, what I would make repeatable in the second, and what I would measure in the third. This is an example.
STACKeverything above, one wall
GOV
06
Get in touch
Happy to walk through any play, or draw yours before we speak