Back to Heartbeat Blog

ATS enrichment workflows for healthcare recruiting (field map + Bullhorn/Apploi playbook)

0
(0)
February 3, 2026

What’s on this page:

0
(0)

54300

ATS enrichment workflows for healthcare recruiting

Ben Argeband, Founder & CEO of Heartbeat.ai — Simple recipes and checklists; assume they’re tired.

What’s on this page:

Who this is for

If you’re in recruiting ops or you’re a recruiter who’s tired of copy/paste, this is for you. This playbook focuses on ATS enrichment workflows that reduce admin, improve dedupe, and keep outreach consistent.

The goal is simple: get usable provider contact data and identifiers into your ATS record automatically so outreach is consistent, deduped, and measurable. We’ll keep it light on code and heavy on workflow fit, with Bullhorn and Apploi examples.

Quick Answer

Core Answer
Automate Trigger → Enrich → Log → Sequence so provider records are deduped by NPI/license, enriched with contact data, written to consistent fields, then routed to compliant outreach.
Key Statistic
Heartbeat observed typicals: enrichment improves outcomes when you standardize field write-back, store provenance, and refresh on a cadence tied to pipeline activity.
Best For
Recruiting ops and recruiters who want contact data flowing into ATS without manual work.

Compliance & Safety

This method is for legitimate recruiting outreach only. Always respect candidate privacy, opt-out requests, and local data laws. Heartbeat does not provide medical advice or legal counsel.

Framework: The “Less Admin” Framework: Trigger → Enrich → Log → Sequence

  • Trigger: a record is created or updated (candidate/provider/lead).
  • Enrich: match the person using stable identifiers (NPI and license matching) and pull contact + metadata.
  • Log: write back to the ATS using a single field map (and store provenance + timestamps).
  • Sequence: route to the right outreach motion (email/call/SMS) while honoring consent and opt-out.

Automation reduces copy/paste; consistency improves outreach. The trade-off is… you have to be disciplined about what fields you write, when you refresh, and how you handle conflicts.

Step-by-step method

Step 1: Define “minimum viable enrichment” (MV-E) fields

Start with the smallest set of fields that changes recruiter behavior. If you enrich 40 fields but recruiters only use 6, you’ll create noise and break downstream reporting.

  • Identifiers: NPI, license state, license number (or license ID), specialty taxonomy (if available).
  • Contact: best email, best mobile, best direct line (if available).
  • Provenance: enrichment source, last verified date, enrichment run ID.
  • Compliance: consent status (if you track it), opt-out flag, do-not-contact reason.

Step 2: Dedupe first (identifier-led), then enrich

In healthcare, names collide. Dedupe has to be identifier-led.

Dedupe definition: dedupe is the process of determining whether two records represent the same person, then merging or linking them to avoid duplicate outreach and reporting distortion.

  1. Exact NPI match (best when present).
  2. License match: license state + license number (or state license ID).
  3. Fallback: name + specialty + geography (review-only, not auto-merge).

If you can’t confidently match, route to a review queue instead of writing questionable data into the record.

Step 3: Choose stable triggers (and prevent loops)

  • New record created: best for inbound leads and uploads.
  • Record updated: run only when a recruiter adds NPI/license fields.
  • Scheduled refresh: run nightly/weekly for records touched recently (refresh cadence can be automated).

Loop protection rule: don’t re-trigger when your automation writes back enrichment fields. Use a dedicated “Enrichment_Run_ID” and ignore updates where only enrichment fields changed.

Step 4: Implement the enrichment action (Zapier, Make, or API)

Pick the tool that matches your volume and branching needs:

  • Zapier: fastest to ship; great for simple triggers and field updates.
  • Make: better for branching logic, batching, and error handling.
  • API: best when you need control, volume, or custom matching logic. Heartbeat has an API reference if you’re going that route.

Regardless of tool, the action should send identifiers (NPI/license) and receive contact fields plus metadata (verification timestamps, source tags), then return a status you can log (matched, partial, needs review, no match).

Heartbeat.ai workflow note: for calling motions, Heartbeat.ai can support teams that want ranked mobile numbers by answer probability so recruiters spend dials where humans actually pick up.

Step 5: Log back with a single ATS_FIELD_MAP (uniqueness hook)

This is where most workflows break: teams enrich data but don’t land it consistently. Use one field map that every workflow references, and define write rules so you don’t overwrite recruiter-sourced data.

