---
ref: workflow:job-posting-lead-lists
title: Turn a hiring signal into a worked LinkedIn lead
author: shipgtm
tools: [tool:clay/search-people-and-companies, tool:clay/create-signal, tool:clay/run-routine, tool:salesforce/create-record, tool:heyreach/add-leads-to-campaign]
tags: [capability:enrich-contacts, capability:enroll-in-sequence, capability:find-prospects, capability:manage-crm, capability:track-intent, channel:linkedin, motion:outbound]
updated: 2026-09-29
---

# Turn a hiring signal into a worked LinkedIn lead

Shortlists your ICP in Clay, watches for a matching job posting, logs the lead in Salesforce, and queues a LinkedIn opener in HeyReach.

Set up the tools below, then run the steps in order for the user, carrying each step's results into the next. The run is done when the user has the outcome below.

## Outcome

- A shortlist of companies in Clay with a live watch for job postings matching the roles you're targeting.
- The buyer at each company that gets a hit, with their work email and LinkedIn profile.
- A Salesforce lead logged for each buyer, and an approved LinkedIn opener queued in HeyReach.

## Inputs

Ask the user for these before you start.

- `target_segment`: the kind of company to shortlist, e.g. Series A-B B2B SaaS in the US
- `job_titles`: the roles whose posting signals a need for your product, e.g. Head of Sales, SDR, Sales Ops
- `buyer_titles`: who to reach at each company once its posting hits, e.g. VP Sales, Head of Revenue Operations
- `max_companies`: the most companies to shortlist in one run, since each result costs credits, e.g. 100

## Set up

### Clay (tool:clay/search-people-and-companies, tool:clay/create-signal, tool:clay/run-routine)

For each call, use the first option your agent supports that lists it.

Notes:

- Search people and companies: Read the query reference first (`GET /search/query-mode/reference`), then page with `POST /search/query-mode/{search_id}/run` while `has_more` is true. Results per search and per 30 days are capped by plan.
- Create a signal: Custom and web intent signals can't be created here: they are set up in the Clay app. Run `clay signals create --help` for the supported types and each one's input shape.
- Run a routine: List routines first for the id and input schema; the managed Work Email routine needs a full name, company name and company domain. Poll `GET /routines/run/{routine_run_id}/results` until the run is complete.

#### CLI (official)

Install the command and sign in with it, then confirm it runs.

```sh
npm install --global @clay-run/cli
clay --version
```

- Search people and companies: run `clay searches query-mode create`
- Create a signal: run `clay signals create`
- Run a routine: run `clay routines runs start`

#### API (official)

- Base URL: https://api.clay.com/public/v0
- Search people and companies: `POST /search/query-mode`
- Run a routine: `POST /routines/{routine_id}/run`
- Auth: send the header `clay-api-key: $CLAY_PUBLIC_API_KEY`
- Get a key: https://app.clay.com/workspaces/~/settings/account?accountTab=api-keys-beta

### Create a record (Salesforce, tool:salesforce/create-record)

Use the first option your agent supports.

#### MCP (official, remote)

Add this server to your agent's MCP settings, then sign in when asked.

```json
{ "mcpServers": { "salesforce": { "url": "https://api.salesforce.com/platform/mcp/v1/platform/sobject-mutations" } } }
```

Call the MCP tool `createSobjectRecord`.

Note: An admin creates an External Client App and activates the server first. It never deletes records.

#### CLI (official)

Install the command and sign in with it, then confirm it runs.

```sh
npm install @salesforce/cli --global
sf --version
```

Run `sf data create record`.

Note: Sign in with `sf org login web`; `sf org display` then prints the instance URL and API version.

### Add leads to a campaign (HeyReach, tool:heyreach/add-leads-to-campaign)

Use the API.

- Base URL: https://api.heyreach.io
- Endpoint: `POST /api/public/campaign/AddLeadsToCampaignV2`
- Auth: send the header `X-API-KEY: $HEYREACH_API_KEY`

Note: Create the key in the HeyReach app under Settings, API keys. Every request counts toward one workspace limit of 300 requests per minute, and read endpoints use POST with a JSON body of filters.

Note: The campaign must exist and have LinkedIn sender accounts assigned before leads go in. Each lead needs a LinkedIn profile URL; the response counts added, updated and failed leads.

Before step 1, confirm access to each service with its cheapest read-only call, like a list or a search. Never send or change anything to test access.

## Steps

1. **Shortlist the ICP** with Search people and companies (Clay). Query Clay's company database for `target_segment`, up to `max_companies`. Keep each company's name and domain.
2. **Watch for a job posting** with Create a signal (Clay). Create a signal on the shortlist that fires on a job posting matching `job_titles`.
3. **Find the buyer** with Search people and companies (Clay). At each company whose signal fires, search people matching `buyer_titles`, most senior first. Keep their name, title and LinkedIn profile URL.
4. **Get their work email** with Run a routine (Clay). Run the Work Email routine with their name, company name and domain. Keep the email it returns.
5. **Write the opener** yourself. Draft one sentence that names the role the company is hiring for and the problem it hints at, with no pitch. Show the drafts to the user.
6. **Log the lead** with Create a record (Salesforce). Create a Lead for each buyer whose draft the user approved, with the job posting noted.
7. **Queue the LinkedIn message** with Add leads to a campaign (HeyReach). Add each approved buyer, by their LinkedIn profile URL, to a HeyReach campaign set up with the opener as its first-touch copy.

## Notes

Step 7 needs a HeyReach campaign already built with LinkedIn sender accounts assigned; point every approved lead at it rather than one campaign per run.

Steps 1 and 2 can run on [sumble/search-organizations](../companies/sumble/tools/search-organizations.md) and [sumble/search-jobs](../companies/sumble/tools/search-jobs.md), or on [coresignal/search-companies](../companies/coresignal/tools/search-companies.md) and [coresignal/search-jobs](../companies/coresignal/tools/search-jobs.md), instead of Clay — the guide names both as job-posting data sources with the same shape.

Adapted from ShipGTM's [signal-based lead list guide](https://shipgtm.substack.com/p/signal-based-lead-lists-job-postings), which builds this on Clay, Salesforce and LinkedIn, and names Sumble and CoreSignal as alternative data sources.

## Rules

- Use only the services set up above. The read-only calls they need, like listing ids or polling for results, are fine.
- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.
