HubSpot Salesforce Integration: Where the Sync Breaks and How to Fix It
HubSpot Salesforce Integration: Where the Sync Breaks
You install the connector, map a few fields, and wait. Nothing happens. The integration doesn't sync anything at install. Three weeks later sales finds two copies of half the accounts, and a lead source field that says "Paid Social" on deals that came from a trade show.
The native HubSpot Salesforce integration is good. It comes with HubSpot Professional and Enterprise, it syncs both ways, and for a team with one Salesforce org and clean data it mostly just works. But it breaks at predictable points, and the HubSpot Community is full of threads from people who hit them: duplicate companies, fields that won't map, records that refuse to unsync.
Duplicates are the case that catches most teams, and it's worth understanding before you install rather than three weeks after. Contacts sync into Salesforce as leads while HubSpot auto-creates companies on its own, so deduplication matches on associated contacts instead of on domain. One company reachable at two email domains becomes two records, and nobody notices until a report comes back wrong.
This guide covers the requirements people miss, how the sync actually decides what goes where, the nine places it breaks, and the line where the native connector stops being the right tool.
TL;DR: Symptom, Cause, Fix
| Symptom | Cause | Fix |
|---|---|---|
| Duplicate companies in HubSpot | Contacts sync as Salesforce leads while companies are auto-created. Dedupe runs on associated contacts, not domain | Turn off auto-create, or move to the new company sync matched on domain |
| One contact's values keep flipping | Several Salesforce records share its email, and HubSpot syncs with whichever was updated last | Deduplicate in Salesforce, then resync |
| Deals doubled against opportunities | HubSpot never deduplicates deals with opportunities | Pick one system to create deals in |
| A HubSpot value quietly reverts | The mapping's sync rule favors Salesforce, or the first sync set a Salesforce baseline | Choose a system of record per field and set rules to match |
Lookup fields show 0015g00000AbCdEAAZ |
Salesforce reference fields sync as 18-digit IDs | A dropdown property with maintained labels, or middleware |
| Custom object fields won't map | Lookup fields on custom objects can't be mapped | Use association settings instead |
| A record never syncs | Outside the inclusion segment, a formula field change, or missing permissions | Work through the checklist in section 7 |
| Salesforce API limit warnings | Up to 4 API calls per contact, 3 per record on resync | Set HubSpot's allocation and resync in batches |
| Salesforce flooded with tasks | Timeline sync creates a task for every email open and click | Sync only the events sales actually reads |
Before You Install: Requirements Most Teams Miss
Check these before anyone clicks Install. Every one of them has stopped a rollout.
- HubSpot Professional or Enterprise. Marketing, Sales, Service, Data, Content Hub or Smart CRM all qualify. Starter doesn't.
- A Salesforce edition with API access, or Professional. Group Edition isn't supported at all.
- The connecting user is a Salesforce system admin with API Enabled, View Setup and Configuration, Modify All on every synced object, Customize Application and Download AppExchange Packages.
- That user's visibility is the sync's visibility. If the integration user can't see leads, leads won't sync. This is the most common cause of "some records just don't come over."
- "Enforce IP Restrictions on Every Request" blocks the connection. HubSpot uses dynamic IPs, so you can't allowlist your way around it.
- One Salesforce org per HubSpot account. Several HubSpot accounts can connect to the same org, but not the other way around.
- Changing Salesforce orgs later is painful. Only contact-to-lead and contact-to-contact links survive. Company-account and deal-opportunity links are lost.
Source: HubSpot, Install the HubSpot-Salesforce integration
How the Sync Actually Works
Most sync problems come from four misunderstandings about how the integration decides what moves.
1. Nothing syncs until something triggers it
Installing the integration doesn't copy anything. Records move when a trigger fires: a form submission, a change to a mapped property, an owner change, a lifecycle stage change, or a contact joining the inclusion segment. HubSpot checks for new or updated data roughly every 15 minutes. Everything else needs an import or a manual resync.
Imports have their own catch. A Salesforce import brings over the email address first, and the other fields only follow if the contact is in your inclusion segment (or you don't use one). Otherwise every other property stays blank.
2. Each direction has its own filter
The inclusion segment controls what goes from HubSpot to Salesforce. Selective sync controls what comes from Salesforce to HubSpot. Teams set one, assume it covers both directions, and then wonder why Salesforce records they filtered out keep arriving.
3. The sync rule decides who wins
Every field mapping has a rule, and the rule names don't make the deletion behavior obvious.
| Rule | What happens | The surprise |
|---|---|---|
| Prefer Salesforce unless blank | HubSpot only writes into empty Salesforce fields | Clear a value in Salesforce and it's cleared in HubSpot too |
| Always use Salesforce | HubSpot never writes to Salesforce | Deletions in Salesforce still flow into HubSpot |
| Two-way | The most recent value wins | Deletions sync in both directions |
| Don't sync | Nothing moves | Standard mappings can only be set to this, never deleted |
The Owner field is a special case: it only maps two-way, even when the settings screen shows a different rule.
4. The first sync plays by different rules
For a field with no sync history, the current Salesforce value becomes the baseline, and it can overwrite a more recent value in HubSpot. The first sync can also push mapped fields to Salesforce for records outside your inclusion segment. And a mapping you add later doesn't backfill: existing values stay put until you resync or import.
Source: HubSpot, Map HubSpot properties to Salesforce fields
The 9 Places the Sync Breaks
Each one follows the same pattern: what you see, why it happens, how to fix it, and where the native connector stops.
1. Duplicate companies
What you see: two, sometimes three, HubSpot companies for the same Salesforce account.
Why: if HubSpot contacts sync to Salesforce as leads, and leads have no account, then HubSpot auto-creates companies on its own side. The standard company sync deduplicates using associated contacts, not the domain. When a lead converts, or someone creates the account by hand, HubSpot creates a second company.
Fix: turn off automatic company creation when you sync contacts as leads. Or switch to the new company sync, which syncs companies without contacts and deduplicates on a mapped field such as domain.
Where native stops: the new company sync can't be rolled back once it's on. And merging companies in HubSpot doesn't merge the accounts in Salesforce. If you already have hundreds of duplicates, fixing the setting stops new ones but the existing ones need a cleanup on both sides, done in an order that doesn't break the sync links.
Unsyncing a company: on the new company sync, a company only syncs from HubSpot while it's in the inclusion segment, and only syncs from Salesforce while it matches your selective sync filters. Take it out of both to stop future updates. HubSpot's docs don't spell out what happens to the Salesforce record when it leaves the segment, so try it on a test company before doing it in bulk.
Sources: Manage your Salesforce integration settings, Use the new company sync
2. A contact's values keep flipping
What you see: a contact's phone number or title changes, then changes back, then changes again.
Why: HubSpot matches contacts on email address only. If Salesforce has several leads or contacts with the same email, HubSpot syncs with the first one returned, and from then on with whichever was updated most recently. Two Salesforce records take turns overwriting one HubSpot contact.
Fix: turn on duplicate and matching rules in Salesforce, merge the existing duplicates there, then resync the affected contacts.
Where native stops: you get no control over which Salesforce duplicate HubSpot pairs with.
Source: Duplicate Salesforce leads or contacts syncing to HubSpot
3. Deals and opportunities don't line up
What you see: the same deal twice, or deals with no company attached.
Why: HubSpot doesn't deduplicate deals against Salesforce opportunities, ever. If company sync was off when a deal first synced, the company association never gets made. Contact-to-deal links depend on OpportunityContactRole records in Salesforce.
Fix: decide which system creates deals and stick to it. Turn on company sync before opportunity sync, not after: turning company sync on later removes the account associations from opportunities that already synced. Also check your Sales Hub tier, which caps how many pipelines can sync.
Source: Sync Salesforce opportunities to HubSpot
4. Fields get overwritten or wiped
What you see: marketing updates a field in HubSpot and it reverts within the hour. Or a whole column goes blank after someone cleans up Salesforce.
Why: the sync rule table above. Prefer Salesforce unless blank means Salesforce wins whenever it has a value. Deletions propagate under three of the four rules. And the first sync treats Salesforce as the baseline.
Fix: before go-live, list every mapped field and name its system of record: HubSpot or Salesforce. Decide per field, not per object. Lead source is a good example. Marketing owns it at creation, but sales often edits it after a call, so it needs a deliberate rule rather than the default.
Deletions: deleting a contact or deal in HubSpot doesn't delete it in Salesforce. Deleting in Salesforce can remove the value, or the record, on the HubSpot side.
5. Fields that won't map, or show IDs
What you see: a mapping you want isn't in the dropdown, or a field that should say "Enterprise" says a015g00000XyZ12AAB.
Why: mappings only work between compatible field types:
| HubSpot property | Salesforce field |
|---|---|
| Dropdown select, radio select | Picklist, reference |
| Multiple checkboxes | Multipicklist |
| Single checkbox | Boolean |
| Number | Double, int |
| Single-line text | String, textarea |
| Multi-line text | Textarea |
| Date picker | Date, datetime |
Salesforce reference (lookup) fields arrive as 18-digit record IDs, not the name you see in Salesforce. HubSpot user properties can't be mapped at all, and each object tops out at 500 mappings.
Fix: for reference fields, map to a HubSpot dropdown and maintain the ID-to-label options by hand, or sync the display value into a text field with a Salesforce flow. When sales adds a new picklist value in Salesforce, press Refresh on the mapping, or you'll start seeing "Restricted picklist value" and "Mismatched options" errors.
Where native stops: if many reference fields need readable labels, maintaining dropdowns by hand doesn't scale. That's middleware territory.
6. Custom objects
What you see: the custom object sync is set up, but key fields are missing and associations don't appear.
Why: custom object sync is Enterprise only, and it has hard limits:
- You can't create field mappings on Salesforce lookup fields for custom objects. Associations have to go through the association settings instead.
- A custom object can't sync to both Salesforce contacts and leads.
- Associations only work between objects that are already syncing.
- The HubSpot custom object has to exist first, with at least one required field.
Where native stops: most real custom object setups hit at least one of those walls. If your data model depends on lookups between custom objects, plan for middleware from the start.
Source: Set up and use Salesforce custom object sync
7. Records that never sync
Work through this list in order:
- Not in the inclusion segment (HubSpot to Salesforce) or filtered out by selective sync (Salesforce to HubSpot).
- The change was to a formula field. Formula edits don't trigger a sync, and neither do changes to the fields that feed the formula.
- Removed from a Salesforce campaign. That doesn't trigger a sync either.
- The integration user lacks field or object permissions.
- Imported, but outside the segment, so only the email came over.
- Salesforce rejected the write. Validation rules, flows or required fields block it, and the error lands in Sync Health, not in front of the person who edited the record.
8. Salesforce API limits
What you see: API limit warnings in Salesforce, or syncs that stall.
Why: a single contact sync can take up to four API calls per record. A segment resync needs at least three calls per record in the segment. Turning on the new company sync temporarily raises usage while it indexes records. The math adds up fast: resyncing a 50,000-contact segment means at least 150,000 calls.
Fix: in Sync Health, set Allocated to HubSpot against your Salesforce limit, leaving room for your other integrations. Check your org's actual limit in Salesforce Setup, since it depends on edition and licenses. Run large resyncs in batches, outside business hours.
Source: Resolve Salesforce integration sync errors
9. Activity sync floods Salesforce with tasks
What you see: reps open a Salesforce contact and scroll past forty "Email opened" tasks to find a real note.
Why: timeline sync is one-way, and it creates a Salesforce task for every email open and click, with no deduplication. Each activity links to only one contact. Emails captured by Einstein Activity Capture don't sync, and tasks can't be assigned to queues or inactive owners.
Fix: sync only the event types sales actually uses. Form submissions and meetings booked usually earn their place. Individual email opens rarely do.
Source: Sync activities and tasks between HubSpot and Salesforce
Reading Sync Health
Errors live in HubSpot under Connected Apps > Salesforce > Data sync > Sync Health. You can export them to CSV and get notified instantly, daily or weekly. The column that matters most is the one HubSpot doesn't show: who fixes it.
| Error category | Typical examples | Who fixes it |
|---|---|---|
| Associations | "Association limit reached", "Waiting for account to sync" | HubSpot admin (import the accounts, check company sync) |
| Custom code | Salesforce flows, validation rules, "Missing contact ID" | Salesforce admin |
| Duplicates | "Email already in use", Salesforce duplicate rules | Both. Agree on a matching rule first |
| Permissions | "Insufficient Salesforce access", field permissions | Salesforce admin (integration user) |
| Picklists | "Restricted picklist value", "Inactive opportunity stage", "Inactive Salesforce owner" | Salesforce admin, then refresh the HubSpot mapping |
| Property mappings | "Type mismatch", "Invalid Salesforce ID" | HubSpot admin |
| Property values | "String too long", "Invalid email", "Missing required value" | Whoever owns the bad records |
Bulk resync handles 100 errors at a time. For more than that, fix the root cause and trigger a resync by updating a mapped property or re-importing.
Native Connector vs Zapier, Make, or Custom Middleware
| Situation | Use |
|---|---|
| HubSpot Pro or Enterprise, one Salesforce org, standard objects, reasonably clean data | The native connector |
| A one-way handoff, like closed-won deals posting to Slack or a finance tool | Zapier or Make alongside the native connector |
| HubSpot Starter or Salesforce Group Edition | Middleware, since the native connector doesn't support them |
| More than one Salesforce org, currency conversion, lookups on custom objects, logic across several objects | Custom middleware built on both APIs |
| Hundreds of existing duplicates on both sides | A cleanup project before any tool change |
Zapier and Make are great at "when this happens there, do that here." Building true two-way sync with them means handling loops, conflicts and deletions yourself, which is exactly the work the native connector already does. Use them to extend the connector, not to replace it.
Pre-Launch Checklist
Copy this into your rollout plan:
- HubSpot Pro or Enterprise, and a supported Salesforce edition with API access
- Integration user is a system admin with access to every synced object and field
- "Enforce IP Restrictions on Every Request" is off
- Every mapped field has a named system of record
- Every mapping's sync rule matches that decision, including Owner behaving two-way
- Inclusion segment and selective sync are both set on purpose
- Salesforce is deduplicated by email before the first sync
- Company sync mode is chosen and turned on before opportunity sync
- HubSpot's API allocation is set, with headroom for a full resync
- Activity sync is trimmed to the events sales reads
- Everything was tested against a Salesforce sandbox first
When to Bring In Help
If you've cleaned up duplicates more than twice, or you hit one of the "where native stops" lines above, you're past a settings tweak. It's a scoped project: decide field ownership, fix the mappings, merge records on both sides in the right order, and add middleware only where the connector can't do the job.
That's the work we do. Our CRM integration sync audit reviews every mapping, sync rule, duplicate pattern, permission and API setting, and gives you a written fix plan in about five business days. It's $499, and it comes off the cleanup quote if you hire us to do the fix. Or run the free 10-point sync health checklist first. If everything passes, you probably don't need us.
Still choosing between the two platforms? Our HubSpot alternatives and Salesforce alternatives guides compare the CRM side.
Frequently Asked Questions
Does HubSpot integrate with Salesforce?
Yes. HubSpot has a native Salesforce integration that syncs contacts, leads, companies, deals, tasks and activities in both directions. It's included with HubSpot Professional and Enterprise plans, and the connecting Salesforce user needs admin permissions, including API access.
Which HubSpot and Salesforce editions do I need?
HubSpot Professional or Enterprise on any hub, including Smart CRM. On the Salesforce side, an edition with API access, or Salesforce Professional. Group Edition isn't supported. Custom object sync needs HubSpot Enterprise.
How often does HubSpot sync with Salesforce?
HubSpot checks for new or updated records roughly every 15 minutes, and only syncs records when something triggers it, such as a mapped property change, a form submission or an owner change. Nothing syncs automatically at install, so existing records need an import or resync.
Why is HubSpot creating duplicate companies from Salesforce?
Usually because HubSpot contacts sync to Salesforce as leads while HubSpot automatically creates companies. The standard company sync deduplicates through associated contacts rather than domain, so a converted lead or a manually created account produces a second company. Turning off automatic company creation, or moving to the new company sync matched on domain, stops new duplicates.
Can I sync Salesforce custom objects to HubSpot?
Yes, on HubSpot Enterprise. You create the custom object in HubSpot first, then map it. Lookup fields on custom objects can't be mapped, a custom object can't sync to both contacts and leads, and associations only work between objects that are already syncing.
Can I connect more than one Salesforce org to HubSpot?
No. Each HubSpot account connects to one Salesforce org. Several HubSpot accounts can connect to the same Salesforce org, but syncing one HubSpot account with several orgs needs middleware.
Does deleting a record in HubSpot delete it in Salesforce?
No. Deleting a contact or deal in HubSpot doesn't delete the matching Salesforce record. Deletions in Salesforce can flow into HubSpot, depending on the field's sync rule.
Why do my Salesforce lookup fields show IDs in HubSpot?
Salesforce reference fields sync as 18-digit record IDs instead of display names. Either map them to a HubSpot dropdown with labels you maintain, copy the display value into a text field with a Salesforce flow, or use middleware that resolves the names.
The Honest Take
The native connector is the right starting point for almost every team on HubSpot Pro with one Salesforce org. When the sync goes wrong, the connector is rarely the cause. What goes wrong is the setup: nobody decided which system owns which field, duplicates were never cleaned before the first sync, and company sync got turned on in the wrong order.
Fix those three things and most of the errors above never show up. Skip them, and no amount of Zapier will save you.
Sync still misbehaving?
We audit your HubSpot, Salesforce, Pipedrive or QuickBooks integration: every mapping and sync rule, duplicates on both sides, permissions, API usage and errors. You get a written fix plan in about 5 business days. From $499, credited toward the fix if you hire us.



