# The hiring signal feed

> Job postings become a ranked daily call list, by testing the title against five rings and the company against the map.

- Canonical page: https://warmup.ai/library/hiring-signal-feed
- By Mike Hurley, founder of WarmUp. This runs our own pipeline. It is not a demo build.
- Version 1.3. Last updated 2026-09-24. About 7 minutes.
- Board: https://warmup.ai/library/hiring-signal-feed.webp
- Full build guide: https://warmupai.notion.site/The-hiring-signal-feed-3ecde1f21b8f8195b452f6954f746d91

**Job postings to qualified accounts in the CRM. Four runs a morning.**

How to read the board: Left to right, following the numbers on the column labels: the postings and the five rings, the feed, Stage 1 (is the title a signal?), Stage 2 (is the company one we want?), the verdict. The strip under the legend follows one posting through.

## Why it helps

A company that posts a job for a GTM engineer or a RevOps lead has already decided it needs one. That is the clearest buying signal I know of, and it is public. The feed turns each posting into a ranked account on the rep's daily list the same morning, with the posting itself as the reason to call. Most of the companies it finds are already on our map with a segment and a tier, so the rep opens the list and sees who to call first and why.

The other half is what it does not spend. The only paid step is a research call on a company nobody has looked at before, and it runs once per company. Every run counts against a day cap and a monthly total. If a run would go over, the routine stops, and the receipt says why.

## Why we built it this way

- **The rings read the title and nothing else.** Five lists of whole phrases, each with a weight. The description is read for four named cases only, so two people running the feed get the same answer, and changing a rule is a one-line edit.
- **Exclusions run before the rings.** Sales Manager, Head of Sales and Customer Success are never a signal, whatever else the title says. It is the cheapest check, so it goes first.
- **Twelve postings for one role are one signal.** One event per company, per ring, per day. The signals table is only ever added to, never edited, so a receipt from last month still reads true today.
- **A known company is a free read.** Only a company we have never seen pays for a qualify run, and its answer goes onto the map so the run never repeats.
- **An unknown is never a pass.** A conditional title with no marker in the description, or a posting with no date, waits for a person to look at it.
- **The broker holds the cap, so the workflow cannot ignore it.** A day cap and a monthly total. Over the cap the routine stops. It does not overspend and explain later.

## How to build it

1. **Write the rings down first.** One file: five title lists with a weight each (ours are 100, 85, 75, 60 and 40), the exclusion list, and the four description cases with the words that decide them. Every other step reads this file.
2. **Pick a posting source you can search by title.** We use a career-site job feed on Apify, run through Freckle, one run per ring with a date window. The source returns a fixed batch each run and mixes in old postings, so the date window does the filtering, not the limit you pass.
3. **Land every posting in a signals table you only add to.** Key it on company domain, ring and posting date. Refuse a second event for the same company and ring on the same day.
4. **Look the domain up on your map before you spend anything.** Known: read its segment, tier and status. Unknown: send it to a qualify workflow that reads the company's own site and fills a fixed set of fields, with a quoted sentence as evidence. Write the answer back to the map.
5. **Score how recent the signal is. Fit already lives on the account.** The timing score is the ring's weight, fading over 14 days, plus 10 for a funding round in the last 90 days. A signal moves an account up inside its tier and never changes the tier.
6. **Push a daily list to the CRM.** With the posting as the reason to call. Keep it short enough to work through in a morning.
7. **Run it as a scheduled routine in the cloud.** Through one broker that holds the keys and the caps. No cron on a laptop. Give it a day cap and a switch that turns it off.
8. **Give it a reader.** One ledger row per run (postings seen, events written, companies qualified, spend) and one short message in a channel someone reads every morning. If nobody reads it, it is not finished.

## Copy this: The rings file

The one file the feed reads for its rules. Ours, trimmed to a few titles per ring. The full lists are longer but the shape is this.

```yaml
# rings.yaml: the only rules the hiring feed reads
exclusions: [Sales Manager, Head of Sales, Customer Success]     # never a signal, any ring
rings:
  - {ring: 1, weight: 100, titles: [GTM Engineer, Go-to-Market Engineer, RevOps Engineer, Revenue Engineer, Sales Automation Engineer]}
  - {ring: 2, weight: 85,  titles: [Revenue Operations, RevOps, GTM Operations, Revenue Systems, Sales Systems, RevTech]}
  - {ring: 3, weight: 75,  titles: ["any ring-4 title whose description names Clay"]}
  - {ring: 4, weight: 60,  titles: [Marketing Operations, Sales Operations, MarTech, Marketing Automation]}
  - {ring: 5, weight: 40,  titles: [SDR, BDR, Account Executive, Inside Sales, Demand Generation, Growth Marketing]}
conditional:   # the only four cases where the description is read at all
  - {title: Growth Engineer,   counts_as: ring 1, only_when: a GTM marker, vetoed_by: a product-led marker}
  - {title: Business Systems,  counts_as: ring 2, only_when: the description names Salesforce or HubSpot}
  - {title: any ring-4 title,  counts_as: ring 3, only_when: the description names Clay}
  - {title: Sales Operations at a manufacturer or agency, counts_as: ring 4, only_when: a CRM marker, otherwise: the order desk, not a signal}
markers:
  gtm:         [Clay, HubSpot, Salesforce, outbound, lead routing, enrichment, CRM, sequencing]
  product_led: [A/B test, experimentation, activation, retention, product analytics]
  crm:         [CRM, HubSpot, Salesforce, pipeline, forecasting, automation]
timing: {decay_days: 14, funding_bonus: 10, funding_window_days: 90}
one_event_per: [company, ring, day]
```

## Words we use

- **Ring:** A list of job titles that count as the same signal, with a weight. Ring 1 is the strongest.
- **Signal:** Something a company or a person did that suggests now is a good time to talk: a job posting, a comment on a post, a form, a reply.
- **Fit and timing:** Two separate numbers. Fit is how well a company matches who we sell to, and it belongs to the account. Timing is how fresh the signal is, and it fades.
- **The map:** One table of companies, keyed on domain, with a status, a segment, a tier and a reason for each. Nothing is deleted from it. A status changes when a fact does.
- **Broker:** One small service that holds the API keys and the spending caps, so a routine cannot spend past them.
- **Cap:** A spending limit per day or per month. Over the cap, the routine stops and says so.
- **Receipt:** The written record of a run: what it checked, what it decided, what it spent.

## Talk to a person

Want the feed watching your titles by next month? WarmUp builds these systems for companies, or places a verified GTM engineer to run them: https://warmup.ai/gtm-systems and https://warmup.ai/hire. WarmUp publishes no pricing.
