The company ran on Salesforce and Pardot. Marketing needed HubSpot. Sales couldn’t leave Salesforce. The answer was a live two-way sync — but only after fixing what would have broken it.
The Situation
The company had built its sales operation on Salesforce. The pipeline was there, the lead assignment was there, the deal history was there. Sales was not moving.
But marketing needed HubSpot — for email automation, lifecycle tracking, nurture programs, and attribution that Pardot was no longer delivering well enough at their scale. The ask was not a rip-and-replace. It was a co-existence: HubSpot for marketing, Salesforce for sales, with a live two-way sync keeping both in agreement.
The database had grown to roughly 200,000 records — Leads, Contacts, Accounts, and Opportunities accumulated across years of global sales activity. Before a single record could move, the state of that data needed to be understood. And what the audit found made it clear: moving first would have broken the sync on day one.
Before — The Salesforce Audit
The first rule of any migration is that the quality of what comes out is determined entirely by the quality of what goes in. Before touching the HubSpot integration, a full Salesforce data audit was run across all objects.
| Issue Found | Detail |
|---|---|
| Duplicate leads | Same prospect appearing multiple times — different email formats, manual re-entries, import overlaps |
| Missing required fields | Key properties blank across large portions of the database — no owner, no country, no lead source |
| Records owned by inactive users | Deactivated Salesforce users still listed as record owners — a critical sync blocker (see below) |
| Test and QA data | Test leads, QA accounts, and internal team email addresses mixed into the live database |
| Inactive picklist values | Salesforce picklist fields contained inactive values that HubSpot would reject during sync |
| Unconverted leads | Leads that had progressed past qualification but were never formally converted to Contact + Account + Opportunity |
Each of these issues was resolved before the HubSpot integration was configured. Not after. The cleanup was the migration — the technical sync was just the final step.
The Critical Pre-Flight Check
Of all the issues found in the audit, inactive record ownership was the most dangerous for a two-way sync. It is also the most commonly overlooked.
When a Salesforce user is deactivated, any records still assigned to them become a sync liability. The records will sync from Salesforce into HubSpot without issue. But when HubSpot attempts to write an update back to Salesforce — a property change, a lifecycle stage update, a marketing activity — Salesforce rejects the write because the assigned owner no longer exists as an active user. The sync becomes one-directional without anyone realising it.
This happens most commonly when sales reps leave the company and IT deactivates their Salesforce accounts without reassigning their records. In a database of 200,000 records accumulated over several years, this was not an edge case — it was widespread.
Every record owned by an inactive user was identified and reassigned to an active Salesforce user before the integration was enabled. This single step prevented the majority of sync errors that would otherwise have appeared immediately after go-live.
“A two-way sync that only works in one direction is not a sync. It is a data divergence waiting to happen. Inactive owner cleanup is non-negotiable before you connect any CRM to HubSpot.”
The Object Model Decision
This structural difference is one of the most important things to resolve before a Salesforce-HubSpot migration — and it is often the thing teams think least about.
In Salesforce, the Lead object and the Contact object are distinct. A record begins as a Lead. When a sales rep qualifies it and converts it, Salesforce automatically creates three linked records: a Contact, an Account (Company), and an Opportunity. The original Lead record is marked as converted.
Many companies skip the Lead object entirely and go straight to Contact + Account. This company used the Lead object fully — their sales process ran through Lead conversion as the formal qualification gate.
HubSpot does not have a Lead object. Every record — whether it is a Salesforce Lead or a converted Salesforce Contact — lives as a Contact in HubSpot. This creates an immediate question: how do you know, from within HubSpot, whether a given Contact is still a Lead in Salesforce or has already been converted?
The solution was a custom HubSpot property: CRM Record Type. This property was populated automatically via workflow based on which Salesforce ID was present on the synced record. If only a Salesforce Lead ID existed, the record was tagged as “Lead.” If a Salesforce Contact ID was present, it was tagged as “Contact” — indicating the lead had been converted in Salesforce.
This property became the foundation for segmentation, automation logic, and reporting inside HubSpot. Marketing workflows could now behave differently depending on whether they were addressing a prospect still in qualification or a converted contact already in an active deal.
The Sync Architecture
The most important decision in any two-way sync is establishing which system “wins” when both have data for the same field. Without clear rules, conflicts accumulate silently and the sync becomes unreliable.
The guiding principle here was straightforward: Salesforce owns everything the sales team touches. HubSpot owns everything marketing creates.
| Field Category | Preferred Source | Rationale |
|---|---|---|
| Lead owner / assignment | Salesforce | Lead assignment logic lived entirely in Salesforce — changing owner in HubSpot was disabled |
| Sales Stage | Salesforce | Sales-owned field — only editable from Salesforce, read-only in HubSpot |
| Lead Status | Salesforce | Sales activity tracking — source of truth remained with the sales team |
| Deal / Opportunity properties | Salesforce | Deal progression managed by sales in Salesforce |
| Marketing engagement data | HubSpot | Email opens, form fills, page views, lifecycle stage — all owned by HubSpot |
| Lifecycle stage | HubSpot | Driven by marketing automation and lead scoring |
| CRM Record Type | HubSpot | Custom property populated by HubSpot automation based on SF ID presence |
One additional constraint applied to picklist fields. Salesforce has an “inactive picklist value” feature that HubSpot does not support. Any picklist value marked inactive in Salesforce will be rejected by HubSpot during sync. All dropdown values across both systems were audited and aligned before the integration went live — no mid-flight corrections were needed after go-live.
The Governance Model
One of the most common failures in CRM migrations is that the new system immediately accumulates the same bad habits as the old one. Reps are asked to update too many fields. Fields get skipped. Data quality degrades within weeks.
The design here was intentionally minimal. On the Contact and Lead objects, the sales team was asked to manually update exactly two properties — both dropdowns with fixed values:
Everything else — lifecycle stage progression, CRM Record Type, marketing engagement data, routing logic — was handled entirely by automation. Sales reps were not asked to interpret or maintain anything outside of these two fields.
On the Deal object, sales updated additional properties to reflect deal progression, qualification details, and outcomes. But even there, the principle held: every property that could be automated was automated. Single-line text fields were kept to a minimum across both objects. Dropdowns were preferred because they constrain input, enable workflow logic, and produce clean reportable data.
Free-text fields produce inconsistent data. “Trying to connect,” “trying to reach,” “initial outreach” and “TTC” are all the same status — but they cannot be grouped in a report or used to trigger a workflow. Dropdowns enforce consistency at the point of entry, which means every downstream report, workflow, and sync rule works reliably without data cleaning.
HubSpot workflows were also set up to act as a governance layer — regularly checking whether records at a given Sales Stage had the expected Lead Status value set. Where they did not, an automated task or internal notification was created to prompt the rep to update. The system enforced its own hygiene without requiring manual audits.
The Exclusion Rule
Not every record belongs in both systems permanently. One of the most operationally useful decisions made during this migration was building a clean exit path for bad data identified by the sales team.
When a sales rep marked a lead as Disqualified in Salesforce, the record was tagged with a disqualification reason — Bad Data, Spam Lead, Test Lead, or Team/Internal Email. Once that tag was applied and synced to HubSpot, a specific set of rules activated:
This meant the two-way sync was not just a technical bridge — it was a self-cleaning data governance system. Bad data identified by sales in Salesforce automatically removed itself from HubSpot within a week. No manual list management. No periodic cleanup projects. The database stayed clean by design.
The Go-Live
With the Salesforce cleanup complete, picklist values aligned, inactive owners reassigned, and the HubSpot property architecture built and tested in the Salesforce sandbox environment, the go-live was planned for a weekend — deliberately outside business hours to eliminate any risk to active sales operations.
The Key Insight
“Most migration projects fail not because the integration is complex, but because the data going into it was never ready. Clean data migrates cleanly. Messy data migrates messily — and then you have two systems full of the same problems, connected by a live sync that propagates every inconsistency in real time.”
The technical work of connecting Salesforce to HubSpot is well-documented and relatively straightforward. What is not straightforward is the discipline to clean before you connect — to fix inactive owners, resolve duplicates, align picklist values, and settle the object model question before a single record moves.
What This Delivered
The technical integration is the easy part. The audit, the cleanup, and the sync architecture are where migrations succeed or fail. That is the work I do.
Book a free 20-min HubSpot teardown →Fixed scope. Fixed price. You will know exactly what needs to happen before committing to anything.