Portfolio

Portfolio: the system behind a campaign

Cold email for B2B sellers. These are the charts of how we run it, the checks that stop a bad send, and the actual copy with the process behind it.

This page is for a buyer or a hiring manager who wants to check how we run cold email before handing us a market.

9 GTM engineering projects, each with a prompt you can copy, are in Projects. Campaign results are in What worked.

THE WHOLE SYSTEM

Swipe sideways to see the whole chart.

01 / All stages

Architecture

Every campaign passes through the same layers in the same order. Steps with a solid outline run by themselves. Steps with a dashed outline wait for a person: nothing sends until the list and copy are approved, and no reply goes out until that reply is approved. Dotted lines show what each layer reads from or writes to the records.

Swipe sideways to see the whole chart.

  • Build
  • Send
  • Replies
  • AI side and records
  • Waits for your approval

02 / All stages

Stack

The tools under each layer, grouped the same way as the chart above.

Lead data

  • Public records and trade data
  • Contact databases

Email verification

  • Two independent email verifiers

Sequencer

  • Smartlead
  • Generic sending domains
  • Warmed mailboxes

Monitoring

  • Preflight
  • Send watchdog

AI layer

  • Claude Code
  • Skills
  • Hooks
  • Memory

App

  • Next.js
  • Convex
  • Vercel

03 / All stages

How it got built

Each part was added after a specific problem showed up. The steps below are in the order they were built.

  1. Send

    First sends

    Problem: Once campaigns were sending, a change saved mid-send could email the same person twice.

    What we built: The sequence lock, the lead-add lock and the watchdog that pauses a campaign by itself.

    The failures behind these guards are in What broke.
  2. Build

    List quality

    Problem: Paid enrichment was running on leads that would never fit the buyer.

    What we built: The funnel: a small sample first, free filters, a cheap fit score, and paid enrichment only on the leads that pass.

  3. Build

    Email checks

    Problem: One verifier was the only check between a bad address and the sending domain.

    What we built: A second, independent verifier. Preflight fails any lead missing a result from either one.

  4. Send

    Sending domains

    Problem: Cold email from a client's own domain would put their main inbox at risk.

    What we built: Generic sending domains, mailboxes warmed before use, and a daily cap on each mailbox.

  5. Replies

    Replies

    Problem: Campaigns sold different offers, so one reply script gave some prospects the wrong answer.

    What we built: Reply sorting, and drafts written for the offer that campaign sold. Each draft waits for approval.

  6. AI side

    AI side

    Problem: A rule set in one working session was gone by the next one.

    What we built: Hooks that block a rule break before the action runs, and memory that every session starts from.

Talk through how this system would run on your market.

Request a GTM Audit

04 / Build

From a raw list to a send

Paid enrichment is the expensive step, so it only touches leads that already passed everything free. A bad list gets caught for pennies.

05 / Build

Two checks on every email address

One verifier misses things, so every address goes through two. A missing result from either one fails preflight.

06 / Build

One list, before and after

The left side is a raw list as it comes out of a contact database. The right side is the same list after the free filters, the fit check and the two email checks. Each dropped row shows the step that removed it and why.

MockA worked example in the real format. Invented companies, people and addresses.
Raw list
  1. Northfield Valve Works

    Dana Ortiz, VP Sales

    dana@northfieldvalve.example

  2. Brightwater Seals

    Owen Pratt, President

    owen@brightwaterseals.example

  3. Ostrander Flow Group

    Lena Fischer, Regional Director

    lfischer@ostranderflow.example

  4. Calder Pump Co.

    Marcus Lee, Owner

    marcus@calderpump.example

  5. Kessler Hydraulics

    Tom Brandt, Sales Manager

    tbrandt@kesslerhyd.example

  6. Marlow Machine & Tool

    Ana Ruiz, Owner

    ana@marlowmachine.example

  7. Ridgeline Fittings

    Priya Shah, GM

    priya@ridgelinefittings.example

  8. Pinecrest Controls

    Sam Okafor, Marketing Lead

    s.okafor@pinecrestcontrols.example

After the funnel
  1. Northfield Valve WorksKept

    Valid on both email checks.

  2. Brightwater SealsDropped at free filters

    Dead domain. The website does not load and the mail server does not answer.

  3. Ostrander Flow GroupDropped at free filters

    Wrong size. Far above the company size this list is built for.

  4. Calder Pump Co.Kept

    Valid on both email checks.

  5. Kessler HydraulicsDropped at fit check

    Owned by a distributor. The email says there is no distributor in the middle, which would be false here.

  6. Marlow Machine & ToolDropped at fit check

    Job shop. Makes parts to other companies' drawings and has no branded product to sell.

  7. Ridgeline FittingsKept

    Catch-all server. Kept and flagged in the preview.

  8. Pinecrest ControlsDropped at email checks

    Invalid email. Verifier one says the mailbox does not exist.

Paid enrichment runs only on the rows that pass the free filters and the fit check.

07 / Send

How a send is protected

Re-saving a campaign mid-send can email the same person twice. Each guard below blocks or acts. The watchdog runs on its own schedule, independent of any session.

GuardWhat it stops
Sequence lockSaving a campaign's sequences after it has sent anything. No bypass.
Lead-add lockAdding leads to an active or completed campaign. Order is pause, add, preflight, restart.
Duplicate-lane gateCreating a second campaign with the same name as a live or draft one.
PreflightA one-step or empty sequence, a lead already in another campaign, missing verification results.
Send watchdogAnything that slipped through. Runs every five minutes and pauses the campaign itself.
ClockGuessing the day or hour. The real time and send window print on every prompt.

08 / Send

What broke, and what stops it now

Each guard above exists because something went wrong without it. These are the failures, what each would cost if it reached a prospect, and the check that blocks it now.

Sequences re-saved during a send

What happened

A campaign's sequences were saved again after it had started sending. Some people got the same email twice.

What it would cost

A repeat email looks careless to the person who gets it, and duplicate sends count against the sending domain.

What stops it now

The sequence lock blocks any save once a campaign has sent. The watchdog pauses a campaign by itself if one lead gets the same step twice.

Leads added to a running campaign

What happened

Leads went into a campaign that was already sending, outside the pause and preflight order the rest of the list went through.

What it would cost