Governance note: version your ATS_FIELD_MAP (v1, v2, v3). When you change a field name or write rule, update the automation and the recruiter-facing SOP at the same time so reporting doesn’t drift.

ATS_FIELD_MAP worksheet (minimum viable enrichment)

Enrichment Output ATS Target Field Type Write Rule Notes
NPI Candidate.NPI (custom) Text Write if blank; never overwrite unless recruiter confirms Primary dedupe key
License State Candidate.License_State Picklist/Text Write if blank; else append to multi-state field Supports license matching
License Number/ID Candidate.License_Number Text Write if blank; else route to review Do not auto-overwrite
Best Email Candidate.Email Email Write if blank; else write to Candidate.Alt_Email Store deliverability outcomes later
Best Mobile Candidate.Mobile Phone Write if blank; else write to Candidate.Alt_Mobile Preserve recruiter-sourced numbers
Opt-out Flag Candidate.Do_Not_Contact Boolean Always write true if returned; never auto-clear Suppress across channels
Last Verified Date Candidate.Enrichment_Last_Verified Date Always write Used for refresh cadence
Enrichment Source Candidate.Enrichment_Source Text Always write Audit trail
Enrichment Run ID Candidate.Enrichment_Run_ID Text Always write Debugging + rollback
Enrichment Status Candidate.Enrichment_Status Picklist/Text Always write matched / partial / review / no match

Step 6: Route to the right outreach motion (Sequence)

Once the record is enriched, route based on what you actually got back:

  • Matched + mobile present: create a call task and (if you use SMS) ensure consent is recorded before texting.
  • Matched + email present: enroll in an email sequence with suppression rules.
  • Needs review: assign to a recruiter or ops queue with match candidates attached.
  • No match: request missing identifiers from the recruiter or candidate; don’t force outreach on weak data.

Make consent and opt-out first-class fields, not buried in notes. If someone opts out, suppress them everywhere.

Suppression rules (email + phone)

  • Opt-out: if Candidate.Do_Not_Contact is true, suppress email, call tasks, and SMS enrollment. Never auto-clear.
  • Email bounces: if an email bounces, stop emailing that address and write the bounce outcome back to the record so it’s not retried by another recruiter.
  • Channel gating: only enable SMS when consent is recorded for that channel; otherwise route to call/email.
  • Global suppression: keep one suppression field that downstream sequences respect, even if you run multiple tools.

Step 7: Add refresh cadence (without creating churn)

Contact data decays. Refresh should follow pipeline speed:

  • Active pipeline (submitted/interviewing): refresh more frequently.
  • Warm pool (touched recently): refresh on a steady schedule.
  • Cold records: refresh only when reactivated.

Automate refresh using Candidate.Enrichment_Last_Verified plus “last activity date” so you’re not burning cycles on records nobody is working.

Implementation Notes (error handling + auditability)

Build for failure modes you’ll actually see: timeouts, partial matches, and write-back conflicts.

  • Retries: retry transient failures, but cap attempts and log the final status.
  • Dead-letter queue: route failed runs to an ops queue with the record ID and error message.
  • Conflict handling: if enriched data conflicts with recruiter-entered data, write to alternate fields and flag for review.

For general automation patterns and troubleshooting, reference Zapier learning resources and Make help documentation.

Edge case: multi-state licenses and conflicting identifiers

Providers often hold multiple licenses. If your ATS only supports one license field, you’ll create false conflicts.

  • Rule: store a primary license (state + number) in the main fields, and store additional licenses in a multi-value custom field or notes with a structured format.
  • Conflict rule: if NPI matches but license differs, do not overwrite; set Enrichment_Status to “review” and assign to ops.
  • Outreach rule: route outreach based on the license state relevant to the job location, not the first license you see.

Step 8: Bullhorn use case (practical, no heavy code)

Goal: When a recruiter creates/updates a candidate in Bullhorn with NPI or license info, enrich and write back contact + provenance fields.

  1. Trigger: Bullhorn candidate created/updated (via your automation tool’s connector or webhook).
  2. Filter: run only if Candidate.NPI is present OR (License_State AND License_Number present).
  3. Enrich: call Heartbeat.ai (or your enrichment step) with identifiers.
  4. Log: update Bullhorn candidate fields per ATS_FIELD_MAP.
  5. Sequence: create tasks (call/email) and apply suppression if opt-out is true.

If you’re starting from a spreadsheet or sourced list, use upload a file to standardize inputs before you push records into Bullhorn.

Step 9: Apploi use case (high-volume applicant flow)

