Back to Heartbeat Blog

Upload a Physician List for Enrichment (Clean Matching + Fewer Support Tickets)

0
(0)
August 31, 2026
0
(0)

Last updated: August 31, 2026

54312

By Ben Argeband, Founder & CEO of Heartbeat.ai — a practical walkthrough for recruiters, not a compliance manual.

Who this is for

This is written for recruiters working from spreadsheets who want enrichment to go smoothly the first time. If your team keeps losing hours to bad matches, duplicate rows, or re-uploading the same file with different headers, this is meant to fix that.

  • Primary user: Recruiters working from CSV exports (ATS/CRM, conference lists, referrals).
  • Outcome: cleaner matching, fewer duplicates, and a file your team can reuse on the next refresh.
  • What this avoids: wrong-person outreach, broken phone/email fields, and confusion about why a row matched the way it did.

Quick answer

Core answer
Prepare a CSV with a stable identifier (NPI first), dedupe to one row per physician, map columns cleanly, upload, then check match strength and recency before you contact anyone.
Key insight
Unique keys prevent wrong-person matches. Clean columns prevent mapping errors. A refresh date keeps your team from working stale contact data without realizing it.
Best for
Recruiters with spreadsheets who want enrichment without formatting headaches.

Compliance & safety

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

The upload prep checklist: clean, dedupe, identify, upload

  1. Clean: make the file structurally predictable — headers, one row per physician, no merged cells.
  2. Dedupe: remove duplicates using stable keys, NPI first.
  3. Identify: make sure each row has at least one strong identifier, plus context fields that reduce collisions.
  4. Upload: map fields, validate a sample, run enrichment, then review outputs — including recency — before outreach.

Step-by-step method

Step 1: Start with a “one row = one physician” CSV

Before enrichment, make the file predictable so matching and mapping behave the way you expect.

  • Export to CSV and avoid merged cells or hidden formatting.
  • Use one header row with no blank header names.
  • Keep one physician per row — don’t mix organizations and individuals.
  • Store multi-location details in a separate file rather than crowding the main sheet.

Common mistake: mixing practice entities and physicians in the same upload. Split them, since identity keys and matching logic differ between the two.

Step 2: Use stable identifiers — why NPI beats name

Names collide constantly in provider data, and even “first name plus last name plus city” isn’t reliable at scale.

  • NPI (best): a national identifier built specifically for provider identity resolution.
  • License number plus state (helpful): supports matching when NPI is missing, though formats vary by board and state.
  • Email or phone (context, not identity): useful for outreach, but not a dependable identity key on its own.

A match key is the field, or combination of fields, used to decide whether a row corresponds to a specific real-world physician. Strong match keys stay stable over time and are unique per person, like NPI. Weak match keys drift or collide, like name-only fields.

Step 3: Dedupe before upload

Duplicates inflate outreach volume, distort your metrics, and create awkward moments when the same physician gets two messages. Dedupe in this order:

  1. Exact NPI match: keep the most complete row.
  2. License number plus license state: keep the most complete row.
  3. Name plus specialty plus city/state: use only as a last resort, and flag these rows for review.

Step 4: Required columns — minimum vs. recommended

The minimum set supports clean matching when NPI is present. The recommended set cuts review time and keeps your team aligned on recency and suppression.

Minimum (for clean matching) Recommended (for workflow + auditing)
npi license_number, license_state
first_name, last_name credential, specialty
primary_state primary_city, organization_name
work_email, personal_email, phone
source, source_date, notes, refresh_date

Step 5: Standard header pattern and mapping tips

Consistent columns prevent bad mapping and cut support tickets. Use one header pattern across every recruiter’s export so uploads behave the same way each time.

npi,first_name,last_name,credential,specialty,primary_city,primary_state,license_number,license_state,organization_name,work_email,personal_email,phone,source,source_date,notes,refresh_date

  • npi: numeric, no dashes or spaces.
  • license_number and license_state: keep as text, since some boards use letters or leading zeros.
  • phone: keep as text to preserve “+1” and avoid scientific notation.
  • Don’t stack multiple emails or phones in one cell — put the best one in the main column and the rest in notes.
  • Use consistent state abbreviations, such as “TX” rather than “Texas.”

