CRM
CRM integrations are direct API connections to HubSpot, Salesforce, Pipedrive, Attio, and Close.
They exist so your CRM stops being the place where data goes stale. Records come into a table, get enriched and cleaned, and go back.
The fundamental flow
Every CRM integration runs the same three-step loop, whichever vendor you are on. The action names differ; the shape does not.
| Step | What it does | Vendor action |
|---|---|---|
| 1. Import records | Pulls CRM records into the table as rows. Can be put on a schedule so it re-runs on its own | Get Objects · Get Leads · Search Records · Lookup Object |
| 2. Search for the record | Checks whether the record already exists, matching on parameters you choose with operators | Search Objects · Search Records · Lookup Object |
| 3. Create or update | Creates the record when the search found nothing, updates the existing one when it did | Create / Update Object · Record · Lead · Person · Organization |
Step 2 is the whole reason this is a loop rather than two buttons. Without it, “push back to the CRM” means “create”, and creating a record you already have is worse than the empty field you were trying to fill.
1. Import records
The CRM is a lead source. Records land as rows exactly like a scraper or a CSV import, and every enrichment works on them from there.
- Import a slice, not the database. Filter to a segment you can name — open opportunities, records untouched in 12 months, contacts missing an email. A first pull of 200–500 records is enough to validate the loop and cheap enough to redo.
- Always bring the record ID. It is the write-back key. Rows without one cannot be updated, and matching back by name or email afterwards is how duplicates get made.
- Bring the identifiers you will enrich on — domain for accounts, email and LinkedIn URL for contacts — plus the specific fields you intend to fix. Leave human-written notes behind.
Schedule the import
Turn on Enable Auto Import on the import so it re-runs on a frequency instead of only when you click it. Each run reuses the saved filter and column mapping and appends what is new — so “contacts created this week” or “accounts that went stale” arrive on their own.
- Run it manually once and confirm the mapping before scheduling anything
- Match the frequency to how fast the segment actually changes; a daily pull on a slow segment mostly re-imports what you have
- Put dedupe in front of enrichment — every recurring pull re-returns records already in the table
- Pair it with Auto Run so newly imported records enrich themselves
Every schedule is listed under Manage scheduled imports, where you can pause, edit, run now, or delete it.
2. Search before you write
The search action asks the CRM whether this record is already there. You build the question from one or more parameters — the CRM field to match on — each with an operator.
| Operator | Use it for |
|---|---|
| is / equals | Exact identity matches — record ID, work email, company domain |
| is not | Excluding a segment from the match |
| contains | Partial matches — a domain inside a longer URL or free-text field |
| is empty / is not empty | Finding the records missing the field you are about to fill |
| greater than / less than | Numeric and date thresholds — revenue, headcount, last activity date |
Stack parameters to narrow: email is {{email}} on its own is a clean contact match, while domain is {{domain}} and type is not Customer is a prospecting match that will not touch an existing account.
- Match on something stable. A work email or a company domain. Never a person’s name or a job title — both change, and both collide.
- Search on the same field your CRM dedupes on, or you will pass its check and fail your own.
- The search returns the matching record’s ID. That ID is what step 3 writes to; an update without it either fails or lands on the wrong record.
3. Create if new, update if it exists
The search result is the switch. One column reads it and decides which of the two write actions should fire on that row.
- Import the slice, with record IDs and identifiers
- Enrich the fields that are missing or suspect
- Search the CRM on your match parameter — the result is either a record ID or nothing
- Add a conditional formula column that outputs
updatewhen the search returned an ID andcreatewhen it did not - Add the Create action column, auto-run triggered on that column reading
create - Add the Update action column, auto-run triggered on the same column reading
update, writing to the ID the search returned
Run both write columns on one row with the play button before you run either on the table. A bad create at volume is not undoable.
Do not overwrite good data with blanks. If an enrichment returned nothing for a row, that empty cell should not clear a field the CRM already has — gate the update on the enrichment column being populated, not just on the record existing.
- Keep the most complete record, not the newest. A record with a verified email and a mobile number beats a fresher one with neither.
- Never write back the owner field from a table unless reassigning is the explicit point of the run.
- Map your columns to CRM fields during setup so the output lands where your team already looks.
The most common use: refreshing stale records
People leave, companies rename, phone numbers change. A CRM built two years ago is mostly wrong today, and stale records are the reason most CRM enrichment runs get started.
Run the loop on one named segment, confirm the diff looks right, then widen it — and only then put the import on a schedule so the refresh keeps running without anyone remembering to.
Setup
The six generic steps for adding any integration are on the Integrations page.
Authentication and field mapping differ per CRM. Each integration’s own page has the action list for that vendor: Attio, Close, HubSpot, Pipedrive, Salesforce.
Related
- CRM enrichment course — the full loop, lesson by lesson
- Integrations — how to add one
- Manage scheduled imports — running the import step on a frequency
- Dedupe — keeping recurring imports from stacking duplicates
- Export Actions — other ways to push data out
- How enrichment works — waterfall providers and cost control