Those leads skip the duplicate and verification checks, so a bad address or a person already emailed elsewhere can get through.

What stops it now

The lead-add lock blocks adding to an active or completed campaign. The order is pause, add, preflight, restart.

One campaign created twice

What happened

The same campaign was built twice under one name, and both copies pointed at the same people.

What it would cost

Everyone on that list could get two first emails from two campaigns.

What stops it now

The duplicate-lane gate blocks a new campaign with the same name as a live or draft one.

A lead with no verification result

What happened

A lead reached a campaign without a result from the email checks, so nobody knew if the address existed.

What it would cost

Bounces count against the sending domain, and a domain that bounces too much stops reaching inboxes.

What stops it now

Preflight fails any lead missing a result from either verifier, and the campaign stays paused until it is fixed.

09 / Send

How sends reach the inbox

Campaigns send from domains kept for sending. None of them carries a client's brand, so your own domain never sends cold email. Each mailbox warms up before a campaign uses it and has a daily cap. The watchdog pauses a campaign on a duplicate send. A domain that gets flagged is paused, and its mailboxes stop sending.

Swipe sideways to see the whole chart.

Ask how these send guards would apply to your campaigns.

Request a GTM Audit

10 / Replies

How a reply is handled

The draft depends on which offer that campaign sold. No dollar figure goes into any reply, and nothing sends until it is approved. Replies go out in the thread they came from.

See how replies would be handled for what you sell.

Request a GTM Audit

11 / Build

Copy, and the process behind it

Every email states a fact about the company, asks where their deals come from, says what we do in one sentence, and makes one ask. Four variants of a real campaign are below. Merge fields are in double braces and fill from each lead's own data.

A{{product}} accounts

{Hi|Hey} {{first_name}}, Is most of your new {{product}} business still coming through distributors or dealers? We {open|start} direct conversations with the businesses that buy {{product}} in your territory, with no distributor in the middle. Shall I show you what that looks like for {{company_name}}? {sender}

Bwho picks the brand

{Hi|Hey} {{first_name}}, When a distributor picks which {{product}} brand goes in front of the buyer, is {{company_name}} part of that conversation? We {open|start} direct conversations with the businesses that buy {{product}} in your territory, so the order comes to you. Shall I show you what that looks like for {{company_name}}? {sender}

Cbuyers you talk to

{Hi|Hey} {{first_name}}, How many of the businesses that buy {{product}} in your territory does {{company_name}} talk to directly, and how many only through a distributor? We {open|start} direct conversations with the ones you do not reach, so new accounts do not depend on a dealer. Shall I show you what that looks like for {{company_name}}? {sender}

Dsomething new in {{product}}

{Hi|Hey} {{first_name}}, When {{company_name}} launches something new in {{product}}, how does it reach buyers before a distributor decides to stock it? We {open|start} direct conversations with the businesses that buy {{product}} in your territory, so the new product gets in front of people who can buy it. Shall I show you what that looks like for {{company_name}}? {sender}

The copy gate runs before anything is built. It checks word count, banned words, one question per email, and that the ask is identical across variants:

copy_gate output
--- A | {{product}} accounts | 45 words
--- B | who picks the brand | 51 words
--- C | buyers you talk to | 56 words
--- D | something new in {{product}} | 58 words
PASS

12 / Build

Check your own cold email

A simplified version of the copy gate above. Paste an email and it checks length, the number of questions, a list of filler phrases, the number of links, and whether the email ends on one question. The real gate has more rules than this.

The check runs in your browser. Nothing you paste is stored or sent anywhere.

13 / Build

Niche teardowns

Each niche gets the same worksheet: who buys, where their deals come from now, which public record gives a fact about each company, and why that fact fits what they sell.

Petroleum equipment contractors

Independent contractors who install and service fuel tanks, dispensers and piping.

Public source

EPA and state tank registration files

Why it fits

The file shows how many regulated tanks sit in the contractor's own state, which is the market they can serve.

Aggregate and crusher equipment dealers

Independent dealers selling crushing and screening equipment to quarries and pits.

Public source

MSHA mine registry

Why it fits

Active mines in a dealer's territory are the operators who buy. The file shows operators, not intent, so the email never claims a mine will buy.

Self-funded health plan administrators

Independent third-party administrators running claims for employers that fund their own plans.

Public source

Form 5500 filings

Why it fits

The filings list self-funded plans by state, so the email can name the pool in the administrator's footprint.

Industrial demolition and decommissioning

Contractors who take down plants and facilities.

Public source

State WARN closing notices

Why it fits

A closing notice is public and dated. It is a lead on a facility changing hands, not a promise of a job, so the copy says only what the notice says.

Safety equipment makers

Manufacturers of protective gear who sell mostly through distributors.

Public source

OSHA citation data by standard

Why it fits

The fact has to match the product. A respirator citation figure goes to a respirator maker, never to a glove maker.

Data center equipment makers

Manufacturers of power, cooling, cabling and fluid-handling parts sold to data center builders, mostly through channel partners.

Public source

Data Center World 2026 exhibitor list

Why it fits

Being on the list is a public, dated fact about the company and shows it sells into this market. It shows presence at a show, not intent to buy, so the email says only that the company was on the list.

Glove, boot and protective-fabric makers

Makers of hand, foot and fabric protection who sell through safety distributors.

Public source

National Safety Council Safety Congress 2026 exhibitor list

Why it fits

The exhibitor fact works the same way as on the data center card. The check that matters is ownership. A maker owned by a distributor is dropped, because the email would wrongly say there is no distributor in the middle. Distributors themselves and wrong-company domain matches are dropped too.

Branded manufacturers that sell through distributors

Independent makers of branded industrial products whose orders mostly come through dealers.

Public source

Company records filtered by industry and size, then each company's own dealer or distributor pages

Why it fits

The fact in the email is something the company published about itself. Each lead goes through a fit check that drops a giant or foreign parent, job shops, dealers and wrong people. A person check then needs one source outside the contact database before the lead is approved.

14 / Replies

What worked

Each card is one campaign: the hook, the ask, what came back in the replies, and the limits of what it proves.

Cleaning contractors, public-record hook

Hook

A federal contract ending near the contractor, taken from a public award record.

Ask

Can I send you the contract details?

What came back

Owners and managers replied yes and asked for the contract details, the contracting office and the timeline.

