Hiring signals to outbound list
Job posts in. A scored list with the hooks already written, out.
The expert's tell: read the whole hiring page, not the one posting that matched. A company advertising one salesperson alongside four engineers has an engineering department and solves its own problems. A company advertising one salesperson and nothing else is buying capacity because it has no other lever. Same trigger, two completely different prospects, and only the second one is in the market for operational help.
---
name: hiring-signals
title: Hiring signals to outbound list
description: |
Use this skill when building an outbound list from hiring activity - a new
territory, an empty pipeline, a signal-based campaign, or any ask like "who is
hiring right now", "find me companies to reach out to", "build a target list
from job postings". Produces a scored, verified list where every row carries
the hook already written.
category: Signals
tags: [Sales]
---
A company that just posted a go-to-market role has published its intent. This turns
that into a list you can send today.
## The play
1. **Fix the ICP shape before collecting.** Company size band, sector, and the roles
that count as a buying signal for what you sell. Collection without this returns
volume and no list.
2. **Collect from the sources your buyers actually post on.** National job boards,
sector boards, and company career pages. Read the public HTML. Run each source as
its own process and merge, so one slow source cannot hold the rest.
3. **Reject in three layers, cheapest first.** Mechanical, then shape, then scored.
Full rubric in `references/scoring-rubric.md`. Most of the work here is rejection,
and each layer exists so the expensive judgment runs on the smallest set.
4. **Verify every survivor against its source page.** Fetch the URL, confirm the
company name appears on it. Anything that resolves to a category page rather than
the posting gets resolved or dropped.
5. **Write the hook per row before the list ships.** One line naming the role posted
and what it implies about their quarter. A row whose hook cannot be written did
not belong on the list.
6. **Check the list against the CRM last.** Existing customers, open opportunities
and anyone in an active sequence come out before a human ever sees it.
## What good looks like
- **The expert's tell: read the whole hiring page, not the one posting that matched.**
A company advertising one salesperson alongside four engineers has an engineering
department and solves its own problems. A company advertising one salesperson and
nothing else is buying capacity because it has no other lever. Same trigger, two
completely different prospects, and only the second one is in the market for
operational help.
- **The mediocre version is a list of company names and job titles.** It gets handed
to a rep who now has to research each row before writing anything, which means the
list is doing none of the work. Rows arrive hook-first or they arrive useless.
- **Verification is the quality bar, not a nice-to-have.** Any list built with model
web access contains plausible fabrications. A hallucinated job posting in a first
line burns a real prospect permanently, and it burns them at exactly the moment you
claimed to have done your research.
- **Concretely good:** 40 to 60 rows surviving from a few hundred collected, every URL
resolving to a live posting under 30 days old, every row carrying a hook naming the
specific role, and a rejection count you can explain layer by layer.
- **A run that returns everything collected is a broken run.** If the gate rejected
almost nothing, the gate is not wired, and the list is about to cost more in reply
damage than it returns in meetings.
## Rules
- MUST verify every URL against the live page before the list ships.
- MUST write the hook into the row, not into a separate brief nobody opens.
- MUST check robots.txt per source and read public HTML only.
- NEVER call a board's internal API because it appeared in the network tab.
- NEVER treat a missing model verdict as a score of zero. A company the model omitted
is unjudged, not unfit. Track omissions, retry them, and report them separately.
- NEVER ship a row whose posting date cannot be established.
# Scoring rubric - the three-layer gate
Run the layers in order. Each one exists so the next, more expensive layer sees a
smaller set. Skipping straight to model judgment costs 10x and scores noise.
## Layer 1 - mechanical (free, removes the most)
| Test | Threshold | Why |
|---|---|---|
| Posting age | 30 days or less | Older than that and the role is filled or frozen. The signal has decayed. |
| Role type | GTM only: sales, marketing, revenue, growth, business development, customer success | An operations or finance hire is a different play with a different hook. |
| Poster identity | Not a staffing agency, not a job aggregator reposting | The agency is not the buyer and cannot be sold to. |
| Role seniority | Any, but record it | A first sales hire and a fifth SDR imply opposite maturity. |
### The inflection trap
Many languages inflect job titles by gender, and the inflected form does not contain
the base form as a substring. A plain substring match on the base title silently
dropped 57 real postings on one full run, every one of them filed as "not a GTM role"
and never surfaced for review.
Normalise titles to a base form before matching, and validate the filter against a
hand-checked sample of 30 postings before trusting a run. This class of bug is silent:
the run completes, the numbers look plausible, and the misses never appear anywhere.
## Layer 2 - shape (free, removes the anti-ICP)
Count every open role on the company's careers page, not just the one that matched.
```
tech_share = engineering roles / total open roles
```
| tech_share | Read | Action |
|---|---|---|
| Under 0.25 | No internal build capacity. Buys outcomes. | Keep, score normally |
| 0.25 to 0.50 | Mixed. Depends on what you sell. | Keep, flag for the human |
| Over 0.50 | Has an engineering department. Builds its own. | Drop unless you sell to engineering |
One posting tells you a role is open. The full page tells you what kind of company it
is, and that is the part that decides whether the outreach lands.
## Layer 3 - scored judgment (costs a model call, runs on survivors only)
Score each survivor 0 to 100 on four axes, weighted:
| Axis | Weight | What a high score means |
|---|---|---|
| ICP fit | 40 | Size, sector and structure match what you actually close |
| Signal strength | 25 | The role posted maps directly to the pain you solve |
| Reachability | 20 | A named decision maker is identifiable |
| Timing | 15 | Posted inside 14 days, or multiple related roles opened at once |
Ship at 60 and above. Between 45 and 60, hold for a human pass. Below 45, drop.
### The missing-verdict trap
When a model returns judgments for a batch, it will sometimes omit rows entirely.
Scoring an omitted row as 0 is indistinguishable from judging it unfit, and it fails
silently in the direction that looks like diligence. On one run this buried two of the
strongest companies in the batch, both of which would have scored above 75.
Reconcile the returned set against the submitted set on every batch. Retry the misses
once. Report anything still missing as unjudged, never as rejected.
