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.
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
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
Writes to the existing object. Nothing is created, so there is nothing to duplicate.
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
Hidden from Clay (25 more), including:
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%
Salesforce — two-way sync with Clay
accuracy 100%
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.
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 storyCommon 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
“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.”