What it shows

A fact the reader can check for themselves gets a yes before any pitch.

Limits

A yes here means the contractor wants the lead. It is not a sale. One reply was a decline that said government contracts go to the lowest bid. The sequencer counted an auto-reply as positive, so every positive reply was read by hand.

Roofing contractors, public-record hook

Hook

An open public bid in their area that a roofer could answer.

Ask

Can I send it over?

What came back

Roofers replied yes. One asked for the full bid package and whether they could bid as a subcontractor. Another said yes if the job was flat-roof work, which is the fit the hook was built for.

Limits

A yes here means the roofer wants the bid. It is not a sale. Every positive reply was read by hand, the same as on the cleaning campaign.

Commercial production studios

Hook

A specific buyer need in their region.

What came back

Studio owners replied with questions about us and sent their portfolios, so each reply opened a conversation.

Limits

The replies were few. A yes from a studio is a yes from the supplier side, and a buyer still has to agree.

What the pattern says

In the same trades and from the same sending setup, a dated public fact the reader could check beat the plain pay-per-lead campaigns that had no such fact. The next test is the same hook in a new trade.

Each campaign was a small send, so this pattern is a lead to test and not yet a proven rate.

15 / Build

Markets we test and turn down

Before any money goes into a market, we size it from free data and run a small test sample through the same fit and email checks a real list gets. If too few reachable buyers come out the other end, the market stops there and no contacts are bought.

Some of the kinds of markets that stopped at this test:

Turned down

Government contractors

The test pool held too few reachable buyers to fill a campaign.

Turned down

Small manufacturers

The test pool held too few reachable buyers to fill a campaign.

Turned down

Logistics firms

The test pool held too few reachable buyers to fill a campaign.

Find out whether your market passes the same test.

Request a GTM Audit

16 / Build

What you approve before it starts

Every campaign stops at a 10-lead preview. You see each lead, the fact the email uses, the email check result, and why the lead fits, then approve or send it back. The table below is a mock built in the same format as the real preview. Every company and person in it is made up.

MockSame columns as a real preview. Invented companies and people.
LeadFact used in the emailEmail checkWhy it fits
Northfield Valve Works
Dana Ortiz, VP Sales
Lists a distributor network on its dealer pageValid on bothFits: makes the product, sells through dealers
Calder Pump Co.
Marcus Lee, Owner
Exhibits at one regional trade showValid on bothFits: small maker, no direct sales team listed
Ridgeline Fittings
Priya Shah, GM
Dealer locator covers four statesCatch-all, flaggedFits: dealer-led, owner reachable

Mock rows. A real preview has ten.

17 / Build

The copy as data

The same four variants as the JSON the gate reads and the preview renders from.

copy.json
[
  {
    "label": "A",
    "subject": "{{product}} accounts",
    "body": "{Hi|Hey} {{first_name}},<br><br>Is most of your new {{product}} business still coming through distributors or dealers?<br><br>We {open|start} direct conversations with the businesses that buy {{product}} in your territory, with no distributor in the middle.<br><br>Shall I show you what that looks like for {{company_name}}?<br><br>%sender-firstname%"
  },
  {
    "label": "B",
    "subject": "who picks the brand",
    "body": "{Hi|Hey} {{first_name}},<br><br>When a distributor picks which {{product}} brand goes in front of the buyer, is {{company_name}} part of that conversation?<br><br>We {open|start} direct conversations with the businesses that buy {{product}} in your territory, so the order comes to you.<br><br>Shall I show you what that looks like for {{company_name}}?<br><br>%sender-firstname%"
  }
]

18 / AI side

How the AI side runs

The work runs through Claude Code. A skill is loaded for each kind of task. Hooks check every action before it runs and block the ones that break a rule. When something goes wrong, the lesson is written to memory so the next session starts with it.

19 / All stages

Decisions and why

  • Single-step campaigns stay. Most replies come from the first email, so the effort goes there.
  • Campaigns that were not working were stopped, not left running.
  • Every guard blocks or acts. None of them is a reminder to be careful.
  • No competitor names in any email. A wrong or dead name costs more than it earns.
  • Proof on this site is limited to what we can show.

22 / Send

The kill gate: when a campaign gets flagged

A rule for pausing a campaign that is not working, written before any campaign could trigger it.

  • It looks at each active campaign and counts leads whose first email went out at least 48 hours ago.
  • Below 2,000 such leads it prints 'too early' and flags nothing. Smaller samples mislead more than they inform.
  • At 2,000 or more it flags a campaign as a kill candidate if the reply rate is under 1% with out-of-office replies removed, or if positive replies are under 5% of replies.
  • It only flags. A person decides every pause, and the gate is not wired into the sender.

Checked on every active campaign on 18 October 2026: all were too early, the largest had about 29 leads. The rule has not been able to fire at our scale yet, and this page does not pretend otherwise.

23 / Build

The fact check: a line about a company must be on its own site

An email that opens with a detail about the recipient is only as good as that detail. A model can write one that sounds right and is wrong.

  • Numbers, years and capitalised names in the line must appear on the company's home, about or services page.
  • At least 70% of the other content words must appear there too.
  • A spelled-out count such as 'six advisors' always fails, because it cannot be matched safely.
  • If the site cannot be read, preflight warns instead of failing. Facts that come from a job posting are skipped, because they come from the posting, not the site.
  • A line that fails is blanked before upload, so the email goes out without it instead of with a wrong one.

Tested on 20 real leads: 17 of 18 real facts passed, and the one miss was 'molder' against 'molding', which fails safe. We then wrote 10 wrong facts by hand (wrong year, state, city, customer, certification) and all 10 were caught.

24 / Build

The intake page: a campaign is written down before a list is pulled

  • One page per campaign: the buyer, the trigger, who to exclude, who to never email, the offer, whether the economics clear our own bar, seed companies, how many sendable leads we are aiming for, and the expected yield.
  • A free size check comes first. It refuses to go ahead without a complete intake.
  • Preflight fails any campaign created after 19 October 2026 that no intake lists, and warns on older ones.
  • The exclusions are agreed before any pull. They used to live only in someone's head, which is how a wrong target got shown once.

25 / Build

