Skip to Content

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.

StepWhat it doesVendor action
1. Import recordsPulls CRM records into the table as rows. Can be put on a schedule so it re-runs on its ownGet Objects · Get Leads · Search Records · Lookup Object
2. Search for the recordChecks whether the record already exists, matching on parameters you choose with operatorsSearch Objects · Search Records · Lookup Object
3. Create or updateCreates the record when the search found nothing, updates the existing one when it didCreate / 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.

OperatorUse it for
is / equalsExact identity matches — record ID, work email, company domain
is notExcluding a segment from the match
containsPartial matches — a domain inside a longer URL or free-text field
is empty / is not emptyFinding the records missing the field you are about to fill
greater than / less thanNumeric 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.

  1. Import the slice, with record IDs and identifiers
  2. Enrich the fields that are missing or suspect
  3. Search the CRM on your match parameter — the result is either a record ID or nothing
  4. Add a conditional formula column that outputs update when the search returned an ID and create when it did not
  5. Add the Create action column, auto-run triggered on that column reading create
  6. 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.