Use caseWorkflow automationKnowledge and search
Redeploying contractors and near-miss candidates before paying to source new ones
Watches assignment end dates and new job orders in Bullhorn, matches people you already know, and drafts outreach for recruiters to review and send.
A blueprint, not a client story. The business described is illustrative; the architecture, integrations and trade-offs are real, and this is how I would build it. By Ergini, .
The short version
A redeployment workflow for staffing agencies on Bullhorn, Vincere or JobAdder. It watches assignment end dates and new job orders, matches people already in the database on skills, availability, location, rate and past interview feedback, and drafts personal outreach by email or WhatsApp for the recruiter to send. Replies update availability and rates in the ATS. Contact limits, retention rules and opt-outs are enforced in code, and the recruiter decides who is contacted and who is put forward.
- Best for
- Contract and temp staffing agencies with tens of thousands of candidates in the ATS and recruiters who source from scratch for every order.
- Connects to
- Bullhorn, Vincere or JobAdder, Outlook, WhatsApp Business Platform, SMS gateway, Postgres with pgvector, Timesheet or VMS data (optional)
- The AI does
- Reads job orders and years of notes, explains in two lines why each past candidate fits, with evidence, and drafts outreach in the recruiter's voice.
- People do
- Recruiters choose who to contact, send or edit every message, get the candidate's consent to represent them, and decide who goes to the client.
- Built as
- AI Workflow Automation, usually $15K - $30K
Forty thousand candidates, and every search starts from zero
Picture an IT contracting agency placing cloud, data and SAP contractors with clients in the UK and the Netherlands. Bullhorn holds 40,000 candidates collected over twelve years, and 15 recruiters work from it. In a typical week, a couple of dozen contractors reach the end of an assignment and a similar number of new job orders come in.
The database is the agency's biggest asset and its least used. A recruiter with a new order for an Azure data engineer searches Bullhorn by keyword, gets 600 results, recognizes nobody, and moves to LinkedIn Recruiter and the job boards. Meanwhile a contractor the agency placed two years ago finishes an assignment on Friday and takes the next one through a competitor, because nobody called. The runner-up for a similar role in March, whom the client liked, is never thought of again.
This is not laziness. Keyword search does not know that 'ADF' means Azure Data Factory, that a rate was last updated in 2023, or that an interview note said 'strong, lost only on notice period'. Everything needed is already in the ATS, spread across fields, notes and old submissions. What is missing is something that reads all of it the moment an order arrives.
Tuesday morning, a new order, two ways
Today
- The recruiter searches Bullhorn by keyword, scrolls three pages and gives up
- InMails go out to strangers on LinkedIn Recruiter before lunch
- Contractors rolling off are remembered by whoever placed them, if that person still works there
- March's runner-up for a similar role, whom the client liked, is never considered
- Availability dates and rates in the ATS are years old, so nobody trusts them
With redeployment running
- A ranked list of known people, each with a two-line reason, is ready minutes after the order is saved
- Contractors rolling off hear from the agency weeks before their end date, once the account manager rules out an extension
- Near-misses from past shortlists come back with the feedback that made them near-misses
- Each reply updates availability and rate, with the date it was confirmed
- Paid sourcing starts only for what the database cannot cover
Job order 18422, from filters to a reply
One order followed through the tool calls. Every number here is the agency's own database at work, not a model's guess.
Bullhorn job order 18422, Azure data engineer, Tuesday 15 September 09:12
- The order: six months, remote with two days a month in Utrecht, day rate EUR 650-720, Azure Data Factory and Databricks required, Dutch not required.
- filter_candidates(order: 18422)40,112 records / 6,930 with Azure or data engineering history / 1,204 after rate, location and right-to-work rules / 212 removed by contact cooldown, opt-out or retention expiry / 992 remain
- similar_profiles(order: 18422, limit: 50)50 candidates, similarity 0.71-0.88 / 3 current contractors ending within 6 weeks / 7 past submissions to similar orders
- read_history(candidate: 55310)placed 2023-2024 by this agency, Databricks migration / submitted Mar 2026, 2nd of 3, note: "client liked him, lost on notice period" / dateAvailable last confirmed 14 Aug 2026 / dayRate EUR 690 (Mar 2026)
- fit_notes(candidate: 55310, order: 18422)must-haves met: ADF ("Built ADF pipelines for 40 source systems", CV p.1), Databricks (placement note, 2024) / risk: availability confirmed more than 30 days ago
Draft for the recruiter · Outlook draft
Hi Daniel, a role has come in that is close to the one you were in the running for in March: six months, Azure Data Factory and Databricks, mostly remote with two days a month in Utrecht. Are you free from mid-October, and is your day rate still around 690? If the timing works, I'd like to talk it through today or tomorrow.
- The recruiter changed 'today or tomorrow' to 'this week' and sent it from her own mailbox at 09:40.
Candidate · Outlook
Hi, yes, free from 19 October. Rate is 700 now. Happy to talk.
- update_candidate(candidate: 55310)dateAvailable: 19 Oct 2026 (confirmed 15 Sep) / dayRate: EUR 700 / note and activity logged / added to order 18422 shortlist as interested
- Still not a submission. The recruiter calls Daniel, then gets his written consent to represent him for this role before his CV goes to the client.
Two triggers, one list of people you already know
The flow starts from either side: a contractor about to be free, or an order that needs people. Hard filters are code, the similarity search is a database query, and the model reads the history and writes.
01 Trigger · ATS REST API
An assignment nears its end, or an order arrives
A daily query finds placements whose dateEnd falls in the next six weeks. New job orders come through Bullhorn's event subscription, or a short polling interval on Vincere and JobAdder.
02 Plain code
Apply the rules that are not negotiable
Right to work, location or remote eligibility, day rate against the order's range, the IR35 status a contractor accepts for UK roles, opt-out and do-not-contact flags, retention expiry and the agency-wide contact cooldown. Candidates who fail a rule never reach the model.
03 System · pgvector
Search by similarity
Embeddings of profiles and of the order narrow a thousand candidates to the closest fifty, so 'ADF' finds Azure Data Factory and Databricks experience counts for a Spark role. The embedding model is a real choice, covered in choosing an embedding model.
04 AI model · Structured output
Read the history and explain the fit
For each of the fifty, a model reads the CV, placements, submissions and interview notes, checks the order's must-haves, and writes two lines on why, quoting the note or CV line behind each claim. Remarks about health, family or personal circumstances are ignored, and Bullhorn's dateOfBirth, gender and maritalStatus fields are never part of the input.
05 Decision
What do we know about availability?
Availability is treated as perishable, and a contractor on assignment is approached only after their account manager says whether the client plans to extend.
- Confirmed in the last 30 days, or rolling off with no extension planned then top of the list, outreach drafted
- Still on assignment and the account manager has not answered about an extension then held until they do
- Unknown, or last confirmed more than 30 days ago then the draft asks about availability before describing the role
06 AI model
Draft the outreach
A short message in the recruiter's style: the role in a line, why this person came to mind, and one question. Past placements and client feedback are mentioned only when the candidate already knows about them.
07 Person
The recruiter picks, edits and sends
The recruiter sees the ranked list with its reasons, strikes anyone they know is wrong, and sends drafts from their own Outlook or the WhatsApp inbox. Nothing is sent without that click, and no CV goes to a client without the candidate's written consent to represent them for that role.
08 Result · ATS REST API, Microsoft Graph
Replies update the ATS
A reply is matched to the candidate; dateAvailable and the rate are updated with today's date, a note is logged, and interested candidates join the order's shortlist. Every contact is written back, so the next cooldown check sees it.
What a match is built from, and how long each signal stays true
| Signal | Where it lives | How it is used | Trusted for |
|---|---|---|---|
| Skills and experience | CV, candidate record, past placements | Similarity search and the model's fit notes | Until the CV changes; each new placement adds fresh evidence |
| Availability | dateAvailable, placement dateEnd, replies | Sorting; never assumed | 30 days from the last confirmation |
| Day rate | dayRate and dayRateLow, the last placement's pay rate | Filter against the order's range, with a margin the desk sets | 12 months, then shown as 'last known' |
| Location and remote preference | Candidate fields and replies | Filter | Until the candidate says otherwise |
| IR35 preference, UK roles | Candidate field, past placements inside or outside IR35 | Filter for UK orders | 12 months |
| Interview and client feedback | Submission and placement notes | Quoted in the fit notes when it is about the work | As long as it is job-relevant; personal remarks are excluded |
| Consent and retention | Privacy fields, last activity date | Excludes anyone past retention or without a basis for contact | Checked on every run |
Recruiter judgment, machine reading
The AI model
Reading notes and CVs to explain each match
Years of free-text notes are exactly what a model reads faster than a person.
Drafting outreach
Short and personal, in the recruiter's tone, built only from facts the workflow looked up.
Plain code
Finding placements that end soon, and new job orders
Date queries and event subscriptions, with nothing to interpret.
Hard filters: rate, location, right to work, IR35, contact rules
Rules that must treat every candidate the same way, every time.
Similarity search across the database
A vector query in Postgres, cheap to repeat and easy to inspect.
A person
Choosing who to contact
Recruiters know things the ATS does not, such as who is not ready to move.
Consent to represent, and submission to the client
A submission commits the agency to both the client and the candidate.
Merging duplicate records
Merges are hard to undo, and two people can share a name.
Data problems that sink redeployment
Availability that was true once
The 'available from' date is the least reliable field in most ATSs, because nobody updates it when plans change. The build treats availability as unknown after 30 days, asks before assuming, and writes each answer back with the date it was confirmed. Within a few months the database is more accurate, simply because it keeps being asked.
The same person three times
Twelve years of imports leave duplicates: a personal and a work email, a maiden name, a job-board profile. The matcher groups likely duplicates by email, phone and profile URL, so one person never gets two messages about the same role. Merging the records in Bullhorn stays a person's job; the workflow proposes merges and never performs them.
Fifteen recruiters, one popular contractor
Without a shared rule, a good contractor gets five messages in a week and stops answering all of them. Contact limits live in code and read the ATS activity history: one redeployment message per candidate every two weeks across the agency, and none while another recruiter has them in an active process.
Contacting people without a basis
Re-contacting candidates usually rests on legitimate interests, which needs a documented assessment and a privacy notice the candidate actually received. Records past the agency's retention period are excluded and queued for deletion. Opt-outs from any channel hold everywhere, and WhatsApp is used only where the candidate opted in, with approved templates for first contact.
A matcher that repeats past habits
Similarity search rewards profiles that look like past placements, which can mean past biases. Personal fields stay out of the matching input, and a monthly report compares who was surfaced, who was contacted and who was submitted. Matching people to jobs is recruitment AI under the EU AI Act, high-risk from 2 December 2027, so the controls in explainable candidate screening apply here too.
Amplify, Bullhorn Automation, or your own matching layer?
If you are on Bullhorn, look at Amplify and Bullhorn Automation before anything else. Amplify's agents cover matching from historical placement data, outreach and record enrichment, and Bullhorn says Amplify customers report 51% more submissions to jobs and 22% higher fill rates (its own figures). Bullhorn Automation, formerly Herefish, runs rule-based campaigns from ATS data, such as a message before an assignment ends. If your data lives in Bullhorn and your rules are simple, buying is the sensible choice.
A custom build wins when matching needs data Bullhorn does not hold: timesheets showing who actually worked the hours, client feedback in a VMS such as SAP Fieldglass or Beeline, or a second ATS from an acquisition. It also wins when the rules are specific: IR35 preferences, rate margins per desk, extension checks with account managers, and cooldowns shared across brands. On Vincere or JobAdder, the packaged options differ, so the comparison starts again.
When I build this, the ATS stays the system of record and the recruiter's inbox stays the place where work happens. The custom layer reads, matches and drafts, then writes notes and dates back. It works on the same principle as a CRM update agent: the record stays current because every conversation writes to it.
How you would know it is working
A blueprint has no results to report, so here is what I would measure from the first week instead, on your own data.
- Redeployment share
- Placements filled from people already in the database, against those found through paid sourcing, per desk each month.
- Rolling-off contractors contacted in time
- The share of contractors approached at least four weeks before their end date, after the extension check.
- Time to first submission
- Hours from a job order being saved to the first candidate submitted, compared with orders filled by sourcing.
- Reply rate and data refreshed
- Replies to redeployment messages, and how many availability dates and rates were updated as a result.
- Sourcing spend per placement
- Job board and LinkedIn Recruiter costs divided by placements, before and after.
What a build like this costs
This is built as AI Workflow Automation, which runs $3.5K - $60K overall. A build like this one usually lands in the multi-step workflow tier: $15K - $30K, 3-5 weeks. The first working version runs on your real data well before the end of that window.
What it costs to run
Embedding 40,000 profiles is a one-off cost of a few dollars at today's prices, and re-embedding changed records costs little. Reading histories and drafting messages costs cents per candidate considered. WhatsApp templates are billed per message by Meta; email through Microsoft Graph adds nothing.
What moves the price
- Where the matching data lives: Bullhorn alone, or also timesheets, a VMS or a second ATS
- Database hygiene: how many duplicates and dead records need handling before matching can be trusted
- Channels: email only, or WhatsApp and SMS with opt-ins, templates and opt-out handling
- Rules: IR35, rate margins per desk, extension checks and contact limits across brands
Who this is for
- IT and engineering contracting agencies with tens of thousands of candidates in Bullhorn, Vincere or JobAdder
- Temp agencies in Germany planning redeployments around the AÜG's 18-month limit at a single client
- Agencies whose recruiters source new people for every order while past placements go quiet
- Staffing groups running several brands or ATSs, where contact rules must hold across all of them
Questions people ask about this
How do I get more placements from my existing candidate database?
Make the database speak up when it matters: when a contractor's assignment is about to end, and when a new job order arrives. This workflow filters candidates on hard rules, finds the closest profiles by similarity, has a model read their history and explain each fit, and drafts outreach for the recruiter. Every reply refreshes availability and rates, so the database gets more accurate as it is used.
Can AI match candidates to jobs in Bullhorn?
Yes. Bullhorn's REST API exposes candidates, placements with end dates, job orders, submissions and notes, which is everything matching needs. Bullhorn's own Amplify also matches from historical placement data, so check it first. A custom matcher makes sense when you need rules of your own, such as IR35 preferences or extension checks with account managers, or data from outside Bullhorn.
Can we legally re-contact old candidates under GDPR?
Usually yes, with care. Agencies typically rely on legitimate interests, which needs a documented assessment and a privacy notice the candidate actually received. Records approaching the end of your retention period can be asked for fresh permission; records past it should be deleted, not messaged about a job. This workflow enforces those rules in code, and your DPO or lawyer decides what they are.
Does AI candidate matching count as high-risk under the EU AI Act?
Very likely, yes. Annex III covers AI used to filter applications and evaluate candidates, and ranking database candidates for a job order is a way of evaluating them. The obligations apply from 2 December 2027 after the Digital Omnibus. The controls are the same as for screening: people decide, criteria are documented, protected characteristics stay out of the input, and outcomes are monitored.
What does a candidate redeployment workflow cost?
Expect the middle tier of my workflow automation pricing for a first version, with a recruiter approving every message. The main drivers are where the matching data lives, how much duplicate cleanup the database needs, and whether WhatsApp and SMS are channels. Running costs stay small: embeddings are a one-off, and reading histories costs cents per candidate considered.
Sources