TL;DR
Most "Salesforce to HubSpot migration" content is written for whoever owns the CRM generally — field mapping, import limits, what the onboarding fee covers. That ground is real, and GenFlows already has a full breakdown of it in our HubSpot CRM migration checklist. This post is the layer on top of that: what's specific to teams running an active outbound motion — cold email and LinkedIn sequences through tools like Outreach, Salesloft, Smartlead, Instantly, or HeyReach — where the thing that breaks isn't the contact record. It's the attribution, the sequence history, and the object model your outbound reporting was quietly built on top of.
Sourcing note: every limit and quoted behavior below was checked against Salesforce's or HubSpot's own documentation, or a vendor's own integration listing, in September 2026, and is tagged VERIFIED where independently confirmed or (directional) in-text where it comes from a secondary source, a vendor-interested page, or a primary page we could not re-open to confirm exact wording. Two vendor admin-guide pages (Salesloft's HubSpot integration guide, one Salesforce Help article on lead conversion) render client-side and could not be independently re-verified — treat those claims as directional and confirm in your own portal before quoting them as fact.
A Salesforce-to-HubSpot migration for an outbound team has four places where the CRM swap breaks something specific to how outbound reporting works, none of which show up on a generic import checklist:
HubSpot syncs Salesforce Leads and Salesforce Contacts into the same place — the HubSpot Contact object — matched by email address, with field values populated per your sync direction and mappings.
That single fact causes a specific, documented breakage: Salesforce Leads carry company name as a plain text field, while Salesforce Contacts reference it through the related Account object. HubSpot's default mapping assumes one shape, so a HubSpot contact matched against a Salesforce Contact (rather than a Lead) can silently fail to populate company name unless the mapping is checked by hand.
The bigger structural issue is the conversion event itself. In Salesforce, converting a Lead creates an Account, a Contact, and optionally an Opportunity, and reattaches the Lead's activity history to those new records — with one notable exception per Salesforce's own help documentation (directional — the page renders client-side and we could not re-confirm exact wording; verify before quoting): activity that originated from a Sales Engagement cadence is not automatically carried over in that reattachment. HubSpot has no equivalent conversion object at all. There's no "this contact was a Lead until March, then converted" event to preserve, because HubSpot never modeled that distinction in the first place.
Practical fix: before migrating, add a custom HubSpot property — something like "Originally a Lead" (yes/no) and "Conversion Date" — and populate it from your Salesforce export. It won't recreate Salesforce's object model, but it preserves the one piece of that history outbound teams actually query against: how long a record sat as an unqualified lead before it became a real opportunity.
If your outbound motion attributes pipeline back to specific sequences — "this Opportunity was influenced by the Q3 Cold Email Campaign" — that model is almost certainly built on Salesforce's CampaignMember object: a junction record tracking each Lead or Contact's status (Sent, Responded, Opted Out) against a Campaign, rolled up into Campaign Influence on the Opportunity.
HubSpot's Campaign object is built around a different concept entirely — it groups marketing assets (emails, ads, landing pages) rather than tracking per-contact membership and status against a Deal. There is no native one-to-one landing spot for CampaignMember status data, a gap independently reported across multiple HubSpot Community threads from admins who hit it during their own migrations (directional — community-reported, not documented in HubSpot's own migration guides). The workaround some teams use is a Salesforce automation that writes CampaignMember status into a custom field before export, so it syncs as a regular property instead of relying on an object that doesn't exist on the other side.
This matters for a specific reason: multi-touch attribution doesn't recalculate itself in HubSpot from Salesforce history. If you want to keep it, treat Opportunities-with-Contact-Roles-and-Campaign-Influence as a static historical snapshot to export and archive before migration, not as data that will "just be there" after go-live. Going forward, you're choosing between rebuilding attribution inside HubSpot's own model — native multi-touch revenue attribution is gated to Marketing Hub Enterprise — or running it through custom properties and workflows. Our B2B revenue attribution models post covers how to pick between those models once you're on HubSpot; this is the note that the Salesforce version of that model doesn't survive the move.
Both Outreach and Salesloft shipped their Salesforce integrations first, and both are generally described — including by their own implementation partners — as the deeper, more mature version of the product. That matters during a migration because "does my SEP sync X to my CRM" doesn't have the same answer on both sides.
Outreach's own HubSpot Marketplace listing (its "Outreach Data Sync" app) documents bi-directional sync for Accounts↔Companies, Prospects↔Contacts, Opportunities↔Deals, Calls, Tasks, Outbox messages/Email Activities, and Custom Objects — with an explicit disclaimer: anything not listed as shared data is not part of the sync. Sequences themselves are not listed as a synced object type. One Outreach/HubSpot implementation partner describes the HubSpot-side integration as historically having "thinner custom-object support and slower release of new features" than the Salesforce side (directional — vendor-interested source; also appears to partially conflict with the current Marketplace listing, which does claim activity-level sync, so treat this as "scope has likely changed over time" rather than a fixed limitation).
Salesloft's HubSpot integration is documented, per its own marketplace and help content, as syncing Opportunities one-way from HubSpot into Salesloft and Activities one-way from Salesloft into HubSpot — without custom-field sync or the ability to trigger HubSpot workflows from Salesloft cadence events (directional — Salesloft's own admin guide renders client-side and could not be independently re-confirmed; verify current scope in your own Salesloft admin panel). Salesloft also publishes a migration guide for moving between its own two generations of HubSpot integration, which is itself worth knowing: "which version of the connector you're actually running" is a variable to check before you assume any documentation describes your setup.
Before migration weekend: open your SEP's current HubSpot-specific integration documentation — not a Salesforce migration guide, not a generic feature page — and confirm object-by-object what syncs, in which direction, and whether it's real-time or scheduled. Assuming parity with how it worked in Salesforce is the single most common planning mistake outbound teams make in this migration.
HubSpot's native Salesforce integration runs two separate sync mechanisms: a one-way Timeline Sync (HubSpot → Salesforce) covering form submissions, email sends/opens/clicks, meetings, calls, notes, and tasks, logged into Salesforce as Tasks; and a two-way Activity Sync covering Tasks, Sales emails, Calls, and Meetings. Both are documented directly on HubSpot's knowledge base.
The limitation that matters for a migration specifically: sync is prospective, not retroactive. Marketing email events only sync if they occurred within 30 days of the contact being synced; form submissions only within a year. Years of historical cold-email opens, clicks, and replies logged in Salesforce will not backfill into HubSpot through the native connector — that requires a separate bulk import, planned and executed on its own. Emails logged through Salesforce's Einstein Activity Capture don't sync to HubSpot at all, under any timeframe.
Sequence and cadence enrollment history — "this contact was enrolled in Sequence Y, currently on Step 3" — is a different problem entirely, because it was never stored as a native object in Salesforce or HubSpot to begin with. It lives inside Outreach or Salesloft's own database. Whatever made it into Salesforce did so only as whatever Task or Activity records the SEP chose to write back — which means migrating your CRM does not migrate this data by itself. If you want to keep it, pull it from the SEP's own reporting or export tools, on its own timeline, independent of the CRM cutover.
A few Salesforce data-retention mechanics are easy to miss because they only matter to teams that report on when something changed, not just what its current value is — which describes most outbound reporting (time-to-first-reply, days-in-sequence, stage-velocity by campaign).
Layered on top of the generic import process, this is the outbound-specific work, roughly in order:
| Salesforce concept | HubSpot equivalent | What's lost or must be rebuilt |
|---|---|---|
| Lead (separate object) | Contact (unified object) | Lead/Contact distinction; rebuild via Lifecycle Stage + a custom "originally a Lead" property. |
| Lead conversion event | No native equivalent | No conversion audit trail; add a custom "Conversion Date" property before import. |
| Opportunity | Deal | Maps cleanly via native/SEP connectors; deal-stage history itself does not backfill (see our migration checklist). |
| Campaign + CampaignMember status | Campaign (asset-centric) | Per-member status tracking; rebuild via custom properties, lists, or a pre-migration export. |
| Campaign Influence (multi-touch attribution) | Marketing Hub Enterprise attribution (different model) | Historical influence records don't transfer; attribution logic must be rebuilt, not ported. |
| Field History / Field Audit Trail | Limited property history | Long-tail change history (past 18 months) likely lost unless separately exported first. |
| SEP Sequence/Cadence history | No native object in either CRM | Lives only in Outreach/Salesloft; pull it from the SEP directly, not from either CRM. |
Once you're through the migration itself, the ongoing question is which CRM actually fits an outbound motion day to day — our CRM comparison for B2B outbound and Close vs. HubSpot posts cover that decision, and HubSpot deal stages for outbound teams covers how to structure the pipeline you land in. If your outbound tools are already pushing data into HubSpot post-migration, syncing cold email and LinkedIn data into HubSpot covers that layer directly.
No. HubSpot uses a single unified Contact object — Salesforce Leads and Salesforce Contacts both sync into HubSpot as Contacts, matched by email address. There's no native "Lead" record type to preserve that distinction after migration; teams that need it typically rebuild it as a custom property.
It isn't natively preserved. Salesforce's conversion process reattaches most activity history to the resulting Account, Contact, and Opportunity records, but HubSpot has no equivalent "conversion event" object to receive it. Most teams add a custom property before migration — something like a conversion date or an "originally a Lead" flag — to keep at least the fact and timing of the conversion.
Not natively. Salesforce's CampaignMember object tracks per-contact membership status against a Campaign and rolls that into Opportunity-level influence; HubSpot's Campaign object is asset-centric, not membership-and-status-centric, and has no built-in equivalent. This attribution layer generally has to be exported as a historical snapshot before migration and rebuilt in HubSpot's own attribution model afterward, not migrated as-is.
Not necessarily to the same depth. Both platforms were built Salesforce-first, and their Salesforce integrations are generally the deepest, most mature version of the product. Outreach's HubSpot app currently syncs Accounts, Prospects, Opportunities, Calls, Tasks, Email Activities, and Custom Objects, but explicitly states that anything not listed as shared data doesn't sync — Sequences aren't listed. Confirm current scope directly against each vendor's HubSpot-specific documentation rather than assuming parity with your Salesforce setup.
Not directly, because that history was never stored in Salesforce to begin with — it lives inside Outreach or Salesloft's own database. What made it into Salesforce is only whatever Task or Activity records the SEP chose to write back. A CRM migration doesn't touch this data either way; you need to export it separately from the SEP itself.
Four things: the Lead/Contact conversion history and distinction, since HubSpot has no Lead object; Campaign Influence and CampaignMember status used to attribute outbound touches to pipeline, since HubSpot's Campaign model is structurally different; historical engagement data, since native Salesforce activity sync is prospective-only and Einstein Activity Capture emails don't sync at all; and any Salesforce formula-field logic used in outbound reporting, since formula fields export only as static snapshots rather than live calculations.
If your outbound motion is moving CRMs, the data you're most likely to lose isn't the contact record — it's the attribution and history built around it. Read our HubSpot CRM migration checklist for the mechanics of the import itself, or talk to our team about migrating an active cold email and LinkedIn outbound motion into HubSpot without losing the reporting you already depend on.
By the GenFlows GTM engineering team. We run cold email, LinkedIn outreach, and RevOps/HubSpot builds for B2B teams. Last updated September 2026.