A free filter by the software a company runs, and where it misleads

  • It reads the technology fingerprints on a company's site, so we can keep or drop companies that use a tool that fits or rules them out.
  • It runs only on companies that already passed the funnel, and before any paid lookup, so it costs nothing.
  • Limit one: the fingerprints are loose. A test run tagged a large marketing platform's own website as a site-builder.
  • Limit two: tools that only appear after the page runs its scripts are missed.
  • So it is a filter that needs a spot check, and it is not wired into the main funnel yet.

26 / Build

Two verifiers, and which results stop a send

  • Every address is checked by the data source and again by a second, independent verifier.
  • Invalid and mail-server-error results are hard stops. They are never loaded.
  • Accept-all addresses (a domain that says yes to everything) are kept but sent at lower volume, because the answer is unknowable and not bad.
  • Unknown results, such as timeouts, are never loaded either.
  • Preflight runs the second verifier itself on any active lead that lacks a stamp, and fails the campaign on an invalid, a server error or a missing result.

First list through the new rule, 177 leads: 101 valid, 61 accept-all, 13 unknown, 2 invalid. The 13 unknown were paused before a single send.

27 / Build

The cost ladder: cheapest check first

Paid steps run on survivors only.

  • A sample of 100 first, and we read the best 10 and worst 10 before running the rest.
  • Free filters next: does the site exist, can it be read, is it the right kind of company.
  • A small, cheap model scores each company against one written sentence describing the buyer, reading the company's own site. This step costs about twelve cents per thousand leads.
  • A larger model confirms and finds one fact, but only for the leads we would actually send.
  • Paid email lookup and verification run last, and only on what is left. A hook blocks those tools for any domain that did not survive.

A roofing run, start to finish: 321 companies, 240 sites readable, 190 scored as a fit, and 11 of 12 checked leads confirmed by the larger model.

28 / Send

The preflight checklist, in full

A campaign cannot start until every check passes, and a change after the check voids it.

  • The sequence has every step it should and none is empty. A one-step or blank sequence fails.
  • Every lead is rendered locally at both extremes of the wording variants, so a broken merge field shows up before send.
  • Copy rules fail on hard errors. Booking links fail, other links and dollar figures warn.
  • The send window is weekdays, 9 to 5 Eastern, and all webhooks are registered.
  • Leads are checked against banned industries and our do-not-email list, and against every other campaign: a lead already in another campaign fails, and so does a company domain already sent to.
  • Every address has both verification results, and every personal fact is grounded on the company's site.
  • The campaign has an intake page, and the variants of an A/B test are balanced.
  • The check stores a fingerprint of the copy, leads, inboxes and settings. If any of them changes after the check, the launch refuses to start.
  • After start, a monitor runs every 5 minutes for 15 in-window minutes: no sends raises an alert, a bounce rate of 7% or more on at least 20 sent pauses the campaign, and a missing webhook or dead watchdog raises an alert.
  • A dry sweep of every draft campaign runs each Monday at 8:45 Eastern before the send window opens.

29 / Send

Warmup: what it is, what week one looks like, what we watch

  • A new inbox on a new domain has no history. For about two weeks it exchanges mail with other warming inboxes so mailbox providers learn that it behaves like a person.
  • Week one looks poor and is normal. We measured warmup mail on new inboxes: roughly a quarter to a third of it landed in spam folders in the first eight days, and it improves as the inbox ages.
  • Nothing is sent to your market during warmup. That is why month one is about half a month of sending.
  • We watch each inbox's reputation score, not just whether warmup is switched on. On 26 September the average across 270 inboxes was 94%, and 24 were under 85%.

20 / All stages

Projects

Available for contract GTM engineering

I build lead lists, reply handling and signal checks for outbound, and I run them on Breezy's own cold email. Each project below lists the problem, how it works, numbers from a real run, what broke, and a prompt you can copy and use today.

Book a callCounts and costs are from real runs. Company names, lead data and prices are left out on purpose.

01

Lead qualification pipeline

Turns a raw company list into a short list the companies' own websites confirm, spending money only on what survives the free steps.

02

Reply triage system

Classifies every prospect reply, picks the one correct next move, drafts it, and leaves the send to a person.

03

Signal radar

Watches public sources for the moment a buyer needs you, and checks one real, dated signal per lead before any email mentions it.

04

Messaging generation and copy gate

Writes cold email variants from one offer and one fact per lead, then blocks any variant that breaks a written rule before it can reach a sending tool.

05

Market screening test

Decides whether a market is worth a campaign before a list is bought, by scoring a sample of 40 companies against one sentence and a bar that was set in advance.

06

Per-lead fact check

Checks that the one personal line in an email appears on the company's own website, and blanks the line before upload if it does not.

07

Two-verifier email gate

Runs every address through a second, independent verifier and blocks the campaign if any lead has an invalid result, a server error or no result at all.

08

The 10-lead preview

Shows ten real leads, the line and the source behind each, and exactly what each prospect would receive, so the list and the copy are approved before anything is sent.

09

Preflight and launch gate

A set of checks a campaign must pass, a fingerprint that voids the pass if anything changes afterwards, and a hook that refuses to start a campaign without a fresh pass.

01 / Data engineering

Lead qualification pipeline

Turns a raw company list into a short list the companies' own websites confirm, spending money only on what survives the free steps.

Python, headless Claude Haiku scoring, SQLite cache, 11 unit tests on the grounding step

The problem

A bought or scraped list is mostly the wrong companies. A database export of "marketing agencies" holds holding-company subsidiaries, associations, dead sites and firms that do something else entirely. Every enrichment credit and every email spent on those is wasted, and the sending reputation takes the hit.

This pipeline keeps only companies whose own website matches a written buyer definition. Each paid step sees only what survived the cheaper step before it.

One real run

4,138 rows of independent agencies, scored against a one-sentence buyer definition.

Raw rows in

4,138

After free filters

1,576

2,526 already seen or duplicate, 26 look like associations or schools, 10 had no domain

Site readable

1,368

47 domains did not resolve, 161 live with no readable text

Score 2 (clear match)

572

Scored 0: 589. Scored 1: 207. Only a 2 moves on.

Model cost for the scoring step on that run was $1.54 for 1,368 sites, about $1.13 per 1,000. A 100-row pilot on a different niche cost $0.10 and kept 12, which shows a niche is thin before any more rows get pulled.