Step 6: Handling multiple practice locations

  • Keep identity stable: use the same NPI for a physician across all rows and files.
  • Pick a primary location: store one primary_city/primary_state pair in the main file so matching stays consistent.
  • Store extras separately: keep additional locations in a separate file or structured notes field, then attach them once identity is confirmed.

Step 7: Upload and map fields

When you upload file into Heartbeat.ai, your job is to confirm the system read the file the way you intended: correct row count, correct column mapping, clean identifiers.

Step 7A: Pre-flight validation (about two minutes)

  • Row count check: confirm the system reads the same number of rows you expect.
  • Header check: confirm NPI, license_number, and license_state mapped correctly and weren’t swapped with name fields.
  • NPI format check: spot-check a few NPIs for stray spaces or non-numeric characters.
  • Phone-as-text check: confirm phone values kept their “+1” and didn’t convert to scientific notation.
  • Delimiter and encoding check: confirm the delimiter is a comma and the file is UTF-8 encoded.
  • Five-row spot check: pick five physicians you recognize and verify the matched identity looks right before proceeding.

Step 8: Run enrichment and review outputs

After enrichment, expect outputs you can act on operationally:

  • Enriched contact fields where available, plus indicators you can use to prioritize.
  • Ranking and prioritization so your team can work records more likely to connect first, including ranked mobile numbers by answer probability.
  • Unmatched or needs-review rows when identifiers are weak or conflicting. Treat these as a separate queue before outreach.
  • Recency tracking through your refresh_date field, or your internal process, so you work the newest data first.

Recency is how recently a contact field — email or phone — was observed, verified, or refreshed. Operationally, it’s the closest signal you have to whether a record is still reachable today.

There’s a real trade-off here: letting weak identifiers match automatically moves faster today, but you’ll spend that time back later fixing wrong-person outreach and cleaning your CRM.

Diagnostic table

Symptom Likely cause Fast fix Prevention
High “needs review” or unmatched share Missing NPI; license fields combined or inconsistent Add NPI where possible; split license into license_number + license_state Make NPI a required intake field for future lists
Wrong-person matches Matching on name-only or name+city Re-run with NPI as primary match key; quarantine weak-identifier rows Collect NPI at intake; avoid free-text “provider id” columns
Phone numbers look corrupted Spreadsheet auto-formatting (scientific notation, dropped +1) Re-export phone as text; remove formatting characters Store phone columns as text in your source system
Duplicate physicians after enrichment Duplicates in source list (same NPI multiple times) Dedupe by NPI before upload; keep most complete row Run a dedupe step in every refresh cycle
Outreach performance drops after a few weeks Stale contact fields; no refresh discipline Stamp refresh_date and re-enrich on a schedule Work newest refresh_date first; suppress hard bounces and opt-outs
Upload mapping confusion Headers inconsistent; multiple values in one cell Normalize headers; split multi-value cells Use one standard header pattern across the team

Weighted checklist

Use this to decide whether your file is ready to upload today. Score each item; if you land under 80, fix the file first.

  • (30 pts) NPI present for most rows, or a clear plan to add it. Without this, you’re relying on weak identifiers.
  • (15 pts) One row per physician, with no organizations mixed in.
  • (15 pts) Dedupe completed, NPI exact match first. Document your dedupe rule in notes.
  • (10 pts) License fields split into license_number and license_state to support matching when NPI is missing.
  • (10 pts) Phone and email columns contain only one value per cell, with extras moved to notes.
  • (10 pts) source and source_date populated, even approximately.
  • (10 pts) refresh_date populated, or a post-enrichment step in place to stamp it.

Mapping tab tip: create a dedicated “mapping” tab in your spreadsheet with two columns — your_header and target_header — using the standard header pattern above. Require recruiters to update it before exporting. It prevents header drift across teams and cuts remapping errors on every upload.

Outreach templates

These are built for legitimate recruiting outreach with clear opt-out handling. Customize specialty and location, and keep the message short.

Template 1: First email (work email)

Subject: Quick question about your next role

Hi Dr. {{LastName}},

I’m reaching out about a physician opportunity in {{State}}. Are you open to a brief call this week, or should I stop contacting you?

If you prefer not to receive messages, reply “opt out” and I’ll suppress your info.

— {{YourName}}, {{Title}} | Heartbeat.ai

Template 2: Text (mobile)

Hi Dr. {{LastName}} — {{YourName}} here (physician recruiting). Are you open to hearing about a {{Specialty}} role in {{City/State}}? Reply STOP to opt out.

