← all playbooks

Load a finished shortlist into your ATS without creating duplicates

Your list loaded into your own ATS or CRM: people who already exist matched and left alone, the rest created, candidates linked to the job where your system supports it, and a log of every record with its id.

use when
you have a finished shortlist or prospect list as a file, and it needs to be in your ATS or CRM without doubling up people you already hold
starts from
A list

The prompt

Paste it into Claude Code or the Claude desktop app with Hyreflow connected. The first line tells your agent to use Hyreflow, so it reads the play, asks before it spends anything, and hands the work back to you.

paste this into Claude
Use hyreflow and load this list into my <CRM_NAME> without creating
duplicates: <FILE_OR_DATASET>.

These are <CANDIDATES_OR_CLIENT_CONTACTS>. If they are candidates, they
belong to this job: <JOB_NAME_OR_ID>.

First tell me how you would map my columns to the CRM fields, and which
columns have nowhere to go.

Then check every row against what is already in the CRM, by email and
LinkedIn URL. Show me the changes before you write anything to the CRM,
as three piles: will create, already exists, needs a look.
- Do not overwrite or merge anyone who already exists. If they are a
  candidate for this job, just link them to it.
- For client contacts, find or create the company first, then the person.

Create one record first and show it to me. Tell me what the full run
costs, if anything, before you do the rest, then pace it to the CRM's
limits.

Give me a log at the end: row, what happened, record id, and any failures
with the reason, so I can retry just those.

Replace every <PLACEHOLDER> with your own detail. Everything else can stay as written.

What you need first

  • A connected ATS or recruitment CRM, on a plan that includes API access
  • The list as a CSV or a Hyreflow dataset, with an email or a LinkedIn URL on most rows
  • For a shortlist, the job in your ATS that the candidates belong to

Tools it can reach for

The agent picks per step from what your workspace has. Nothing here is required by name.

What happens when you run it

Free steps are marked free. Anything that spends credits is marked, and the agent asks before the first paid run of any size.

  1. 1

    Read the file and map the columns

    free

    The agent looks at the shape of the file, a count and a few sample rows, and proposes which column lands in which CRM field. Account-specific things such as custom fields and pipeline stages are read from your CRM, never guessed.

  2. 2

    Check who already exists

    free

    Every row is checked against your CRM before anything is written: by email, and by LinkedIn URL or phone where your CRM can search on them. It is a read of your own system, so it is free, and rows with no usable identifier go to the pile that needs a look.

  3. 3

    Show the three piles

    free

    You see what will be created, who already exists with their record id, and which rows are unclear. Nothing has been written at this point, and you can move rows between piles.

  4. 4

    Create one record first

    free

    A single record is created and read back, so you can open it in your CRM and check that every field landed where you expected. The rest waits for your go-ahead.

  5. 5

    Create the rest, paced to your CRM

    free

    Most of these systems take one record per request, so the run is paced under your CRM's own request limit. A row that fails is collected with its reason and the run carries on.

  6. 6

    Link candidates to the job

    free

    Created candidates, and the ones who already existed, are attached to the job you named. This works in Recruit CRM, JobAdder, Loxo, Recruiterflow and Atlas, and where the connection has no job link the log says so.

  7. 7

    Hand back the log

    free

    One line per row: created, already existed, linked, or failed and why, each with the record id. The failed rows can be retried on their own without touching the ones that worked.

What a run costs

Nothing in this play spends credits.

Free before anything is charged

  • Read the file and map the columns
  • Check who already exists
  • Show the three piles
  • Create one record first
  • Create the rest, paced to your CRM
  • Link candidates to the job
  • Hand back the log

What moves the number

  • How many candidates survive the free filters. Everything dropped before the paid steps costs nothing.
  • Providers you connect with your own key. Those calls bill your account, not your credits.

An estimate, not a quote, priced at the volume credit rate. Your agent sizes the run against your own workspace and tells you what it will cost before it spends anything.

The last step is where good lists get lost

A shortlist that lives in a spreadsheet is not in your business. Nobody else on the team can see it, it is not attached to the job, and in three months it is a file called final-v2 on someone's laptop. The question recruiters ask most often after a search is some version of "how do I get this back into my ATS", and the honest manual answer is an afternoon of copying and pasting, or a CSV import that creates a second record for every person you already knew.

This play is that afternoon, done properly. It checks before it writes, it writes one record before it writes the rest, and it tells you exactly what it did.

What you get back

Your CRM, with the list in it. People who were not there are created with the fields you mapped. Candidates are attached to the job. And a log file: one line per row saying created, already existed, linked, or failed, with the record id and, for failures, the reason the CRM gave. People who already existed are untouched.

Variations worth knowing

Prospects, not candidates. For a business development list the company comes first. Existing companies are found and reused, missing ones are created, and each contact lands under the right account and not as an orphan.

Note where they came from. Where the connection can write notes, which covers JobAdder, Recruiterflow and Atlas, each created record can carry a line saying which search produced it.

Straight from another play. The file a search hands you is already in the right shape, whether it came from turning a job spec into a shortlist or from enriching a list you already had.

Where this goes wrong

Rows with no email and no LinkedIn URL. They cannot be checked against your CRM with any confidence. Creating them blind is how duplicates are made, so they go to the pile that needs a look.

Your CRM's own duplicate rule. JobAdder rejects a candidate whose email already exists, and Atlas refuses to create a person whose email, phone or LinkedIn URL matches someone it holds. Both come back as already exists, with the existing id. The agent does not force a duplicate through.

A field that reports success and saves nothing. JobAdder accepts a custom-field value in the wrong shape and answers as if it worked. The first record is read back for exactly this reason.

Loxo and the job link. Loxo needs an email, a name and a phone number to add someone to a job. A row without a phone is created as a person and reported as not linked.

API access is a plan feature. Recruit CRM opens its API on its higher plans only. On a lower plan every request is refused even with a valid key, and the fallback is the CRM's own CSV import.

Questions

Which ATS and CRM systems can it load into?

Recruit CRM, JobAdder, Loxo, Recruiterflow and Atlas can all have people created and candidates linked to a job. Bullhorn and Vincere can have candidates created, but the connection has no way to attach them to a job, and neither can be connected from the dashboard on your own, so speak to the Hyreflow team before you plan around them. Vincere takes candidates only, not client contacts.

What happens to people who are already in my database?

They are left exactly as they are. The connections have no merge and no delete, and this play does not update existing records. Someone who already exists is listed with their record id, and if the list is a shortlist they are linked to the job like everyone else. Changing fields on existing records is a separate job with its own review.

Does loading cost credits?

No. Reading from and writing to your own ATS or CRM runs on your account with that vendor and uses no Hyreflow credits. What cost credits was building the list in the first place. The agent still creates one record and waits, because the gate here is about what lands in your live system, not about spend.

Why is a long list slow?

Because your CRM limits how many requests it accepts, and most of these systems have no bulk endpoint, so every person is a request of their own. The run is paced to stay under that limit so it finishes, where an unpaced one would be rejected partway. Recruit CRM sets its limit by the number of licences on the account, so a larger team loads faster.

Can I undo a load?

Not from here. The connections cannot delete records, which is deliberate. The log lists every id that was created, so you can find and remove them in your CRM with its own tools. That is the reason for the three piles and the single record first: the cheap moment to catch a bad mapping is before the rest is written.