How it works

StageWhat happensCost
1. Free filtersDedupe, drop rows with no domain, drop association and school names, drop domains already contacted$0
2. FetchRead each homepage once, cache it 30 days, retry failures, drop dead sites$0
3. ScoreA small model reads the page text and scores 0 to 2 against the buyer definition, with a written reason. Only 2s surviveCents per 1,000
4. Deep checkOn survivors only, a stronger model writes one fact about the companySurvivors only
5. Ground the factPlain code re-reads the site and passes the fact only if every number, every name and most content words appear on it. An unreachable site gets no fact$0

A model can write a detail that sounds right and is missing from the page, so step 5 checks every fact against the site. On a test set, 17 of 18 real facts passed and all 10 deliberately wrong ones were caught. A spelled-out count ("six advisors") always fails, because code cannot count names on a page.

What broke, and what changed

  • Dropping every free-mail and role address in the first stage also dropped good companies on lists built from map data, where the only email is the firm's own. In one early run that removed 16 of 33 good firms. Company-first lists now get their own flag.
  • Scoring a vague buyer definition with no sample run first produced confident, wrong scores. A --sample 100 mode now scores a random 100, prints the 10 best and 10 worst with reasons, and stops so a person reads them before the full run.
  • Models approve marginal companies to be helpful unless told what the buyer is not. The definition now takes an explicit exclude list.

Use it yourself

Start with a CSV that has a domain column, then apply the same four rules:

  1. Write the buyer as one sentence, plus a separate list of what they are not.
  2. Sample 100 first. Read the 10 best and 10 worst reasons before running the rest.
  3. Require a written reason on every verdict, and tell the model to answer "none" when the page does not say.
  4. Run a cheap model on everything, then a stronger one only on the survivors.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

You are screening companies for a cold outreach list.
BUYER: <one sentence: who they are, what they sell, who they sell to>
NOT THE BUYER: <comma list: associations, resellers, subsidiaries, ...>
You will get the text of a company's homepage.
Score 0 = not the buyer, 1 = unclear, 2 = clearly the buyer.
Return JSON: {"score": 0|1|2, "reason": "one sentence quoting the page"}.
If the text is empty or unrelated, score 0 and say so. Never guess.
2 fields still blank

02 / Revenue operations

Reply triage system

Classifies every prospect reply, picks the one correct next move, drafts it, and leaves the send to a person.

Playbook skill, eleven reply codes with answer-time targets, send guards with 21 tests

The problem

Cold email produces a trickle of replies, and most of the value sits in a few of them. A reply that waits a day books a fraction of what the same reply books in fifteen minutes. A wrong reply costs more than a late one: the wrong price, the wrong offer for that campaign, a calendar link nobody asked for, or a second email to someone who asked to be removed.

This system classifies every reply, decides the next move, drafts it, and stops. A person sends it.

The eleven reply types

Every reply gets exactly one code. If a reply mixes types, the highest-value intent wins.

CodeTypeMoveAnswer within
AYes, book itTwo live time slots as text, no link15 min
BPrice askStructure only, never a dollar figure1 hr
CWants it in writingFull offer by email, no call ask1 hr
DObjectionAgree, one question, one small next stepSame day
ESend me infoOverview, one qualifying question, two slots1 hr
FWrong person or referralThank them, get the name, new thread to that personSame day
GNot nowPin a month, log it, stop the sequenceSame day
HNot interestedNothing, or one sorting line. Never re-pitchSame day
IUnsubscribe or angrySuppress the whole domain first. Reply only if they asked a questionImmediately
JOut of officeNo reply. Handled automaticallyNone
KQuiet after a yesFollow-up ladder at 24 to 48 hours24 to 48 hr

A reply that only says "send me info" counts as neutral. A reply that asks a question counts as positive.

The rules that stop mistakes

Offer first. Before any reply, look up which offer that campaign sold. Campaigns carry different terms, and a reply with the wrong structure contradicts the email the prospect answered.

No dollar figure in any reply. Price comes up on a call.

No calendar links. Offer two specific times as text.

Nothing sends itself. Replies, reminders and follow-ups are drafts. Automatic replies are off in production.

An unsubscribe suppresses the whole domain, everywhere, before anything else happens.

Reply rates use contacts sent as the denominator, with machine replies removed first.

Speed is a rule because of a third-party benchmark from a lead-gen firm's client data: an answer under 15 minutes books about 73% of positive replies, four hours about 31%, a day or more about 12%. The answer-within column above comes from it. The same source puts a healthy ratio of booked calls to positive replies at 45 to 60%, and anything under 35% points to broken reply handling.

Four numbers decide whether reply handling works: positive replies per 1,000 contacts, booked calls per positive reply, calls that show, and minutes from reply to answer. The next addition is a pre-call reminder sequence, because cold-sourced meetings no-show more often than inbound ones.

Try the sorting

Sort a reply

A rule-based version of the sorting, so it only catches the clear cases. Anything it does not recognise goes to a person, which is the right default. The prompt below handles the rest.

Code C: Wants it in writing

Send what exists in writing, and offer a call.

Use it yourself

Paste this into any assistant with a reply in hand. It returns the code and a draft.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

Classify this reply from a cold email prospect with exactly one code:
A yes/book, B price ask, C wants it in writing, D objection, E send info,
F wrong person/referral, G not now, H not interested, I unsubscribe/angry,
J out of office, K quiet after yes.
If several apply, pick the highest-value intent.
Then draft the reply: under 60 words, no dollar figure, no links,
two specific times as plain text if a call is the next step.
If code is I, do not draft. Say: suppress the domain.
Thread:
<paste>
1 field still blank

03 / Buying signals

Signal radar

Watches public sources for the moment a buyer needs you, and checks one real, dated signal per lead before any email mentions it.

Python, scheduled weekly Slack scoreboard, 17 unit tests

The problem

Some services only sell when the buyer has a need right now: they just raised money, they are hiring for the role your service replaces, or a public event affects them. A static list cannot show when that happens. A signal detector watches public sources and reports who changed this week.

There are two pieces. One measures how often a market announces demand before any money goes into it. The other checks one real, dated signal per lead before any email mentions it.

Piece one: the radar