Template 3: Voicemail

Hi Dr. {{LastName}}, this is {{YourName}}. I’m calling about a {{Specialty}} opportunity in {{State}}. If you’re open to a quick conversation, call me at {{CallbackNumber}}. If not, tell me and I’ll take you off my list.

Common pitfalls

Pitfall 1: Treating “name” as an identifier

If your list is mostly first name, last name, and city, you’re setting yourself up for wrong matches. Add NPI wherever possible and use license_number plus license_state as a backup identifier.

Pitfall 2: Uploading duplicates and blaming enrichment

Duplicates usually come from source exports — ATS, CRM, event lists. Dedupe before upload, then keep a “dedupe rule” note in the file so the next recruiter doesn’t reintroduce duplicates.

Pitfall 3: No refresh discipline

Without recency tracking, you’ll work stale records and conclude “the data is bad” when the real issue is age. Stamp refresh_date and work newest first.

Pitfall 4: Opt-outs buried in notes

Opt-out needs to be a first-class field in your workflow. If a physician opts out, suppress them across future uploads and campaigns rather than burying the request in free-text notes.

How to improve results

Once your upload is clean, improvement comes from measuring reachability, segmenting by match strength, and closing the loop with suppression and refresh.

1. Track reachability metrics by list source and refresh_date

Track these rates per campaign and per list source — ATS export, referral list, conference list — and keep the denominator 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).

2. Segment by match strength before outreach

  • Tier A: matched on NPI.
  • Tier B: matched on license_number plus license_state.
  • Tier C: matched on name or location only — review queue before outreach.

This keeps the workload realistic: your fastest recruiters work Tier A first, while Tier C gets reviewed so you don’t burn reputation or annoy the wrong physician.

3. Operationalize suppression with a simple SOP

  1. Capture: store opt-out and wrong-person reports in a dedicated field, not notes, in your CRM/ATS.
  2. Apply: apply suppression before every upload and every outreach send.
  3. Audit: spot-check a small sample of suppressed records to confirm they’re excluded from outreach.

Use NPI as the primary suppression key when available. If NPI is missing, suppress by the channel used — email address or phone number — so the same person doesn’t get re-contacted on the next upload.

4. Refresh on a cadence tied to active recruiting

Don’t treat enrichment as a one-time event. Stamp refresh_date and re-enrich on a schedule that matches your outreach volume, working the newest refresh_date first.

Legal and ethical use

  • Consent: use outreach channels consistent with your organization’s policies and applicable laws.
  • Opt-out: if someone asks you to stop, stop, and apply that request to future uploads.
  • Data minimization: don’t collect sensitive personal data you don’t need for recruiting.
  • Auditability: keep source and source_date so you can explain where a record came from.

If you’re unsure about local requirements, involve counsel. Heartbeat.ai does not provide legal advice.

Evidence and trust notes

NPI is treated as the strongest identifier here because it’s part of the national provider identification system built for that purpose. Match outcomes depend heavily on identifier quality — NPI or board license beats name-only every time. For how we evaluate sources, matching, and data handling, see our trust methodology.

FAQs

What columns do I need to upload a physician list for enrichment?

Use NPI whenever possible, plus name and location context. At minimum: npi (preferred), first_name, last_name, primary_state. Add license_number and license_state when NPI is missing, and include source_date and refresh_date for auditing and freshness.

Why does NPI beat name for matching?

NPI is designed to identify providers uniquely across systems. Names collide and change, while NPI stays stable, which reduces wrong-person matches and cleanup work.

What should I do if my list doesn’t have NPI?

Add license_number and license_state if you have them, and include specialty and primary city/state to reduce collisions. Then prioritize collecting NPI going forward in your intake workflow.

What happens to rows that don’t match cleanly?

Treat them as a review queue. Weak identifiers — name-only, partial location, conflicting fields — increase collision risk, so review identity before outreach and improve match keys for the next refresh.

Why did my phone numbers lose “+1” or turn into scientific notation?

This usually happens when spreadsheets auto-format phone columns as numbers. Store phone as text, re-export to CSV, and re-check a few rows during pre-flight validation before running enrichment.

Should I include work email, personal email, or both?

Include what you have, but keep one value per cell and respect consent and opt-out. If a physician opts out on any channel, suppress them so they aren’t contacted again on future uploads.

Next steps

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