Using Hermes Agent to Keep a CRM Actually Filled In

An AI bot tying data to a CRM

Every CRM starts clean and dies slowly. A contact gets added from a form fill with just a name and email. A lead comes in from an event with a company name and nothing else. Six months later you’re staring at a pipeline full of records that are too thin to segment, score, or route properly — and nobody on the team has time to manually research and backfill hundreds of contacts.

This is the other half of the lead automation I’ve been running with Hermes Agent. Where the daily lead search finds new candidates, this workflow runs quietly in the background and fixes the CRM records that already exist but are missing the fields sales and marketing actually need — job title, company size, industry, LinkedIn URL, tech stack, that kind of thing.

The actual problem with CRM enrichment

Most enrichment tools are fine at the mechanics — hit an API, get firmographic data back, write it to a field. What they’re not good at is judgment calls: which of three “James Smith” LinkedIn profiles is the right one, whether a job title of “Head of Growth” should map to your CRM’s “Marketing” or “Ops” picklist, or what to do when two data sources disagree on company size.

That’s where an agent earns its keep over a plain enrichment API. Hermes can hold the ambiguity, apply a consistent tie-breaking rule, and — importantly — flag the ones it’s genuinely unsure about instead of confidently writing in a guess.

The workflow

I didn’t want to hand Hermes live read/write access into the CRM itself — at least not yet. So instead of connecting the agent directly to the CRM, the whole thing runs off a CSV in and a CSV out:

  1. Export — a scheduled CRM export drops a CSV of contacts into a watched folder (most CRMs can do this natively, or it’s a two-minute n8n job if not)
  2. Scan — Hermes reads the CSV and flags rows missing key fields (below a completeness threshold)
  3. Match — for each thin row, search for the correct person/company, resolving ambiguity carefully
  4. Enrich — pull the missing fields from multiple sources and reconcile conflicts
  5. Write out — produce a new CSV with the enriched fields filled in, plus a confidence column and a source column per field
  6. Escalate — anything under a confidence threshold gets left blank in the output CSV (or marked “needs review”) rather than filled in with a guess

A human then imports the output CSV back into the CRM — either as a bulk update or after a quick scan of the confidence column. It’s a manual step, but it’s a five-minute one, and it means nothing ever gets written into the live CRM without a person glancing at it first.

Step 1: Define “thin” and “done”

Before wiring up any tools, I had to actually define what counts as an incomplete record and what counts as enriched. Vague as this sounds, skipping it is where most enrichment automation goes wrong — the agent needs an explicit bar, not a vibe.

# skill: enrich-crm-record

## A record is "thin" if any of the following required fields are empty:
- Job title
- Company name
- Company size (employee band)
- Industry
- LinkedIn URL

## A record is "enriched" once all required fields are filled AND
each filled field has a source noted (not just a value).

## Confidence rules
- HIGH: matched via LinkedIn URL directly provided at signup, or an
  exact email-domain match to a known company
- MEDIUM: matched via name + company from a secondary source, no
  direct URL confirmation
- LOW: name-only match with multiple plausible candidates

Fill in the output CSV for HIGH and MEDIUM confidence, with the
source noted in an adjacent column. For LOW confidence matches,
leave the field blank and mark the row "needs review" — never
fill in a guess.

That confidence tiering is doing most of the real work here. It’s the difference between “the CRM got a bit better” and “the CRM got a bit better, plus 40 wrong job titles that someone now has to notice and unwind” — except now the check happens naturally, at the point someone reviews the CSV before importing it.

Step 2: Tools and connections

For my setup this meant connecting:

  • A local/watched folder for the CSV — Hermes reads the latest export on its schedule and writes its output alongside it. No live CRM connection at all.
  • Web search — for general company and person lookups
  • A firmographic enrichment source — company size, industry classification, tech stack signals
  • LinkedIn-style search — for resolving job titles and current employer, which change more often than most other fields

Keeping the CRM itself out of the loop entirely, at least for now, means the blast radius of a bad match is “one row in a CSV,” not “one write into a live record.” It’s a slightly clunkier workflow than a direct integration, but it’s a much easier one to trust while you’re still validating how accurate the matching is.

Step 3: The cron job

schedule: "every day at 6:00"
task: |
  Run the enrich-crm-record skill. Read the latest contacts export
  CSV from the watched folder. Flag rows marked thin (missing any
  required field). Process up to 50 rows this run. For each:
  resolve identity, gather missing fields, assign a confidence
  tier. Fill in HIGH and MEDIUM confidence results in the output
  CSV, with source noted per field. Leave LOW confidence fields
  blank and mark the row "needs review." Write the output CSV to
  the same folder. Send a summary email with the CSV attached,
  listing: rows enriched, rows marked needs review, and any rows
  where no plausible match was found at all.

Capping it at 50 rows a run rather than trying to clear the whole backlog in one go was a deliberate choice — it keeps each run fast, keeps the output CSV easy to skim, and means a bad match early in a run doesn’t compound across hundreds of rows before anyone notices.

Step 4: What lands in the inbox

Subject: CRM Enrichment Summary — Tue, 2 Jun
Attached: contacts_enriched_2026-06-02.csv

Enriched: 31 rows
Needs review: 6 rows (ambiguous match — see "needs review" column)
No match found: 2 rows (insufficient identifying info)

Flagged for attention:
- "J. Patel" (row 44) — 3 plausible LinkedIn matches, none clearly
  correct. Left blank rather than guessing — see needs review column.

Import the attached CSV into the CRM once you've scanned the
needs-review rows.

Same principle as the lead-gen brief: short, scannable, and honest about uncertainty rather than dressed up to look more complete than it is. The only extra step here is that someone actually opens the CSV and does the import — which, for now, is exactly the point.

What I’d flag before you build this

  • The CSV step is a feature, not a limitation. Getting something wrong in search just wastes a bit of the agent’s time. Getting something wrong in a live CRM record propagates into segmentation, scoring, and eventually someone’s outreach email addressing a “Director” who’s actually a “Coordinator.” Routing everything through a CSV that a person imports means there’s always a checkpoint before anything touches the real data.
  • Skim before you import. For the first few weeks especially, actually open the output CSV and spot-check a handful of enriched rows against LinkedIn before importing the whole batch. It’s a five-minute habit that catches systematic mistakes early.
  • Keep a source column, not just a value. If a field says “Company size: 200-500,” you want to know that came from a firmographic lookup last Tuesday, not a guess buried three tool calls deep. It makes auditing painful mistakes possible after the fact.
  • This is maintenance, not one-time cleanup. The value compounds because it runs daily on new thin rows as they come in, not because it clears a backlog once. Treat it as an ongoing process, not a project with an end date.

Where this fits with the lead-gen workflow

Together, the daily lead search and this enrichment sweep cover both ends of the same problem: new leads coming in already qualified and complete, and existing records that were never properly filled out getting steadily backfilled in the background. Neither replaces the actual sales conversation — they just mean the CRM sales works out of is trustworthy enough to act on without someone re-researching every contact by hand first.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top