It subscribes to public feeds for each candidate market, counts qualifying events per week, and posts a ranked scoreboard to Slack every Monday at 08:00 from a scheduled job.

A dead feed still parses and still returns entries, all of them old. One trade feed parsed fine with a newest item 757 days old, and another was 532. Read at face value, a dead feed looks like a quiet market and gets a good market rejected. Every run now starts with a liveness check, every digest prints a staleness warning, and a missing feed is reported as missing, never as zero.

The radar ranks markets already on the list. New markets come from what is already known and from neighbors of a market already running. 17 unit tests cover the counting and the staleness logic.

Piece two: the signal check

For every lead, it looks for exactly one verifiable signal and records its type, text, date and link.

SignalHow it is checkedRule for the email
FundingA news headline that names the company and a raise, dated inside 240 daysMention the round only if the date is in the window
HiringAn open sales or growth posting whose company name matches, posted in the last 30 daysName the role. Confirm the date is recent before writing "saw you are hiring"
NoneNeither foundSend the plain offer. Make no claim about them

Cost is about $0.0005 per lead. Filters exclude look-alike headlines such as charity fundraisers and community drives. A companion tool pulls one row per hiring company, collapses repeat postings, keeps the newest, and refuses to run if it would drain the data pool below a reserve.

What broke, and what changed

  • Dead feeds, described above.
  • A funding "year" from one data source is a year with no date. Claims in copy now require a real posting or news date.
  • A model asked to find a signal will invent one. The check returns "none" when nothing verifiable exists.

Use it yourself

The method works with free tools and a spreadsheet: Use a model that can search the web, because it has to find a dated source for each company.

  1. Pick the one trigger that comes before a purchase of your service.
  2. Find a public feed or search that shows it, and check that the newest item is under a week old.
  3. Log the date, company and source link. Count per week.
  4. Only email a company whose signal is dated and linkable. If there is none, send the plain offer.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

For each company below, search for ONE signal: raised funding in the last 240 days,
or an open <role> posting in the last 30 days.
Return: type (funding|hiring|none), the exact headline or posting title,
its date, and its URL.
If you cannot find a dated, linkable source, return type none.
Do not infer, estimate or fill in a date.
Companies:
<list>
2 fields still blank

04 / Messaging systems

Messaging generation and copy gate

Writes cold email variants from one offer and one fact per lead, then blocks any variant that breaks a written rule before it can reach a sending tool.

Python gate scripts shared by build and send time, a failing-build voice test, browser demo below

The problem

A model asked for cold email copy writes the same email every time, in the same cadence, with the same openers. Prospects read that cadence in one line. The rules for avoiding it also tend to live in prose, and prose does not stop anything: the same tics came back after being banned in writing several times.

This system generates variants from a fixed structure, then runs every variant through checks that fail loudly. Nothing reaches a sequencer until the checks pass.

How it works

CheckWhat it enforcesWhen it runs
Length30 to 75 words in the body, counted after every spintax option is expandedBefore the campaign is built
Banned words and marks15 entries, among them em dashes, "robust", "unlock", "free", "guarantee" and "quick question"Before the campaign is built
Voice tells8 patterns that fail on sight ("it's not X, it's Y", tee-up openers, reveal setups) and 4 that warnBuild time and again at send time
Repeated wordThe same content word twice in one sentence fails, plurals counted as the same wordBuild time and again at send time
One ask, one questionEvery variant must carry a question and the ask must be identical across variants, so a test measures the angle and not the askBefore the campaign is built
Every spin combinationEach spintax combination is printed so a person reads what a prospect could actually receiveBefore the campaign is built
Fact on their siteThe one fact about the lead is re-read against their own website (project 01) and dropped if it is not thereBefore upload

The same voice and repeated-word checks run again when the campaign is started, so copy edited by hand after the build still gets checked. Outward-facing page copy is covered by a unit test that fails the site build on the same tics.

What broke, and what changed

  • A rule written as a sentence in a doc did not stop the tics. The same cadence was banned in writing repeatedly and kept coming back until the rule became a test that fails the build. Fix the copy, never the test.
  • A line like "cafes opening, cafes still dialing in" passed review and went into a live preview. The repeated-word check came from that miss.
  • A closing line that promised to stop emailing on silence was false, because the system does follow up. It is now a hard fail.
  • Hype words from a generic spam list would have rejected every email, so single words are not enforced from it and only phrases are.

Try the checks

A browser-only version of the length, question, filler, link and ask checks. The text never leaves this page.

The check runs in your browser. Nothing you paste is stored or sent anywhere.

Use it yourself

Try the checks on your own email below, then use the prompt to generate variants that hold the same rules.

  1. Pick one fact about the company that is on their own site, and one offer.
  2. Write the email as: that fact, what you do about it, one question.
  3. Run it through the checks. Fix the copy, not the rule.
  4. Change one thing between variants: the angle or the subject, never both.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

Write 3 cold email variants, 30 to 75 words each.
Fact about the company (from their own site): <fact>
What I offer: <one sentence>
Structure: the fact, what I do about it, then exactly one question.
Rules: no em dashes, no exclamation marks, no links, no "quick question",
no "robust" or "unlock", no "it's not X, it's Y", no tee-up opener
like "I hope this finds you". Do not repeat a content word inside one sentence.
Every variant must end on the same question. Vary only the angle.
2 fields still blank

05 / Market selection

Market screening test

Decides whether a market is worth a campaign before a list is bought, by scoring a sample of 40 companies against one sentence and a bar that was set in advance.

A Python test that pulls company rows, a small model that reads each company's own website, a fixed pass rule

The problem

A market looks large on a registry or a directory and shrinks once the wrong companies come out. One registry listed about 4,000 repair stations, and the independent ones left after filtering came to between 40 and 65. A campaign built on the registry figure would have spent on a list that was never the buyer.

This test decides before any money is spent on a list. It samples companies, reads each company's own site, and scores it against one written sentence about the buyer. The pass rule is fixed first, so the result cannot be argued into a yes.

One real run

One market, start to finish: independent forklift and lift truck dealers.

Sampled

40

company rows from a contact database, one per company

Clearly the buyer

25

Unclear

3

Not the buyer

12

manufacturers, trailer dealers, parts only, a lumber company