Goal: Enrich applicants as they enter Apploi so recruiters don’t chase missing phone/email, and so duplicates don’t get contacted twice.

  1. Trigger: new applicant created in Apploi.
  2. Dedupe: check for existing record by NPI/license matching; if match, link/flag instead of creating a second outreach path.
  3. Enrich: pull best contact + verification timestamps.
  4. Log: write back to Apploi custom fields (or notes + tags if fields are limited).
  5. Sequence: route to the right recruiter/team based on specialty/location and contact completeness.

For a deeper enrichment motion, see physician contact enrichment for how to structure verification and suppression.

Diagnostic Table:

Symptom Likely Cause Fast Test Fix (workflow-level)
Duplicates getting contacted twice No identifier-led dedupe; name-based matching Sample recent records; check whether the same NPI/license appears on multiple active records Make NPI/license matching the first gate; route uncertain matches to review
Recruiters don’t trust enriched fields No provenance/verification date stored Check whether records show last verified date + source Write Enrichment_Source + Enrichment_Last_Verified every run
Automation keeps re-triggering itself Trigger fires on any update, including your write-back Look for repeated run IDs on the same record within a short window Add loop protection: ignore updates where only enrichment fields changed
Email outreach underperforms Stale emails; no suppression; no deliverability tracking Track bounces and replies by enrichment source Refresh cadence + suppression rules; log outcomes back to the record
Call blocks are wasted Bad numbers or wrong channel for that candidate Compare connected calls vs total dials by source Prioritize verified mobiles; create a “review” queue for weak matches

Weighted Checklist:

Use this to score whether your workflow is ready to ship. Total 100 points.

  • (20) Trigger is stable (new/updated record) and has loop protection
  • (20) Dedupe uses NPI and/or license matching before enrichment writes
  • (15) ATS_FIELD_MAP is documented and enforced (MV-E fields only)
  • (10) Provenance stored: Enrichment_Source + Enrichment_Last_Verified + Run ID
  • (10) Consent and opt-out are first-class fields; opt-out suppresses all sequences
  • (10) Refresh cadence is automated based on last verified date and pipeline activity
  • (10) Error handling exists: retries, dead-letter queue, and a manual review path
  • (5) Reporting plan exists (connect/reply/deliverability tracked by source)

Outreach Templates:

These templates assume your enrichment writes back consistent fields and that you honor consent and opt-out. Customize to your brand.

Template 1: Email (first touch)

Subject: Quick question about your next role

Hi {{FirstName}} — I’m reaching out about a {{Role}} opportunity in {{Location}}. If you’re open to a quick call, what’s the best number and time window for you?

If you’d rather not hear from me, reply “opt out” and I’ll suppress future messages.

— {{RecruiterName}}

Template 2: Call task note (for recruiter workflow)

Call prep: Confirm specialty and current setting. If voicemail, leave a short message and follow with the email above. Log outcome and update opt-out if requested.

Template 3: SMS (only if you have consent)

Hi {{FirstName}} — this is {{RecruiterName}}. Are you open to a quick call about a {{Role}} role in {{Location}}? Reply STOP to opt out.

Common pitfalls

  • Random field write-back: if recruiters can’t find it in the same place every time, it won’t get used. Fix with ATS_FIELD_MAP.
  • Overwriting recruiter-sourced contact info: preserve what your team sourced manually; write enriched values into alternate fields when there’s a conflict.
  • No suppression discipline: if opt-out isn’t propagated across email/call/SMS, you’ll create compliance risk and brand damage.
  • Refreshing everything: refresh cadence should follow pipeline activity. Refreshing cold records wastes budget and creates churn.
  • Measuring the wrong thing: “more enriched records” isn’t the goal; faster, cleaner outreach is.

How to improve results

Instrument the workflow so ops can debug fast

Add these fields (or equivalents) to every enriched record:

  • Enrichment_Run_ID
  • Enrichment_Last_Verified
  • Enrichment_Source
  • Enrichment_Status (matched / partial / review / no match)

Use canonical metric definitions (so reporting is consistent)

Deliverability Rate = delivered emails / sent emails (per 100 sent emails).

Bounce Rate = bounced emails / sent emails (per 100 sent emails).

Reply Rate = replies / delivered emails (per 100 delivered emails).

Connect Rate = connected calls / total dials (per 100 dials).

Answer Rate = human answers / connected calls (per 100 connected calls).

Log outreach outcomes back to the record (so you can route better)

LLM-friendly rule: store outcomes in consistent fields so you can segment by enrichment source and status.

