Clay logo, go to homepage
Clay GTM guide

How to Sync Salesforce Data with Clay (Two-Way)

A one-way export is a photograph. A two-way sync is a pulse. Here is how to keep Salesforce continuously enriched and current with Clay, both directions, without ever exporting a CSV or spawning a duplicate.

May 26, 202610 min read

A one-way export is a photograph. A two-way sync is a pulse.

Pull your Salesforce data into a tool once and it is stale the moment the org changes; the value is in a sync that runs both directions on a schedule. Salesforce holds the records; Clay enriches, scores, and researches them; and the loop only works if data flows in fresh and flows back clean. Get the import cadence and the write actions right and Salesforce stays continuously enriched without anyone exporting a CSV. Get them wrong and you either work off month-old data or spawn duplicates on every write. This is how to set up a two-way Salesforce sync with Clay that keeps the system of record current and never duplicates a thing.

What you need before you start:

  • A Clay account and a Salesforce connection: Authenticated either as a Salesforce user via OAuth or through client credentials for a server-to-server setup.
  • Write access on the objects you intend to update: And ideally a sandbox connected as a Salesforce Test Env.
  • A short list of objects and fields in scope: A tight sync is a safe sync.

Step 1: Import Salesforce as a live source, not a one-time export

The first decision is what flows into Clay and how often it refreshes.

Connect Salesforce and import the objects you want to work — Leads, Contacts, Accounts, or Opportunities — as a live table source rather than a static upload. By default, Clay re-syncs Salesforce imports every 24 hours, so new records and updates in Salesforce flow into Clay on their own and trigger the action runs that re-enrich them. When you need a precise slice, a Salesforce SOQL source lets you query exactly the records you want (up to 50,000 per import) and can auto-update on a schedule too. Either way, every row carries its Salesforce Record ID, which is the key the write-back uses later.

Auto-plays the two-way sync loop. Click the import step or any node to hold it and read what happens there.

SalesforceClay

Import

New records and field changes in Salesforce flow into Clay every 24 hours and trigger the action runs that re-enrich them.

Default import cadence: every 24h

Auto-playing · click to hold

A two-way sync is a loop, not a transfer: Salesforce re-imports into Clay every 24 hours and enriched values write back, so the system of record stays current without manual exports.

Step 2: Enrich and score the records inside Clay

The middle of the loop is where Salesforce data becomes worth syncing back.

Once records are flowing in, Clay does the work Salesforce cannot: waterfall enrichment to fill and verify firmographics, contact data, and technographics; signal feeds to flag funding, hiring, and job changes; and Formula or Use AI columns to score and prioritize. Keep the original Salesforce value beside each enriched value so the write-back only changes what actually improved. This is the step that makes the sync worth running, because syncing stale data both directions just moves staleness around faster.

Step 3: Choose the right write action so the sync never duplicates

The write-back is where a sync turns into a mess if you pick the wrong action.

Because every imported row carries its Salesforce Record ID, the correct write is the Update record action, which keys on that Record ID and lands on the exact existing record. It updates, so there is nothing to duplicate. Two related actions cover the rest: Upsert creates-or-updates in one step but requires an external ID on the object, so use it only when you key on your own identifier; Create record is for net-new rows and is configured to prevent duplicates by default. Turn on Ignore blank values so a field you could not enrich never overwrites a populated Salesforce value with a blank.

Auto-cycles the three write actions. Click a card to hold it and read how it lands, click it again to resume.

5,000 records imported with their Salesforce Record ID

Update record

Use when you are updating records you synced in from Salesforce

0 duplicates

Writes to the existing record. Nothing is created, so there is nothing to duplicate.

Auto-cycling · click a card to hold

You synced the Record ID in, so Update record is the write to use: it lands on the exact existing record with zero duplicates. Create and Upsert solve different problems and duplicate when misused.

Step 4: Scope what Clay can see and write

A sync into your system of record should touch only what it needs to.

You do not have to give Clay your whole CRM to run the loop. Connect through a restricted Salesforce user whose field-level permissions expose only the fields you enrich, and have Clay write to a dedicated set of fields (or a custom writeback object like Clay_Writeback__c) rather than your core objects. That keeps the sync auditable: you can see exactly what Clay touched, and sensitive fields stay invisible to it. The restricted user can still read what it needs and write the approved enrichment fields, so the loop runs at full strength with a fraction of the exposure.

Auto-applies a restricted-user permission set. Click a field to hold it; toggle to full access to see the difference.

Exposed to Clay: 5 of 28 fields

Clay_Enriched__cread + write
Clay_Status__cread + write
Clay_Last_Update__cread + write
Industryread + write
Employee countread + write