The rule needed at least half the sample to be the buyer and at least 40 firms in the market. It passed. A hand check of the 25 then cut 7 more on ownership, because they belonged to a parent group or had been sold, so the independent pool is smaller than the raw estimate.

How it works

MarketSampledClearly the buyerDecision
Independent forklift and lift truck dealers4025Taken
FAA Part 145 repair stations459Killed
Hydraulic cylinder and pump repair shops397Killed
Commercial kitchen equipment service393Killed
Motor, generator and pump rewind shops407, and 13 unclearNot taken, needs a hand check
Aerial and scissor lift dealers3512Killed
Floor scrubber and sweeper dealers401Killed
Racking and conveyor integrators397Killed
Air compressor distributors4012, and 10 unclearNot taken, needs a hand check

Two limits are written into the rule. A company that lists the buyer's industry as one of several is not counted as the buyer unless it is its primary market. And a market that passes the sample still needs a hand check on ownership before a list is built.

Try the pass rule

Run the pass rule

Enter what your sample of companies scored. The rule is the one above: at least half the buyer and at least 40 firms.

TAKE

63% of the sample is clearly the buyer and the market holds 60 firms.

Use it yourself

Write the buyer as one sentence, set the bar before you look, then score a sample of 40 with the prompt below.

  1. Write one sentence: who the buyer is, and who it is not.
  2. Set the bar first: what share of the sample must be the buyer, and how many firms the market must hold.
  3. Pull one row per company, not one per person, so a large firm does not fill the sample.
  4. Read each company's own site, score it, and count.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

You are testing whether a market is worth a campaign.
The buyer is: <one sentence, including who it is NOT>
For each company below, read its description and homepage text and answer with one word:
BUYER, UNCLEAR or NOT. A company that lists this industry as one of several
is NOT unless it is clearly its primary market. A company owned by a parent group is NOT.
Return the list, then the counts of BUYER, UNCLEAR and NOT.
The market passes only if BUYER is at least half the sample and the market holds at least <N> firms.
1 field still blank

06 / Messaging systems

Per-lead fact check

Checks that the one personal line in an email appears on the company's own website, and blanks the line before upload if it does not.

A Python check with no model and no cost, wired into the pre-launch checks and the upload step

The problem

An email that opens with a detail about the recipient lands only if the detail is true. A model can write a detail that sounds right and is wrong: a wrong year, a wrong city, a customer they do not have. A prospect who spots one stops reading.

This check reads the same pages the line was written from and compares them to the line. A line it cannot find is blanked, so the email goes out without it and not with a wrong one.

One real run

A test on 20 real leads in one niche.

Real facts checked

18

Passed

17

Failed

1

'molder' against 'molding', so it fails safe

Wrong facts written by hand

10

wrong year, state, city, customer, certification

Caught

10

Model cost

$0.19

Every wrong fact was caught and none passed. The one real fact it rejected was a spelling variant, which is the direction it should err.

How it works

RuleWhat it enforces
Numbers and yearsMust appear on the company's home, about or services page
Capitalised namesMust appear on those pages
Other content wordsAt least 70% must appear on those pages
Spelled-out countsAlways fail, such as 'six advisors', because they cannot be matched safely
Unreadable siteWarns in the pre-launch check and does not fail
Facts from a job postingSkipped, because they come from the posting and not the site

Checking only the home page failed 9 of the 18 real facts on the first run, so the check reads the same three pages the writer read. It has not been tuned outside manufacturing.

Try the check

Check a line against a page

Paste the text of a company's pages and the one line you want to open an email with. The same rules the check uses run on it.

Grounded: the line stays

  • Pass: Numbers and yearsAll appear on the page
  • Pass: Capitalised namesAll appear on the page
  • Pass: Spelled-out countsNone in the line
  • Pass: Other content words (at least 70%)5 of 5 appear on the page (100%)

Use it yourself

Use the prompt to make a model give you a line plus the sentence it came from, then check the line yourself against the page.

  1. Ask for one fact and the exact sentence on the page that supports it.
  2. Check numbers, years and names against the page text.
  3. Drop the line if it cannot be found. Send the email without it.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

From the company website text below, write ONE factual line about the company
that you could open a cold email with, and quote the exact sentence from the text that supports it.
Rules: use only what is in the text. Do not infer a year, a city or a customer.
If nothing in the text supports a line, answer NONE.
Return: LINE: <the line>   SOURCE: "<the exact sentence>"
2 fields still blank

07 / List quality

Two-verifier email gate

Runs every address through a second, independent verifier and blocks the campaign if any lead has an invalid result, a server error or no result at all.

A Python filter around a verification API, the same check run again inside the pre-launch checks

The problem

One verifier is the only check between a bad address and the sending domain, and a bounce hurts the domain's reputation. The data source's own 'verified' flag is one opinion, and nothing in our pre-launch checks read it.

This gate adds an independent second opinion and makes a missing result a failure, so an unverified lead cannot slip through because nobody ran the check.

One real run

The first list through the gate.

Leads

177

Valid

101

Accept-all

61

a domain that says yes to everything

Unknown

13

timeouts and mail-server errors

Invalid

2

The 13 unknown leads were paused before any send. Valid and accept-all leads go in, and accept-all leads go out at lower volume.

How it works

ResultMeaningWhat happens
ValidThe address existsLoaded
Accept-allThe domain accepts everything, so the address cannot be confirmedLoaded, sent at lower volume
UnknownTimeout or mail-server errorNever loaded
InvalidThe address does not existNever loaded
No resultThe check was never runThe campaign fails its pre-launch check

The pre-launch check runs the second verifier itself on any active lead that lacks a stamp, and writes the stamp back once it has a result. The verifier is rate limited, so a large list runs slowly and the check is built to resume.

Try the sorting

Sort verifier results

Paste a CSV with an email column and a result column from any verifier. It sorts the rows the way the gate does and gives you the file you may load.

  • Valid: 2Loaded
  • Accept-all: 1Loaded, sent at lower volume
  • Unknown: 1Never loaded
  • Invalid: 1Never loaded

Use it yourself

Use the prompt to have an assistant write the filter for your own list, then run every list through it before an upload.

  1. Verify with a second tool, not the one that supplied the list.
  2. Split the results into valid, accept-all, unknown and invalid.
  3. Load valid and accept-all only, and send accept-all at lower volume.
  4. Make a missing result a failure, not a pass.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

