# How to source candidates in six steps with an open-source CompanyOS

> Sourcing candidates for one open role runs in six steps, and the pipeline check belongs second, before any search. Kortix is the open-source CompanyOS: your agents, their skills, your company memory, and every connector in one git repo you own, with the agents working on real cloud computers.

URL: https://candidatesourcingguide.com/how-to-source-candidates

`Daily candidate-sourcing sweep · 07:00`

```
Prompt: Load the outbound-sourcing skill and run one complete sourcing sweep for the open role.
Reviewed 31 LinkedIn profiles and dropped 13 that were already in the pipeline.
Drafted 18 personalized emails, each with the candidate's current role and the reason they matched.
All 18 are in the review inbox, and nothing was sent.
Illustrative example. Your counts depend on the role and the sourcing profile.
```

Source: https://kortix.com/use-cases/candidate-sourcing

Approval gates you set. Off until you set them.

[Try Kortix](https://kortix.com) · [Read the guide](https://candidatesourcingguide.com/)

Open source · Greenhouse, LinkedIn and Gmail as connectors · Drafts only, nothing sent

## Step 1: write the sourcing profile first

A sourcing profile is the short note the search runs on. It lists the job titles that actually do this work, the seniority band the role pays for, and the skills that separate a plausible match from a real one. One line at the end states the bar the hire has to clear. Write it before you open LinkedIn, because every step after this one reads that file.

Keep it to a page. Three titles you would shortlist, two skills a person cannot pick up in the first month, one line on what they have shipped. A profile copied straight from the job description pulls in people who match the words rather than the work.

On Kortix the profile sits in the repo as a skill, next to the outreach angles. A change to the bar then arrives as a diff somebody reviews. [Kortix](https://kortix.com/use-cases/candidate-sourcing) publishes the agent, the skill and the trigger the sweep runs on.

## Step 2: read the pipeline before you search

Open the ATS and pull what the role already holds: applicants, everyone contacted, everyone rejected or passed on in an earlier round. You want the names, not a count. Those names become the exclusion list for the search you are about to run.

Do the check first and part of the list is gone before you have spent a minute on outreach. Do it last and you learn the hard way. A candidate writes back to say your colleague already emailed them in March.

Most outbound sourcing runs this check at the end, as a sanity pass over a finished list. It is cheaper at the front, and it changes what the search hands back.

## Step 3: search where the right people already are

Most outbound sourcing starts on LinkedIn, because the current title, the tenure and the employer sit on the profile. Search the profile's titles one at a time, with a skill attached. Read the first two pages instead of stacking six filters until three people survive.

Some roles live somewhere else. Engineers leave commits in open-source projects, and the commits show what they actually write. A GitHub search against the role's skills reaches people LinkedIn will not surface. [The tools page](/candidate-sourcing-tools) covers what each source is good for.

The connectors do the fetching: Greenhouse read-only for the pipeline, LinkedIn for the search, the recruiter's inbox for the batch. Connect them once in the project. Connector credentials are brokered server-side and never enter the machine.

## Step 4: drop every match that is already in the pipeline

Apply the list from step 2 to everything the search returned. This is a hard filter and it runs before any writing. A matching profile that already sits in the pipeline belongs to a record someone else owns.

A worked example makes the size of the step concrete. A morning run reviewed 31 LinkedIn profiles, dropped 13 that were already in the pipeline, and drafted 18 emails. The label says it plainly: "Illustrative example. Your counts depend on the role and the sourcing profile." That order is why the drop runs before the drafts, so nobody already in the pipeline gets a second cold email from the same team.

The step looks like housekeeping. It decides whether the hour was worth spending. Get the order right and every later step works on a smaller, current list. What is left after the drop is short, and worth a personalized note.

## Step 5: draft from one or two real details in each candidate's background

Each email opens from something specific: the system they built at their last company, the talk they gave, the project they maintain. Two details are enough, and they have to be checkable. The candidate can tell when the sentence would survive a name swap.

The rule the agent works under is blunt. If a draft reads the same with the details removed, it gets rewritten. Twenty emails that all open with "I came across your profile" are a template with extra steps. Anyone who receives a few of those a week spots it in the first line.

A run drafts at most 20 candidates. The batch fits one sitting rather than a queue nobody clears.

## Step 6: review, send, and decide what enters the ATS

The agent stops at the review inbox. It has no send action and no write access to Greenhouse. Every draft waits for a person to read, edit and send. The decision to add someone to the pipeline stays with the recruiter. That boundary lives in the skill file, versioned next to the profile and the trigger.

Send from your own inbox, rewrite the line that drifted, and log the candidate in the ATS yourself. The agent never adds anyone, which keeps the pipeline you read at step 2 accurate for tomorrow's run. The search and the first draft are its work; the profile, the review and the ATS stay with you. [Candidate sourcing vs recruiting](/candidate-sourcing-vs-recruiting) draws the line between the two jobs if the words still blur.

## Turning the sweep into a daily job

One sweep answers one open role. Once the order holds for a single role, a trigger repeats it for every role you have open. Each role gets its own run, its own batch and its own memory of who was contacted.

A trigger starts a session on a schedule or from a signed webhook. Exactly two types: `cron` and `webhook`. The example runs the candidate-sourcing agent at 07:00 UTC every day. Each run opens a fresh session scoped to one role.

That leaves the agent, the skill holding the profile and the draft rules, and the trigger. Three files in the repo, plus a review inbox somebody reads. [AI candidate sourcing](/ai-candidate-sourcing) covers what changes when the agent runs the first pass across several roles at once.

## Checking a week later whether it worked

Four numbers answer the question. Replies to the drafts, duplicate reach-outs, drafts you rewrote before sending, and days from role open to the first reviewed batch. All four come out of the run's own output and your sent folder. Nobody has to build a report.

When replies arrive, tell the agent which angle landed. It adds that to the outreach notes in memory, so the next batch starts from what worked. If you rewrote most of the batch, fix the profile. Step 1 is where the next run gets shorter.

## The prompt, the trigger, and the batch it produces

One prompt runs a sweep; one block repeats it every day; the drafts land in the recruiter's inbox.

### Session prompt

`session prompt`

```
Run one sourcing sweep for the open role.
1. Read the role's Greenhouse pipeline: applicants, contacted candidates, and anyone rejected or passed on.
2. Search LinkedIn for candidates who match the sourcing profile.
3. Drop everyone who is already in the pipeline.
4. Draft a personalized outreach email for up to 20 new candidates, each from real details in their background.
5. Place the batch in the recruiter review inbox. Do not send anything and do not write to Greenhouse.
```

Source: https://kortix.com/use-cases/candidate-sourcing

### kortix.yaml

`kortix.yaml`

```yaml
triggers:
  - slug: daily-sourcing-sweep
    name: Daily candidate-sourcing sweep
    on:
      cron: "0 0 7 * * *"
    run:
      agent: candidate-sourcing
      prompt: Load the outbound-sourcing skill and run one complete sourcing sweep for the open role.
```

Source: https://kortix.com/use-cases/candidate-sourcing

## Questions about sourcing candidates

### How to source candidates for free?

Yes. Run the six steps yourself with free tools and the cost is your time: the pipeline export, a LinkedIn search, the drafts and the sends. Kortix is free to start on your own keys; credits from $50 a month at 100 credits per dollar once you want managed models.

### What does "source candidates" mean?

Sourcing candidates means finding and contacting people who have not applied, for a role you are trying to fill. It covers the search, the check against everyone already in your pipeline, and the first outreach message. Recruiting covers what happens after that: screening, interviews and the offer.

### What are the best tools for sourcing candidates?

The field splits in two. Sourcing products such as Juicebox, hireEZ, Pin and Gem bundle a candidate database, sequences and ATS sync as a subscription. Kortix is open source: the search, the pipeline check and the drafts run as an agent you keep in your own repo, and the recruiter still sends.

## Run the six steps on your next open role

The search, the pipeline check and the drafts run as an agent in a repo you own, and the recruiter sends.

[Try Kortix](https://kortix.com) · [Read the sourcing guide](https://candidatesourcingguide.com/)
