Clay logo, go to homepage
Clay GTM guide

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

Exporting a HubSpot list to enrich it is a dead end: the enriched data has nowhere to go back to. The value is a loop that pulls records in, improves them, and writes the result back to the same record, on a schedule. Here is how to set that up without ever duplicating a record.

June 7, 20269 min read

Exporting a HubSpot list to enrich it is a dead end. The enriched data has nowhere to go back to.

The value is not in pulling HubSpot data out, it is in a loop that pulls records in, improves them, and writes the result back to the same record, on a schedule. HubSpot holds the contacts, companies, and deals; Clay enriches, scores, and researches them; and the loop only works if data flows in fresh and flows back clean. Get the refresh and the write actions right and HubSpot stays continuously enriched without anyone exporting a CSV. Get them wrong and you either work off stale records or spawn a duplicate contact on every write. This is how to set up a two-way HubSpot sync with Clay that keeps the CRM current and never duplicates a record.

What you need before you start:

  • A Clay account connected to HubSpot: With the scopes to read the objects you work and write the properties you enrich.
  • Your objects and properties in scope: Contacts, companies, and deals, plus the specific properties you intend to update.
  • A short list of what flows back: A tight sync is a safe sync, and HubSpot write actions make permanent changes every user sees.

Step 1: Import HubSpot objects as a live source, and remember reads are safe

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

Pull the objects you want to work into a Clay table with HubSpot Lookup actions. Lookups are read-only: they pull data from HubSpot into Clay without changing anything, so you can query, test, and iterate with zero risk to production. Import a filtered set (contacts missing a title, companies with no employee count, deals in an open stage) rather than the whole portal, and turn on Auto-update so the records refresh on a schedule, every 24 hours by default, and re-run their enrichments as HubSpot changes. Carry the HubSpot record ID on every row; it is the key the write-back uses to land on the exact object later.

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

HubSpotClay

Import

Lookup actions pull records into Clay read-only, without changing HubSpot, and Auto-update refreshes them on a schedule.

Default import cadence: every 24h

Auto-playing · click to hold

A two-way HubSpot sync is a loop, not an export: read-only Lookups pull records in on an auto-update refresh and enriched values write back, so the CRM stays current without manual exports.

Step 2: Enrich and score the records inside Clay

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

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

Step 3: Write back to HubSpot without creating duplicates

Writing to HubSpot is a permanent change every user sees, so use the right action and key.

Clay's HubSpot Create and Update actions push data back, and unlike the read-only Lookups they make real changes. For records you imported, use the Update action keyed on the HubSpot record ID, so the write lands on the exact existing object and never spawns a copy. Turn on Ignore blank values so a field you could not enrich never overwrites a populated property. Use Create only for net-new objects, and when you need to link a contact to its company or a deal, the Create association action connects the two objects, while Find owner resolves the right HubSpot owner by ID or email so assignment stays intact.

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

Use when you are updating records you synced in from HubSpot

0 duplicates

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

Auto-cycling · click a card to hold

You synced the record ID in, so Update is the write to use: it lands on the exact existing object with zero duplicates. Create handles net-new and Create association links objects.

Step 4: Scope what Clay can read and write

A sync into your CRM should touch only the objects and properties it needs.

You do not have to grant Clay your whole HubSpot portal. Connect with the scopes for just the objects you work and the properties you enrich, and write to a dedicated set of properties rather than scattering changes across the record. That keeps the sync auditable: you can see exactly which properties Clay maintains, and the rest of the record is off-limits. Reads stay safe regardless, since Lookups never change anything, so the only access that needs careful scoping is the write side.

Auto-applies the connection scopes. Click a property to hold it; toggle to full access to see the difference.

Exposed to Clay: 5 of 30 fields

Clay Enrichedread + write
Clay Last Updateread + write
Industryread + write
Employee countread + write
Lifecycle stageread + write

Hidden from Clay (25 more), including:

Deal amountClose notesOwner notes
Auto-playing · click to hold

A two-way sync does not require full HubSpot access: scoping the connection to the objects and properties you enrich, and writing to a dedicated property set, keeps sensitive fields untouched and every change auditable.

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

A HubSpot write is permanent, so the first real write should not be your whole database.

Run the write against a small, known set of records first (or a HubSpot sandbox if you have one) and confirm the right properties updated on the right objects with no duplicates before you scale. Once it is clean, let the loop run: Auto-update keeps Clay current with HubSpot, the enrichment and scoring re-run, and the write-back keeps HubSpot 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 portal.

Auto-plays synced vs unsynced HubSpot 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 HubSpot record drifts to roughly 60% accurate in six months, while the synced one holds near 95% because each refresh cycle catches the drift.

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

80%+

enrichment coverage Vanta reached by combining multiple data sources in Clay, instead of letting single-provider gaps pile up in the CRM

Read the full story

Common failure modes, and how to avoid them

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

  • Treating the sync as an export: A one-time pull is stale by next week. Import HubSpot as a live source with Auto-update so changes flow both ways continuously.
  • Writing with Create instead of Update: A Create run over contacts that already exist duplicates every record. For synced records, use Update keyed on the HubSpot record ID; HubSpot dedupes new contacts on email, but Update is what guarantees you land on the existing object.
  • Letting blanks overwrite good data: A property you could not enrich writes an empty value over a real one. Turn on Ignore blank values on every write.
  • Granting the whole portal: Full access is more exposure than the loop needs. Scope the connection and write to a dedicated property set.
  • Writing to everything at once: A write is permanent and every user sees it. Test on a small set first, then scale.

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, 100% of research tasks automatedRead
IntercomMultiple data sources consolidated onto one platformRead

We consolidated three vendors into Clay and started enriching data points that didn't exist in any traditional database. Our reps went from starting every conversation cold to knowing exactly who to call and what to say.

Keep HubSpot 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 HubSpot data with Clay?

Pull the objects you want into a Clay table with read-only HubSpot Lookup actions, turn on Auto-update so they refresh on a schedule, and carry the HubSpot record ID on every row. Enrich and score the records in Clay, then write the results back with the Update action keyed on the record ID. That import-plus-write-back loop is a continuous two-way sync.

Is Clay's HubSpot sync two-way?

Yes. The import side uses Lookup actions with Auto-update so changes in HubSpot refresh into Clay, and the write side pushes enriched and scored values back with Create, Update, and Create association actions. Together that keeps both systems current without manual exports.

How does Clay avoid creating duplicate HubSpot records when it writes back?

For records imported with their HubSpot record ID, Clay uses the Update action keyed on that ID, so the write lands on the exact existing object and never creates a copy. Create is reserved for net-new objects, and Create association links a contact to its company or deal rather than duplicating either. Turning on Ignore blank values also stops a failed enrichment from overwriting a good property.

How often does Clay refresh HubSpot data?

Imports and enrichments run on Auto-update, which defaults to every 24 hours, and re-running them triggers the write-back so HubSpot stays current. You can adjust the schedule and trigger an immediate re-run when you need a refresh sooner than the next cycle.

Can I sync HubSpot with Clay without giving it access to my whole portal?

Yes. Connect with the scopes for only the objects you work and the properties you enrich, and write to a dedicated property set. Reads through Lookup actions never change anything, so the only access to scope carefully is the write side, and limiting it keeps sensitive properties untouched and every change auditable.