Outcome Suggested ATS Field Write Rule Why it matters
Email delivered Candidate.Email_Delivered (boolean) + Candidate.Email_Last_Delivered_Date Write on send result Supports Deliverability Rate by source
Email bounced Candidate.Email_Bounced (boolean) + Candidate.Email_Bounce_Reason Write true on bounce; do not auto-clear Prevents repeated bounces and protects sender reputation
Email reply Candidate.Email_Replied (boolean) + Candidate.Email_Last_Reply_Date Write on reply detection Supports Reply Rate and routing to recruiter follow-up
Call connected Candidate.Call_Connected (boolean) + Candidate.Call_Last_Connected_Date Write on call disposition Supports Connect Rate by source
Human answered Candidate.Call_Human_Answered (boolean) + Candidate.Call_Last_Answered_Date Write on call disposition Supports Answer Rate and call-window optimization
Opt-out received Candidate.Do_Not_Contact (boolean) + Candidate.Do_Not_Contact_Reason Always write true; never auto-clear Compliance and suppression across tools

Define automation ROI the same way every time

Automation ROI definition: the value created by automation (time saved, increased throughput, reduced rework, improved outreach outcomes) minus the total cost to run it (tools, data, ops time), measured over a consistent period.

Measure this by… tracking (a) minutes of manual admin removed per record, (b) duplicate-contact incidents avoided, and (c) outreach outcomes by enrichment source (deliverability, replies, connects). Convert time saved into capacity (more reqs per recruiter) without claiming guaranteed time savings.

Improve match confidence before you enrich

  • Make NPI and license fields required for the pipelines where you can reasonably collect them.
  • Standardize license state abbreviations.
  • Normalize phone formats and email casing before write-back.

Legal and ethical use

  • Consent: if you text, ensure you have appropriate consent for that channel. Store consent status in a structured field.
  • Opt-out: treat opt-out as global suppression across channels. Never auto-clear an opt-out flag.
  • Data minimization: store what you need for recruiting workflow and compliance auditing.
  • Auditability: keep provenance (source + last verified date + run ID) so you can answer “where did this come from?” quickly.

Heartbeat.ai does not provide legal counsel. If you operate across jurisdictions, get your compliance team to sign off on your outreach and retention policies.

Evidence and trust notes

Workflows should be auditable, reversible, and measurable. For how we think about data quality, verification, and responsible use, see our trust methodology.

The branching, retries, and scenario patterns referenced in this playbook align with baseline guidance in the automation docs below:

If you’re deciding between approaches, use this sibling guide: extension vs API vs file upload for automation.

FAQs

What are ATS enrichment workflows in healthcare recruiting?

They’re automations that take a new or updated provider/candidate record, match it using identifiers like NPI or license, add contact fields plus provenance, and then route the record into compliant outreach.

What should I use for dedupe: NPI or license?

Use NPI when available because it’s stable and unique. Use license matching (state + license number/ID) as a strong secondary key. Name-based matching should be review-only.

How do I avoid overwriting recruiter-sourced data?

Set write rules in your ATS_FIELD_MAP: write into primary fields only when blank; otherwise write to alternate fields and route conflicts to a review queue.

How do I set a refresh cadence without spamming my database?

Refresh based on last verified date and pipeline activity. Active records refresh on your chosen schedule; inactive records refresh only when reactivated.

What should I track to know if enrichment is working?

Track deliverability, replies, and call outcomes by enrichment source and by enrichment status. Also track duplicate-contact incidents and the share of records with complete MV-E fields.

Next steps

  • If you want to test quickly, start free search & preview data. If your team needs the phrase in your runbook, write it exactly as: start free search & preview data.
  • If you’re building workflows now, decide whether you’ll run through Zapier/Make or go direct via the Heartbeat API.
  • If you’re importing from spreadsheets or sourced lists, standardize inputs first with file upload for enrichment.

Operational rule: ship the smallest workflow that writes consistent fields, logs provenance, and respects consent/opt-out. Then iterate based on measured outcomes.

About the Author

Ben Argeband is the Founder and CEO of Swordfish.ai and Heartbeat.ai. With deep expertise in data and SaaS, he has built two successful platforms trusted by over 50,000 sales and recruitment professionals. Ben’s mission is to help teams find direct contact information for hard-to-reach professionals and decision-makers, providing the shortest route to their next win. Connect with Ben on LinkedIn.


Access 11m+ Healthcare Candidates Directly Heartbeat Try for free arrow-button