Hidden from Clay (23 more), including:

Opportunity AmountClose notesAccount Owner
Auto-playing · click to hold

A two-way sync does not require full CRM access: a restricted user and a dedicated writeback field set let Clay enrich and write back while sensitive fields stay invisible and every change stays auditable.

Step 5: Test the write, then let the loop run on a schedule

A Salesforce write from Clay cannot be undone, so the first real write should not be in production.

Connect your sandbox as a Salesforce Test Env, point the write at it, and confirm the right fields update on the right records with no duplicates before you touch production. Once it passes, let the loop run: the 24-hour import keeps Clay current with Salesforce, the enrichment and scoring re-run, and the write-back keeps Salesforce current with Clay. Watch the cost as it scales, because every synced row spends Actions for the orchestration and provider results spend Data Credits, so scope the synced object set and the refresh to the records that actually need it rather than the whole org.

Auto-plays synced vs unsynced Salesforce accuracy over six months. Click a month to hold it and compare the two.

Salesforce — no sync

accuracy 100%

Fresh at import — drift starts as the org changes.

Salesforce — two-way sync with Clay

accuracy 100%

Fresh at import — each cycle catches the next drift.
Auto-playing · click to hold

The payoff of the two-way sync is divergence over time: an unsynced record drifts to roughly 60% accurate in six months, while the synced one holds near 95% because each 24-hour cycle catches the drift.

Kept in sync, Salesforce stays the trusted record instead of the place data goes to rot.

80%

enrichment coverage OpenAI reached with Clay's multi-source waterfall, up from the low 40s on a single provider

Read the full story

Common failure modes, and how to avoid them

Most two-way syncs fail the same few ways. Watch for these.

  • Treating the sync as a one-time export: A single pull is stale by next week. Import Salesforce as a live source on the 24-hour refresh so changes flow both ways continuously.
  • Writing with Create instead of Update: A Create run over records that already exist duplicates every row. For synced records, use Update keyed on the Salesforce Record ID; use Upsert only for external-ID matches.
  • Letting blanks overwrite good data: A field you could not enrich writes an empty cell over a real value. Turn on Ignore blank values on every write.
  • Giving Clay the whole CRM: Full access is more exposure than the loop needs. Connect a restricted user and write to a scoped, auditable field set.
  • Testing in production: A Salesforce write cannot be undone. Run the full mapping against the Salesforce Test Env first, then promote.

Outcomes teams report after syncing their CRM with Clay

What teams report after consolidating CRM enrichment on Clay

CompanyOutcomeStory
Anthropic3x data enrichment coverage, several data vendors consolidatedRead
OpenAI2x enrichment coverage, scaled single-source to multi-sourceRead
IntercomScattered data tools consolidated onto one auditable platformRead

Clay has become the orchestration layer for everything GTM. Salesforce for record-keeping, Snowflake for product data, and Clay for turning it all into automated action.

Keep Salesforce current with a two-way sync

Import on a schedule, enrich and score in Clay, and write clean data back without duplicates.

Frequently asked questions

How do I sync Salesforce data with Clay?

Connect Salesforce (via OAuth or client credentials) and import the objects you want to work as a live table source. By default Clay re-syncs Salesforce imports every 24 hours, so new records and updates flow into Clay automatically. Enrich and score the records in Clay, then write the results back with the Update action keyed on the Salesforce Record ID, which gives you a continuous two-way sync.

Is Clay's Salesforce sync two-way?

Yes. The import side re-syncs every 24 hours so changes in Salesforce flow into Clay, and the write side pushes enriched and scored values back into Salesforce with Create, Update, and Upsert actions. Together that keeps both systems current without manual exports.

How often does Clay sync with Salesforce?

By default, Clay syncs Salesforce imports every 24 hours, and those updates trigger the action runs that re-enrich the records. You can also run a Salesforce SOQL source on a schedule for a precise query, and trigger an immediate re-run when you need a refresh sooner than the next cycle.

How does Clay avoid creating duplicate Salesforce records when it syncs data back?

For records imported with their Salesforce Record ID, Clay uses the Update record action keyed on that ID, so the write lands on the exact existing record and never creates a copy. Create record is reserved for net-new rows (with duplicates prevented by default), and Upsert is used only when matching on an external ID.

Can I sync Salesforce with Clay without giving it access to my whole CRM?

Yes. Connect through a restricted Salesforce user whose field-level permissions expose only the fields you enrich, and have Clay write to a dedicated field set or a custom writeback object. The loop runs at full strength while sensitive fields stay invisible and every change Clay makes stays auditable.