Most outbound advice obsesses over copy. New framework, new hook, new "pattern interrupt." But reply rates under 1% are almost never a writing problem. They're a timing problem. You're hitting people who have no reason to care this week.
Signal-based outbound flips the order. You wait for something to change in the prospect's world - a new role, a hiring spree, a funding round - and reach out while that change is fresh. The same message lands completely differently when it arrives the week someone actually has the problem.
Here's the full system, step by step, with the exact tools and setup at each stage.

1. Signal capture
What it does: tracks events that signal a buying window just opened.
The signals worth tracking for B2B sales teams:
New VP / Head of Sales or BDR in the last 90 days (new mandate, new budget, wants quick wins)
Companies hiring 2+ SDRs (scaling outbound is the exact pain you solve)
Recent funding round (budget unlocked, growth pressure)
New tooling installs (they just added an outreach or CRM tool, so they're actively fixing this)
Setup: one Clay table per signal type. Use Clay's job-change and hiring sources, plus Sales Navigator saved searches piped in for headcount growth and "posted in the last 30 days about [your topic]."
What most people get wrong: tracking everything. Pick 2–3 signals that map to your specific offer. A signal only matters if it means the prospect has the problem you solve right now.
2. Enrich
What it does: turns a name and a company into a complete, sendable record.
Setup: Clay waterfall enrichment. Run email-finding across multiple providers in sequence — find the work email, verify it, fall back to the next provider if the first misses. Pull company size, funding, tech stack, and LinkedIn URL while you're at it. Apollo as a backup source when Clay's primary providers miss.
Tip: verify before you send. A waterfall that ends in verification keeps your bounce rate under 2–3%, which is what protects deliverability over the long run.
3. AI qualify
What it does: drops everyone who doesn't fit before they ever enter a sequence.
Setup: a Claude column in Clay. Feed it the enriched data plus the signal. Prompt it to score fit against your ICP (company size, industry, whether the signal is actually real) and return a clean yes/no with a one-line reason.
Why it matters: this is where you stop burning sends on bad-fit leads. Volume is not the goal. A 200-lead list of perfect-fit, freshly-triggered prospects beats a 2,000-lead spray every time.
Tip: have the AI also extract the specific detail it would personalize on, so step 5 has something concrete to work with.
4. CRM check
What it does: dedupes against your CRM so you don't email existing clients or recently closed-lost deals.
Setup: Clay's HubSpot integration. Look up each lead and exclude anyone who's already a contact in an open deal, a current client, or closed-lost in the last 6 months.
Why it matters: nothing kills trust faster than your "cold" outbound hitting a current customer or a deal your AE is already working. Boring step, non-negotiable.
5. Personalize
What it does: writes one personalized line per lead, tied to the signal.
Setup: another Claude column. Feed it the signal plus the detail from step 3. Prompt it to write ONE opening line that references the actual trigger, in plain language. Not "I loved your post." Something like referencing their new role and the typical first-90-days priority that comes with it.
The rule that matters: generate the variable, not the whole email. Claude writes the dynamic line. Your template stays fixed. That's what keeps deliverability clean and lets you A/B the frame around it. Output lands in a column, e.g. icebreaker.
6. Send
What it does: runs LinkedIn and email as one sequenced motion, not two random channels.
Setup: Clay pushes the row to lemlist (email) and HeyReach (LinkedIn) with icebreaker mapped to a custom variable. Your sequence template merges it at send time: Hey {{firstName}}, {{icebreaker}}...
Sequencing: lead with a LinkedIn connect or profile view, then email, then a LinkedIn follow-up. One prospect, one view, two channels.
Deliverability basics: warmed domains, sending caps in the dozens per inbox per day (not hundreds), and a separate sending domain from your main one.
7. Route reply
What it does: catches every reply fast and turns it into a meeting.
Setup: a reply triggers a Slack notification with the contact, company, the signal that triggered them, and the reply text. You (or the rep) respond within the hour. Book via a Cal or Google Calendar link.
Why speed matters: reply speed is the single biggest lever on reply-to-meeting conversion. A reply that sits for 8 hours goes cold.
8. Attribute
What it does: ties every reply and meeting back to the signal that produced it.
Setup: log everything in HubSpot with the source signal as a field. After 30 days you can see which signal converts best, double down on it, and cut the dead ones.
This is the compounding part. Most teams never close the loop, so they keep guessing. The teams that attribute by signal get sharper every month.
Start here this week (the lean version)
You don't need all 8 steps to start. Run a stripped version first:
One signal — a new Head of Sales in your ICP is the easiest to start with
A Clay table plus waterfall enrichment
One Claude column for the icebreaker
lemlist, one sequence
Run 50 leads. Measure the reply rate. Then add channels and signals from there.
This is the system we run for B2B sales teams at GoToMoon. If you're setting this up and want a second pair of eyes on your signal choice or your Clay setup, reply to this or DM me on LinkedIn. Happy to look at where your reply rate is stuck.
— Borna, GoToMoon