Write a Python script that takes a CSV with an email column, checks each address with
<verifier API>, and writes four files: valid.csv, accept_all.csv, unknown.csv, invalid.csv.
Respect the API's rate limit, resume from where it stopped if it is interrupted,
and print the count in each file. Never put unknown or invalid addresses in a file that is uploaded.
1 field still blank

08 / Approval

The 10-lead preview

Shows ten real leads, the line and the source behind each, and exactly what each prospect would receive, so the list and the copy are approved before anything is sent.

Research on public sources, a render script that fills the email as the sender will send it

The problem

A list can pass every automatic check and still contain a lead that looks wrong the moment a person reads it. A preview puts ten real leads in front of the buyer, with the evidence for each, before a campaign exists.

The render script prints each email with the spintax chosen and the variables filled. A missing variable prints as a visible marker, so an empty name cannot reach a prospect unseen.

What each lead in the preview carries

FieldWhat it shows
Person and titleWho we would email, found on the company's own site, press or an association page and not only a contact database
CompanyThe business and its city
The factOne checkable line for the first line of the email
The sourceThe link that proves the fact
IndependenceThe evidence the company is not owned by the manufacturer, a private equity firm or a parent group
The emailThe full text exactly as it would be sent, with every variable filled

On the forklift dealer market, of the 25 companies in the pull, 9 passed clean and 7 were cut because ownership failed on the evidence. A preview that shows only the survivors would hide that, so the cut companies and the reason are kept with it.

Why it comes before the list

The preview is the approval step. The buyer sees the people, the lines and the emails, and corrects them while changing them costs nothing. After approval the campaign is built from what they saw.

Try the render

Render a lead's email

Write the email with {{variables}} and {spin|options}, and give one lead's fields. See exactly what that lead would receive. A missing field shows up as a marker, not as a blank.

Missing: territory
Hi Chad,

Fairfield has sold lift trucks since 1982. We email the plants in <<MISSING territory>> that run lift trucks.

Shall I show you what that looks like for Fairfield Lift?

Use it yourself

Ask for the preview in this shape for your own market before you commit to a list. Use a model that can search the web, because it has to find people, sources and ownership. A model without search will tell you it cannot.

  1. Ask for ten leads, not a count.
  2. For each, ask for the person, the title, the line, the link that proves it, and the ownership evidence.
  3. Read the emails as the recipient will, with every variable filled.

Prompt builder

Fill the fields and the prompt below is ready to paste. Anything you leave blank stays as a marker.

Build a 10-lead preview for this market: <one sentence describing the buyer>.
For each lead give: person and title, company and city, one checkable fact, the URL that proves it,
and the evidence the company is independent (not owned by a manufacturer, a private equity firm or a parent group).
Then write the email exactly as it would be sent, with every variable filled in.
Use web search. If you cannot source a line, write NONE for it. If you cannot search the web, say so and list what to look up instead. Do not guess.
1 field still blank

09 / Send safety

Preflight and launch gate

A set of checks a campaign must pass, a fingerprint that voids the pass if anything changes afterwards, and a hook that refuses to start a campaign without a fresh pass.

Python checks, a command hook on the sending tool, a monitor that runs after start, a weekly sweep of every draft

The problem

Most sending mistakes are things that were checked once and changed later: a lead added to a live campaign, copy edited by hand, a setting flipped. A check that runs only once does not stop them.

This system makes the check a condition of starting. The start command is refused unless a pass from the last 12 hours exists, and the pass is voided if the copy, leads, inboxes or settings change after it.

How it works

StageWhat it does
ChecksSequence complete, every lead rendered at both wording extremes, copy rules, send window, webhooks, banned industries, do-not-email list, duplicates across campaigns, both verifier results, per-lead fact check, intake page
FingerprintA hash of the copy, leads, inboxes and settings is stored with the pass. If it no longer matches, the start is refused
Launch hookAny command that would start a campaign is denied unless the pass is under 12 hours old. The override can only be set before the session begins, never typed in
After startFor 15 in-window minutes, a monitor checks that emails are going out, pauses the campaign at a 7% bounce rate on 20 or more sent, and alerts on a missing webhook or a dead watchdog
Weekly sweepEvery Monday at 8:45 Eastern, every draft campaign is checked without writing a pass, so problems surface before the send window opens

The gate blocks and acts. None of it is a reminder to be careful. It does not judge whether a campaign is a good idea, only whether it is safe to send.

Try the gate

Try the launch gate

Record a pass, then change one character of anything below and press Start. The pass no longer matches, so the start is refused. That is the whole mechanism.

No pass recorded. The start would be refused.

Use it yourself

Use the prompt to have an assistant design the same gate around your own sending tool.

  1. List the checks a campaign must pass and make each one fail loudly.
  2. Store a fingerprint of everything the checks read.
  3. Refuse the start command without a pass that matches the fingerprint.
  4. Watch the first minutes after a start, and pause on a bounce spike.
Design a launch gate for a cold email sending tool.
Requirements: a list of checks that must all pass; a stored pass with a hash of the copy, leads, inboxes and settings;
a rule that the start command is refused if there is no pass from the last 12 hours or the hash no longer matches;
a monitor for the first 15 minutes after start that pauses the campaign if the bounce rate reaches 7% on at least 20 sent;
an override that can only be set outside the session. Use exactly these numbers. Output the checks, the data stored, and the refusal message.

21 / All stages

About me

I'm Travis Heurtelou, founder of Breezy Growth Co. Before this I worked at Fidelity Investments, Microsoft, Western Union and Meta. We run cold email for B2B sellers, and I build and run each campaign myself: the sending setup, the lists, the copy and the replies. I built this page, its charts and the copy check with Claude Code, the same setup described in How the AI side runs.

More from me onYouTubeLinkedIn

30 / All stages

Free tools

Tools we use on our own campaigns, free, with no signup and no email address asked for. The first two run right here.

Domain and MX check

Reads a domain's public DNS: where its mail goes, and whether SPF, DKIM and DMARC are set. Nothing is stored.

CSV merge and dedupe

Merge up to 10 lead files and drop repeats by email or by company domain. The files stay in your browser.

Want this run for your market?

We work one market at a time. If yours does not fit, we will tell you before you spend a dollar.

Request a GTM Audit