The HubSpot–Salesforce integration is HubSpot’s native connector that syncs contacts, leads, companies, deals, tasks and activity between the two CRMs. It works when you name a system of record for every field, gate what syncs with an inclusion list, align picklists before you connect, and run a dedicated integration user with scoped permissions and an API budget.
Most sync problems are design problems. The connector does exactly what the mappings, the inclusion list and the integration user’s permissions tell it to do.
| HubSpot object | Salesforce object | Direction | What to decide before you connect |
|---|---|---|---|
| Contact | Lead or Contact | Two-way | Whether new HubSpot contacts create Salesforce Leads or Contacts, and who owns lead conversion. Pick one; mixing both creates lead/contact duplicates. |
| Company | Account | Two-way (object sync must be on) | Your account matching key (domain or an external ID) and whether HubSpot’s auto-create-company setting is on. Accounts must sync before contacts can associate to them. |
| Deal | Opportunity | Two-way (object sync must be on) | Which pipeline and stages map to which opportunity record type and stages. Every active Salesforce stage needs a HubSpot stage, and vice versa. |
| Task / activity | Task / Event | Mostly HubSpot → Salesforce | Which activity types to log (emails, meetings, calls) and whether Task Priority, Status and Type values match HubSpot’s fixed options. |
| Contact list / campaign | Campaign member | HubSpot → Salesforce | Which HubSpot campaigns add members to Salesforce campaigns, so campaign influence reporting in Salesforce isn’t empty. |
| Custom objects | Custom objects | Configurable | Only sync what a workflow or report in the other system actually uses. Custom object sync needs HubSpot Enterprise. |
The connector requires a HubSpot Professional or Enterprise hub and a Salesforce edition with API access. HubSpot caps field mappings at 500 per object. Values that already exist when you create a mapping don’t backfill on their own; run a bulk resync or a Salesforce import.
A HubSpot list decides which HubSpot contacts may create or update records in Salesforce. No inclusion list means every contact is eligible, including spam form fills and unsubscribed students.
Controls volumeEach mapped field carries one of four rules. The default for most standard fields leans toward Salesforce. Two-way means “last edit wins,” which is how fields start ping-ponging between systems.
Most misunderstoodThe connector can only read and write what its Salesforce user can. Missing field-level security, validation rules and flows that fire on its edits cause most “mystery” sync errors.
PermissionsEvery sync consumes Salesforce API calls from the same daily allocation your other integrations use. Bulk updates on either side can exhaust it, and the sync queues until the limit resets.
CapacityDropdown values sync by internal value, not label. One extra option in Salesforce, a restricted picklist or a state/country picklist mismatch blocks the whole record, not just the field.
Top error sourceFailed records sit in HubSpot’s sync health queue until someone looks. You can bulk-resync up to 100 errors at a time after fixing the cause; beyond that, import or touch a mapped property.
MonitoringDefault to one-way. Every field gets one system of record, written down. Two-way is the exception you justify field by field.
| Sync rule | What it does | Deletions | Use it for |
|---|---|---|---|
| Prefer Salesforce unless blank | HubSpot only writes to Salesforce when the Salesforce field is empty. Salesforce values overwrite HubSpot. | Salesforce deletions clear HubSpot | Firmographics and contact details sales may correct: job title, phone, industry, employee band. |
| Always use Salesforce | HubSpot never writes. Salesforce always overwrites HubSpot. | Salesforce deletions clear HubSpot | Sales-owned truth: lead status, account type, customer status, ARR, opportunity stage-derived fields, territory. |
| Two-way | Most recent value wins in either system. | Deletes propagate both ways | A short list both teams genuinely edit, such as email opt-in context fields. Owner is effectively two-way and must match exactly. |
| Don’t sync | No data passes. | No propagation | Fields one system uses internally, legacy fields you’re retiring, and anything you’re not sure about yet. |
| HubSpot property type | Compatible Salesforce field type |
|---|---|
| Dropdown select / Radio select | Picklist, reference (lookup) |
| Multiple checkboxes | Multi-select picklist |
| Single checkbox | Checkbox (boolean) |
| Number | Number, currency, percent (double / int) |
| Single-line text | Text, text area |
| Multi-line text | Text area |
| Date picker | Date, date/time |
| HubSpot user (custom) | Not mappable. Use the owner field. |
Source: HubSpot Knowledge Base, “Map HubSpot properties to Salesforce fields,” checked October 2026. Rules 01–06 are JayOh’s implementation standard.
Sync people sales should see. Not everyone who ever downloaded a PDF. A tight list protects API calls, Salesforce storage and rep attention.
Salesforce inclusion list (active list, contacts) GROUP A Lifecycle stage is any of: MQL, SQL, Opportunity, Customer, Evangelist OR GROUP B Contact owner is known OR GROUP C Salesforce Lead ID is known OR Salesforce Contact ID is known OR GROUP D Recent conversion is any of: Demo request, Pricing, Contact sales AND (every group) Email hard bounced is not true AND Email domain is none of: [competitor + test domains] AND Persona is none of: Student, Job seeker, Vendor
Removing a contact from the list doesn’t delete it in Salesforce. It stops future updates from HubSpot. Plan your cleanup in Salesforce separately, and keep Group C so records that already synced keep updating. Start with a narrow list, check the count against your Salesforce storage and API headroom, then widen it.
| Error | Likely cause | Fix |
|---|---|---|
| Picklists Missing Salesforce picklist option / Mismatched options | A HubSpot dropdown value has no matching internal value on the Salesforce picklist. | Match the Salesforce option API names to HubSpot internal values. Add the missing value in Salesforce or remap it in HubSpot, then resync. |
| Picklists Restricted picklist value | The Salesforce picklist is restricted to its defined values and HubSpot sent something else. | Align the values. Lift the restriction only if Salesforce governance allows it. |
| Picklists Mismatched state or country value | Salesforce State and Country Picklists are on and HubSpot holds free-text values (“Calif.”, “USA”). | Normalize HubSpot to the exact Salesforce values with a workflow or a dropdown form field. Confirm the values exist in Salesforce’s state/country settings. |
| Picklists Inactive Salesforce owner / Salesforce owners not synced | The record’s owner is a deactivated Salesforce user, or the user type can’t sync. | Reassign to an active user. User type must be Standard, Power Partner or Guest. Add a deactivation step to offboarding that reassigns records first. |
| Picklists Missing or invalid opportunity stage / Inactive opportunity stage | Deal and opportunity stages don’t map one-to-one, or a stage was deactivated in Salesforce. | Map every active stage both ways. Move open opportunities off inactive stages before you deactivate them. |
| Picklists Default sales process unavailable | The integration user’s profile has no default opportunity record type or sales process. | Assign a default record type to the integration user, or deactivate unused record types. |
| Permissions Insufficient access / Salesforce field permission | The integration user lacks object access or field-level security on a mapped field. | Grant Read and Edit on the field via a permission set dedicated to the integration user. Never fix this by making the user a System Administrator. |
| Duplicates Email already in use | Another HubSpot contact already holds that email, often from a Salesforce lead and contact for the same person. | Merge the HubSpot contacts, or remove the email from the stale record. Then fix the root cause: lead and contact created for one person. |
| Duplicates Salesforce duplicate rule | A Salesforce matching or duplicate rule blocks the insert. | Have the Salesforce admin review the rule. Merge the conflicting records, or set the rule to allow-with-alert for the integration user. |
| Custom code Salesforce custom field validation rule | A validation rule requires a value or format HubSpot doesn’t send (e.g. “Industry required to save”). | Default the value via the mapping, or exempt the integration user in the rule formula. Document every exemption. |
| Custom code Salesforce flow / Salesforce automation | A record-triggered flow or Apex trigger errors when the integration user edits the record. | Read the flow fault email, fix the flow, or add an entry condition that skips integration-user edits where the logic doesn’t apply. |
| Values Type mismatch | Mapped property and field types aren’t compatible, or a field was deleted or changed type. | Use the compatibility table above. Recreate the mapping after any type change on either side. |
| Values String too long | HubSpot text exceeds the Salesforce field length. | Raise the Salesforce field length or truncate in HubSpot with a workflow before sync. |
| Values Invalid email / Missing required value | Malformed email, or a required Salesforce field (Last Name, Company) is blank. | Fix the value. For Leads, default Company (e.g. “[Unknown]”) and Last Name in the mapping so form fills without them still sync. |
| Associations Waiting for account to sync | The contact is associated to a Salesforce account that hasn’t synced to a HubSpot company yet. | Turn on company/account object sync, or import the Salesforce accounts into HubSpot, then resync the contacts. |
| Associations Association limit reached / cardinality mismatch | A record exceeds HubSpot’s association limit, or one activity is tied to several contacts when only one can sync. | Remove or reassign associations. Keep one primary contact on synced activities. |
| Other Duplicate id specified | A custom mapping includes a Salesforce ID field (Lead ID, Contact ID). | Delete those mappings. The connector manages Salesforce IDs on its own. |
| Silent Sync delays or a growing queue | Salesforce’s daily API allocation is exhausted by bulk jobs or another integration. | Stagger bulk updates, tighten the inclusion list, check HubSpot’s API call setting, review high-volume automations, or buy more API capacity. |
| Silent Values flip back and forth | A field is two-way and automation on both sides writes to it (lead status set by a HubSpot workflow and a Salesforce flow). | Pick one system of record and change the rule to one-way. Then turn off the losing side’s automation. |
| Silent Synced records arrive with blank fields | The field isn’t mapped, the rule is Don’t sync, or existing values never backfilled. | Add or fix the mapping, then bulk resync or import. Spot-check five records after every mapping change. |
| Silent Marketing source overwritten in Salesforce | Lead Source is editable by reps and mapped two-way, or a Salesforce flow stamps it. | Map HubSpot original source to a dedicated read-only Salesforce field. Leave the rep-editable Lead Source alone. |
Error names follow HubSpot’s Knowledge Base article “Common Salesforce integration sync errors” (checked October 2026). Causes and fixes reflect JayOh’s delivery experience across dual-CRM clients.
Twenty checks we run in the first week of every dual-CRM engagement. Tick what’s true today. Critical items count double.
Tick the checks that are true today.
Fix nextBands (JayOh guidance): under 50% fragile, 50–79% stable with leaks, 80%+ healthy.
The integration breaks at the org chart before it breaks in the connector. Give each system a clear owner and one shared change process.
| Area | System of record | Owner | Cadence |
|---|---|---|---|
| Forms, lists, scoring, nurture, source tracking | HubSpot | Marketing Ops | Changes logged; scoring reviewed quarterly |
| Lead status, conversion, opportunity stages, forecast | Salesforce | Sales Ops / Salesforce admin | Stage changes require a mapping review first |
| Field mappings, inclusion list, integration user | Both | RevOps (one named person) | Weekly error review, monthly reconciliation |
| Picklist values (industry, country, persona) | Salesforce, mirrored in HubSpot | RevOps | New values added to both systems same day |
| Lifecycle stage definitions and the MQL→SQL handoff | Documented once, enforced in both | Marketing + Sales leadership | Reviewed every two quarters |
A RevOps consultant plus HubSpot and Salesforce developers, working your error queue and your design in the same sprint.
We engineer growth systems. JayOh builds the RevOps architecture, GTM execution and data infrastructure that turn messy revenue operations into predictable pipeline for B2B SaaS and PE-backed teams.