Skip to main content
DoneThat

AI Adoption GuideHRSource

Personalized outreach sequence generator

LLM drafts cold messages tailored to each candidate profile and role context with multi-touch sequencing.

HR processPlanSourceSelectHireOnboardDevelopRewardExit

By Don, DoneThat’s AI coach · updated

A cited draft is the quality bar

A usable outreach sequence is a draft that quotes at least one licensed profile field and at least one requirement from the open req. If those sources are silent, the matching line stays blank. The model does not fill the gap. A sourcer or recruiting coordinator still reviews and sends. Nothing in this workflow auto-sends.

Personalized outreach fails when the first touch sounds specific and the specificity is invented: a talk the person never gave, a stack the resume never named, a location the ATS never stored. The failure is an uncited claim, not tone. A note that could go to any senior engineer is not personalized. A note that names a field you are not licensed to use is not usable.

Keep drafting downstream of search and scoring. A profile from multi-source semantic candidate search or ATS candidate rediscovery still needs a licensed field in the prompt. A result from structured resume scoring can tell you whether to write. It does not replace the cite.

Vendors in this class (LinkedIn Recruiter for many outbound channels, Greenhouse, Lever, or Ashby for req and candidate records) are systems of record. Load only fields your license and policy allow.

Bind one licensed profile to one req

Start with two objects in the same workspace: the candidate profile you are allowed to use, and the req you are hiring against. Do not draft from memory of either.

From the profile, take fields that are present and licensed: current title, current company, a skill or keyword the ATS already stores, a listed location, or a note a sourcer already wrote. If prior outbound exists, load the last message so the new sequence does not repeat it. If a field is empty, do not substitute a public-web guess.

From the req, take the job title, one must-have the req actually states, and the location or remote rule. Do not paste the full posting into the first touch. The first message needs one role fact.

Name both sources in the instruction. Ask for a three-touch draft. Every personalization sentence must quote a profile field in the attached record. Every role sentence must quote a req field in the attached req. If a needed field is missing, output a blank for that field and do not paraphrase around it.

Load both objects before the first token of the draft. Generate from the req first and you get an invented fit story. Generate from a LinkedIn Recruiter snippet without the req and you get an invented role hook.

Coordinators who batch still bind one profile to one req per generation. A merged prompt with five candidates produces blended cites. That looks sourced and is wrong.

Draft the touches, then fail closed on missing cites

Ask for a short sequence: a day-0 note, a follow-up that uses one unused cite if it exists, and a close that offers a clear out. Channel is whatever you already use, such as InMail in LinkedIn Recruiter or email logged against Greenhouse, Lever, or Ashby. The generator does not choose the channel and does not send.

Each touch needs one sentence that could only be true of this person and one sentence that could only be true of this req. After the draft returns, check both. If the personal sentence has no quote from the profile, reject it. If the role sentence has no quote from the req, reject it. A draft with no profile cite is a failed generation, not a starting point you lightly edit.

Empty stays empty. If the profile has no recent company, do not write around time on a high-growth team. If the req never mentions a domain, do not write around interest in that domain. Show a visible blank the sourcer can skip or fill later.

Keep cites short and checkable. Restate current title and company rather than a "deep infrastructure background."

Do not let the model write a conversion claim into the sequence or into your tracker. Quality here is cite-and-blank discipline, not a reply rate.

Touch two should not repeat touch one's cite. If no second licensed field exists, touch two is a short bump that quotes the same req fact and leaves personalization blank.

Example: three touches for a staff backend req

This is an illustration, not a result from a live search.

A sourcer is writing to Priya Chen for a Staff Backend Engineer req. Licensed profile fields that are present: current title Staff Backend Engineer, current company Northwind Health, skill keyword Kafka. Req fields that are present: title Staff Backend Engineer, must-have Kafka in production, location remote-US. Silent fields: public repos, talks, visa notes, compensation, notice period.

Touch 1 (day 0): Priya, I saw your current title is Staff Backend Engineer at Northwind Health. We are hiring a Staff Backend Engineer who must have run Kafka in production, remote-US. If that matches how you work today, I can share the req.

Touch 2 (day 3): Quick follow-up on the Staff Backend Engineer req (Kafka in production, remote-US). Happy to send the posting if useful. [blank: second profile field]

Touch 3 (day 7): Closing the loop on the Northwind Health / Staff Backend Engineer note. No need to reply if it is not a fit.

The model must not invent a talk on event streaming, claim Northwind is scaling a marketplace, add a funding round, or insert a line about how well this sequence gets replies. Kafka is in both records, so it can appear. A marketplace story is in neither, so it cannot.

If Kafka had been missing from the profile, touch 1 would drop the skill sentence and show [blank: skill keyword] instead of taking a stack from a page the sourcer is not licensed to use in this draft.

Send stays with the sourcer

After the draft passes the cite check, a human sends it from the system that already owns the relationship. For many first touches that is LinkedIn Recruiter. For email, the send is logged in Greenhouse, Lever, or Ashby. The generator's output is text in a review pane. ATS status stays unsent until someone hits send.

Treating the draft as sent is a process failure. It creates follow-ups on messages that never left, double-touches, and notes that say reached out when nothing shipped. Checklist: draft saved, cites checked, blanks left blank, then send. Logging the send is part of send, not part of generate.

Do not auto-send, including after small edits. A model that cited the wrong person on a common name, or pulled a stale title, will ship that error at scale if send is automatic.

Coordinators running a shared queue assign send to the sourcer who owns the req, not to a bot user.

If the candidate already applied through a conversational career site agent, do not run this cold sequence. Load that thread as prior context or skip outreach.

Keep conversion math out of the generator

Measure whether each shipped sequence had a profile cite, a req cite, and blanks where the record was silent. Measure whether send happened after review. That is the quality outcome.

Do not invent a conversion percent to justify the generator. Reply rate moves with list quality, role heat, subject lines, and calendar week. If you later want a funnel number, take it from your own ATS after a defined cohort. Do not print one into the prompt or a caption that implies the model caused it.

A draft with no profile cite is not a miss on conversion. Send it back. A draft that was never sent is unfinished work. Keep those errors separate so sourcers do not chase lift they cannot see.

When the profile and the req are both thin, the honest output is a short, mostly blank sequence or a decision not to write. Filling silence is the system failing.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first