Salesforce to HubSpot, before you commit to it.
Portablov connects read-only to both platforms and tells you what would move, what would break, who actually needs a seat, and what has no HubSpot equivalent at all — with the exact people and records behind every number. The assessment is free, and plenty of them end in a decision to stay.
What an assessment produces
A worked example, in full.
This is Portablov’s own output over a 2,840-user Salesforce estate — 4,327,906 records, 309 fields and 96 automations. Every figure is computed by the same engine that would run against yours.
Synthetic demo estate — not a real customer
- Licence spend avoided
$824,940/yr
$1,835,880 for the recommended seats against $2,660,820 for a seat-for-seat move.
- Users who should move
1,933 of 2,840
528 are dormant, deactivated or hold a licence with no equivalent. 379 need a human call.
- Fields with no destination
65
Of 309 mapped fields. 75 more are recommended to leave behind; 122 are barely populated today.
- Blockers before you can move
3
Each one names the exact people, records or fields it affects, and the consequence.
- Automations to redesign
45 of 96
No destination equivalent. Each one is a decision: rebuild, replace or retire.
- Records owned by people not moving
188,084
Owned by 528 excluded users. The destination requires an owner, so these are rejected on load until reassigned.
Licence and user implications
You are about to buy 2,840 seats. You need 1,933.
A seat-for-seat move of this estate costs $2,660,820 a year. The recommended set costs $1,835,880 — $824,940 that never needed buying.
- Recommended to migrate
- 1,933
- Require review
- 379
- Recommended to exclude
- 528
- Dormant past the threshold
- 737
- Already inactive in Salesforce
- 224
- Never logged in
- 89
528 of 2,840 source logins are inactive, dormant past the abandonment threshold, or hold a licence type with no destination equivalent. Each carries the signals behind the call.
What typically needs review
42 failures, 74 warnings.
Each names the object, field, user or automation it concerns, how many records it affects, and whether Portablov can fix it or a person has to decide.
- Fields with no HubSpot target
- 65
- Fields recommended to leave behind
- 75
- Fields populated on under half your records
- 122
- Automations with no equivalent
- 45
- Automations that carry over
- 51
- Permission-set combinations in use
- 176
Fill rate is measured per field across the discovered records; 122 of 309 fields are populated on fewer than 50% of them. 45 of 96 automations have no destination equivalent under the destination connector's declared capabilities; 13 is already switched off in the source.
What can fail
3 things would stop this cutover today.
A blocker is not a warning. It is a specific reason the load would be rejected, or a consequence you would not want to discover on the day — each one tied to named people or a record count, with the decision it needs.
379 users still need a migrate decisionYour call
- Why it breaks
- Portablov will not provision or exclude a seat on evidence alone. Each of these people has signals pointing both ways — recent activity against a licence with no clean equivalent, or ownership that would be stranded by excluding them.
- Who or what is affected
- aiden.rossi@acme-industrial.com, evelyn.vogel@acme-industrial.com and 377 more users
- How many
- 379 users
- Can Portablov fix it automatically?
- No. It needs a business decision Portablov will not make for you.
- What you need to decide
- Open each user, read the evidence, and approve or override the recommendation. Licence savings recalculate as you go.
188,084 records are owned by users who are not migratingYour call
- Why it breaks
- The destination requires an owner on companies, contacts, deals, tickets and tasks. A record whose owner has no seat is rejected on load rather than arriving unowned.
- Who or what is affected
- nadia.costa@acme-industrial.com, raj.mwangi@acme-industrial.com and 526 more excluded owners
- How many
- 188,084 records
- Can Portablov fix it automatically?
- No. It needs a business decision Portablov will not make for you.
- What you need to decide
- Nominate who inherits each excluded owner’s records — a named person, a team fallback, or a holding seat you are willing to pay for.
1,933 people will receive a HubSpot onboarding emailYour call
- Why it breaks
- The destination user-provisioning API sends an onboarding email and exposes no documented parameter to suppress it. If seats are created before you are ready to announce the change, your entire go-live communications plan is pre-empted by an automated email.
- Who or what is affected
- evelyn.kim@acme-industrial.com, elijah.dubois@acme-industrial.com and 1,931 more users
- How many
- 1,933 users
- Can Portablov fix it automatically?
- No. It needs a business decision Portablov will not make for you.
- What you need to decide
- Agree the communications window, then approve provisioning inside it.
Object and field mapping
Where each Salesforce object lands in HubSpot.
The two platforms do not share a data model. Some objects have a clean twin, some are reshaped on the way, and one of the busiest — Lead — does not exist in HubSpot at all. Below is the field-level detail for each, drawn from the same mapping engine the product runs.
Objects with no HubSpot equivalent at all — Salesforce Contract is the usual one — are reported as such rather than quietly mapped onto something that nearly fits. Campaign maps only partially: hierarchy, member status history and ROI rollups have nowhere to go.
Salesforce Account → HubSpot Company
Does a Salesforce Account become a HubSpot Company? Direct equivalent. Account hierarchy maps to HubSpot parent/child company associations.
Accountcompanies
Direct equivalent · exact confidence- Salesforce Account
- The organisation record in Salesforce. Carries billing and shipping addresses, a record type, an owner, a parent-account hierarchy, and — in most real orgs — a long tail of custom fields for territory, tier and renewal.
- HubSpot Company
- The company record in HubSpot. Addresses are a single flat set of properties, hierarchy is expressed as parent/child company associations, and there is no record-type concept at all.
- Transfer directly
- 32 / 60
- Transformed on the way
- 8 / 60
- Lose fidelity
- 0 / 60
- No equivalent
- 7 / 60
Field by field
Every field Portablov discovered on this object, grouped by what happens to it. “Populated” is the share of records where the source field actually has a value — the number that decides whether a gap matters.
Transfers directly
32 fieldsA destination property of a compatible type exists. The value arrives unchanged.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Account Namestring(255) | name | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Annual Revenuecurrency(18,0) | annualrevenue | Type-compatible property in the destination; the value is copied as-is. | 41% |
| Employeesint | numberofemployees | Type-compatible property in the destination; the value is copied as-is. | 52% |
| Phonephone | phone | Type-compatible property in the destination; the value is copied as-is. | 81% |
| Websiteurl | website | Type-compatible property in the destination; the value is copied as-is. | 69% |
| Billing Streettextarea | address | Type-compatible property in the destination; the value is copied as-is. | 78% |
| Billing Citystring(40) | city | Type-compatible property in the destination; the value is copied as-is. | 79% |
| Billing State/Provincestring(80) | state | Type-compatible property in the destination; the value is copied as-is. | 71% |
| Billing Zip/Postal Codestring(20) | zip | Type-compatible property in the destination; the value is copied as-is. | 76% |
| Billing Countrystring(80) | country | Type-compatible property in the destination; the value is copied as-is. | 80% |
| Created Datedatetime | createdate | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Territory Codestring(12) | territory_code | Type-compatible property in the destination; the value is copied as-is. | 66% |
| Renewal Datedate | renewal_date | Type-compatible property in the destination; the value is copied as-is. | 38% |
| Territory Codestring | territory_code | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Industry Segmentpicklist | industry_segment | Type-compatible property in the destination; the value is copied as-is. | 62% |
| Contract Valuecurrency | contract_value | Type-compatible property in the destination; the value is copied as-is. | 86% |
| Renewal Monthpicklist | renewal_month | Type-compatible property in the destination; the value is copied as-is. | 58% |
| Primary Regionpicklist | primary_region | Type-compatible property in the destination; the value is copied as-is. | 61% |
| Support Planpicklist | support_plan | Type-compatible property in the destination; the value is copied as-is. | 81% |
| Last QBR Datedate | last_qbr_date | Type-compatible property in the destination; the value is copied as-is. | 63% |
| Preferred Languagepicklist | preferred_language | Type-compatible property in the destination; the value is copied as-is. | 93% |
| Lifecycle Stage Detailpicklist | lifecycle_stage_detail | Type-compatible property in the destination; the value is copied as-is. | 90% |
| Annual Seat Countint | annual_seat_count | Type-compatible property in the destination; the value is copied as-is. | 73% |
| Payment Termspicklist | payment_terms | Type-compatible property in the destination; the value is copied as-is. | 87% |
| Churn Risk Flagboolean | churn_risk_flag | Type-compatible property in the destination; the value is copied as-is. | 90% |
| Signed Datedate | signed_date | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Billing Frequencypicklist | billing_frequency | Type-compatible property in the destination; the value is copied as-is. | 58% |
| Competitor Displacedstring | competitor_displaced | Type-compatible property in the destination; the value is copied as-is. | 59% |
| Procurement Contactstring | procurement_contact | Type-compatible property in the destination; the value is copied as-is. | 84% |
| Discount Bandpicklist | discount_band | Type-compatible property in the destination; the value is copied as-is. | 77% |
| Source Campaign Namestring | source_campaign_name | Type-compatible property in the destination; the value is copied as-is. | 85% |
| Product Familypicklist | product_family | Type-compatible property in the destination; the value is copied as-is. | 81% |
Transfers with a transformation
8 fieldsThe value arrives, but a named, deterministic transform runs on the way — a value map, a lookup, a type conversion. Nothing here is invented at load time.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Account IDid | none | Written to a dedicated unique salesforce_id property so every load is idempotent and re-runnable. | 100% |
| Account Typepicklist | type | Map Salesforce account types onto HubSpot company types. | 87% |
| Industrypicklist | industry | HubSpot’s industry list is a fixed enumeration and cannot be extended. | 74% |
| Owner IDreference | hubspot_owner_id | Records owned by users excluded from the migration have no destination owner. | 100% |
| Parent Accountreference | hs_parent_company_id | Resolve the parent account via its migrated salesforce_id. | 19% |
| Health Scoreformula(number) | health_score | Formula fields cannot be recreated in HubSpot; the value freezes at cutover. | 93% |
| Health Scoredouble | health_score | Formula fields cannot be recreated in HubSpot; the value freezes at cutover. | 66% |
| Pricing Waterfall Statetextarea | state | Type-compatible property in the destination; the value is copied as-is. | 32% |
No destination equivalent
7 fieldsThe destination has nowhere to put this. Options are a custom property, a different model, or accepting the loss — but it will not happen by itself.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Record Type IDreference | none | HubSpot has no record types. Record-type-driven page layouts, picklist filtering and permissions must be rebuilt as teams, pipelines or property options. | 100% |
| Strategic Tierpicklist | none | No destination property matches this field. | 22% |
| Territory Assignment Matrixtextarea | none | No destination property matches this field. | 41% |
| Commission Split (JSON)textarea | none | No destination property matches this field. | 24% |
| Approval Chain Overridetextarea | none | No destination property matches this field. | 21% |
| Forecast Override Reasontextarea | none | No destination property matches this field. | 46% |
| Multi-Currency Rate Lockdouble | none | No destination property matches this field. | 31% |
Recommended to leave behind
13 fieldsPortablov suggests not carrying these across — barely populated, referenced by nothing, or set by the destination itself and unwritable.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Last Modified Datedatetime | hs_lastmodifieddate | hs_lastmodifieddate is set by HubSpot and cannot be written. | 100% |
| Legacy ERP Idstring(30) | none | Only 11% populated and referenced by no active automation — recommended for exclusion. | 11% |
| Deprecated Stage 2015string | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Old Category 2016picklist | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Migration Source 2018double | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Legacy Stage 2018boolean | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Deprecated Status 2016string | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Legacy Ref 2021double | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Legacy Region 2015double | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Legacy Category 2019string | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Migration Group 2016picklist | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Temp Stage 2014string | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Backup Score 2016date | none | Populated on only 1% of records — recommended for exclusion. | 1% |
What each gap costs
A mapping gap is only worth arguing about once you know how many records it touches. These are the issues Portablov raised on this object, with the count behind each.
- high148,209 records affected
Account.Record Type ID cannot be migrated
HubSpot has no record types. Record-type-driven page layouts, picklist filtering and permissions must be rebuilt as teams, pipelines or property options.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium32,606 records affected
Account.Strategic Tier cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium60,766 records affected
Account.Territory Assignment Matrix cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium35,570 records affected
Account.Commission Split (JSON) cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium31,124 records affected
Account.Approval Chain Override cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium68,176 records affected
Account.Forecast Override Reason cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium45,945 records affected
Account.Multi-Currency Rate Lock cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- low128,942 records affected
Account.Account Type needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
- low109,675 records affected
Account.Industry needs a value map
HubSpot’s industry list is a fixed enumeration and cannot be extended.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
What a person has to decide
- 1
Where does record-type behaviour go? HubSpot has no record types, so anything a record type currently drives — page layouts, filtered picklists, permissions — has to be rebuilt as teams, pipelines or property options, or dropped.
- 2
Which industry values survive? HubSpot’s industry list is a fixed enumeration that cannot be extended, so any source value outside it needs a target or a custom property.
- 3
Who inherits accounts owned by people who are not moving? The destination requires an owner on every company.
Synthetic demo estate These figures come from a full Portablov run over a fabricated Salesforce estate. How a specific field behaves depends on how your org is configured — Portablov reads your actual schema, fill rates and record counts rather than assuming this one.
Salesforce Contact → HubSpot Contact
Does a Salesforce Contact become a HubSpot Contact? Direct equivalent. HubSpot requires a unique email per contact; Salesforce does not.
Contactcontacts
Direct equivalent · exact confidence- Salesforce Contact
- A person, related to exactly one Account, optionally reporting to another Contact. Email is not required and is not unique.
- HubSpot Contact
- A person, associated to zero or more companies. Email is the primary key: HubSpot enforces one contact per email address.
- Transfer directly
- 27 / 61
- Transformed on the way
- 6 / 61
- Lose fidelity
- 2 / 61
- No equivalent
- 11 / 61
Field by field
Every field Portablov discovered on this object, grouped by what happens to it. “Populated” is the share of records where the source field actually has a value — the number that decides whether a gap matters.
Transfers directly
27 fieldsA destination property of a compatible type exists. The value arrives unchanged.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| First Namestring(40) | firstname | Type-compatible property in the destination; the value is copied as-is. | 96% |
| Last Namestring(80) | lastname | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Emailemail | HubSpot enforces a unique email per contact. Salesforce contacts sharing an email will collide. | 88% | |
| Business Phonephone | phone | Type-compatible property in the destination; the value is copied as-is. | 62% |
| Mobile Phonephone | mobilephone | Type-compatible property in the destination; the value is copied as-is. | 44% |
| Titlestring(128) | jobtitle | Type-compatible property in the destination; the value is copied as-is. | 71% |
| Email Opt Outboolean | hs_email_optout | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Created Datedatetime | createdate | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Engagement Scorenumber(3,0) | engagement_score | Type-compatible property in the destination; the value is copied as-is. | 72% |
| GDPR Consent Datedatetime | gdpr_consent_date | Type-compatible property in the destination; the value is copied as-is. | 55% |
| Customer Tierpicklist | customer_tier | Type-compatible property in the destination; the value is copied as-is. | 84% |
| Industry Segmentpicklist | industry_segment | Type-compatible property in the destination; the value is copied as-is. | 81% |
| Account Manager Emailemail | account_manager_email | Type-compatible property in the destination; the value is copied as-is. | 87% |
| Renewal Monthpicklist | renewal_month | Type-compatible property in the destination; the value is copied as-is. | 84% |
| Onboarding Completeboolean | onboarding_complete | Type-compatible property in the destination; the value is copied as-is. | 80% |
| Partner Sourcedboolean | partner_sourced | Type-compatible property in the destination; the value is copied as-is. | 74% |
| Expansion Potentialpicklist | expansion_potential | Type-compatible property in the destination; the value is copied as-is. | 79% |
| Health Scoredouble | health_score | Type-compatible property in the destination; the value is copied as-is. | 82% |
| Primary Use Casepicklist | primary_use_case | Type-compatible property in the destination; the value is copied as-is. | 58% |
| Billing Frequencypicklist | billing_frequency | Type-compatible property in the destination; the value is copied as-is. | 83% |
| Competitor Displacedstring | competitor_displaced | Type-compatible property in the destination; the value is copied as-is. | 75% |
| Deployment Modelpicklist | deployment_model | Type-compatible property in the destination; the value is copied as-is. | 68% |
| Reference Customerboolean | reference_customer | Type-compatible property in the destination; the value is copied as-is. | 73% |
| Named Accountboolean | named_account | Type-compatible property in the destination; the value is copied as-is. | 85% |
| Security Review Datedate | security_review_date | Type-compatible property in the destination; the value is copied as-is. | 82% |
| Source Campaign Namestring | source_campaign_name | Type-compatible property in the destination; the value is copied as-is. | 75% |
| Product Familypicklist | product_family | Type-compatible property in the destination; the value is copied as-is. | 93% |
Transfers with a transformation
6 fieldsThe value arrives, but a named, deterministic transform runs on the way — a value map, a lookup, a type conversion. Nothing here is invented at load time.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Contact IDid | none | Written to a dedicated unique salesforce_id property so every load is idempotent and re-runnable. | 100% |
| Account IDreference | associatedcompanyid | Resolve the migrated company by its salesforce_id property. | 94% |
| Owner IDreference | hubspot_owner_id | Resolve owner by email. | 100% |
| Mailing Citystring(40) | city | Type-compatible property in the destination; the value is copied as-is. | 57% |
| Mailing Countrystring(80) | country | Type-compatible property in the destination; the value is copied as-is. | 60% |
| Personapicklist | persona | Normalise picklist labels to HubSpot internal option values. | 49% |
Transfers with a loss of fidelity
2 fieldsThe record still arrives, but something about it does not survive the conversion. Each one is a call about whether the reduced version is good enough.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Lead Sourcepicklist | hs_lead_status | Lead source and lead status are different concepts. Mapping loses original acquisition channel unless a custom property is created. | 66% |
| Descriptiontextarea(32000) | hs_content_membership_notes | Salesforce allows 32,000 characters; long descriptions are preserved but the destination property is not a first-class notes field. | 28% |
No destination equivalent
11 fieldsThe destination has nowhere to put this. Options are a custom property, a different model, or accepting the loss — but it will not happen by itself.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Departmentstring(80) | none | No destination property matches this field. | 34% |
| Reports Toreference | none | HubSpot has no contact-to-contact hierarchy. Reporting lines are lost. | 12% |
| Do Not Callboolean | none | HubSpot has no native Do Not Call flag; requires a custom property plus a workflow to enforce it. Regulatory relevance — do not silently drop. | 100% |
| Entitlement Milestone Statetextarea | none | No destination property matches this field. | 15% |
| Revenue Schedule Detailtextarea | none | No destination property matches this field. | 36% |
| Multi-Currency Rate Lockdouble | none | No destination property matches this field. | 15% |
| Legal Clause Matrixtextarea | none | No destination property matches this field. | 45% |
| Rolled-up Child ARRcurrency | none | No destination property matches this field. | 20% |
| Quota Credit Allocationtextarea | none | No destination property matches this field. | 22% |
| Regulatory Flagsmultipicklist | none | No destination property matches this field. | 23% |
| Audit Trail Digesttextarea | none | No destination property matches this field. | 40% |
Recommended to leave behind
15 fieldsPortablov suggests not carrying these across — barely populated, referenced by nothing, or set by the destination itself and unwritable.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Preferred Languagepicklist | none | No destination property. Create one during preparation if localisation matters. | 31% |
| Interim Category 2021double | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Interim Group 2014date | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Migration Region 2018string | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Migration Region 2014string | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Backup Region 2018double | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Old Bucket 2015picklist | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Migration Source 2021double | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Temp Ref 2021double | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Deprecated Rating 2018picklist | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Temp Source 2015double | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Legacy Stage 2016double | none | Populated on only 0% of records — recommended for exclusion. | 0% |
| Interim Ref 2017boolean | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Old Stage 2017picklist | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Legacy Code 2014string | none | Populated on only 0% of records — recommended for exclusion. | 0% |
What each gap costs
A mapping gap is only worth arguing about once you know how many records it touches. These are the issues Portablov raised on this object, with the count behind each.
- high612,884 records affected
Contact.Do Not Call cannot be migrated
HubSpot has no native Do Not Call flag; requires a custom property plus a workflow to enforce it. Regulatory relevance — do not silently drop.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium208,381 records affected
Contact.Department cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium73,546 records affected
Contact.Reports To cannot be migrated
HubSpot has no contact-to-contact hierarchy. Reporting lines are lost.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium404,503 records affected
Contact.Lead Source loses information
Lead source and lead status are different concepts. Mapping loses original acquisition channel unless a custom property is created.
Portablov recommends: Confirm the reduced fidelity is acceptable, or add a custom property.
- medium171,608 records affected
Contact.Description loses information
Salesforce allows 32,000 characters; long descriptions are preserved but the destination property is not a first-class notes field.
Portablov recommends: Confirm the reduced fidelity is acceptable, or add a custom property.
- medium91,933 records affected
Contact.Entitlement Milestone State cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium220,638 records affected
Contact.Revenue Schedule Detail cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium91,933 records affected
Contact.Multi-Currency Rate Lock cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium275,798 records affected
Contact.Legal Clause Matrix cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium122,577 records affected
Contact.Rolled-up Child ARR cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium134,834 records affected
Contact.Quota Credit Allocation cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium140,963 records affected
Contact.Regulatory Flags cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium245,154 records affected
Contact.Audit Trail Digest cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- low300,313 records affected
Contact.Persona needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
What a person has to decide
- 1
What happens to contacts that share an email address? HubSpot will merge or reject them — you decide which record wins before the load, not after.
- 2
Is Do Not Call a compliance obligation for you? HubSpot has no native flag, so it needs a custom property plus a workflow to enforce it. This is the field most often dropped silently, and it is the one with regulatory weight.
- 3
Do reporting lines matter? Contact-to-contact hierarchy has no HubSpot equivalent and is lost unless modelled another way.
Synthetic demo estate These figures come from a full Portablov run over a fabricated Salesforce estate. How a specific field behaves depends on how your org is configured — Portablov reads your actual schema, fill rates and record counts rather than assuming this one.
Salesforce Lead → HubSpot Contact
What happens to Salesforce Leads in HubSpot? HubSpot has no Lead object. Leads become Contacts with lifecyclestage=lead and the Salesforce Company name written to an associated company. Converted leads must be de-duplicated against their converted Contact or you will create doubles.
Leadcontacts
Equivalent, with transformation · medium confidence- Salesforce Lead
- A pre-qualification record holding a person and an unverified company name in one row, with its own status and rating, which is later converted into an Account, a Contact and optionally an Opportunity.
- HubSpot Contact
- HubSpot has no Lead object. The equivalent is a Contact whose lifecycle stage is `lead`, with the company name resolved into an associated Company record.
- Transfer directly
- 7 / 31
- Transformed on the way
- 5 / 31
- Lose fidelity
- 1 / 31
- No equivalent
- 3 / 31
Field by field
Every field Portablov discovered on this object, grouped by what happens to it. “Populated” is the share of records where the source field actually has a value — the number that decides whether a gap matters.
Transfers directly
7 fieldsA destination property of a compatible type exists. The value arrives unchanged.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| First Namestring(40) | firstname | Type-compatible property in the destination; the value is copied as-is. | 92% |
| Last Namestring(80) | lastname | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Emailemail | Leads and Contacts both become HubSpot contacts; shared emails will merge records. | 84% | |
| Phonephone | phone | Type-compatible property in the destination; the value is copied as-is. | 51% |
| Territory Codestring | territory_code | Type-compatible property in the destination; the value is copied as-is. | 79% |
| Onboarding Completeboolean | onboarding_complete | Type-compatible property in the destination; the value is copied as-is. | 81% |
| Lifecycle Stage Detailpicklist | lifecycle_stage_detail | Type-compatible property in the destination; the value is copied as-is. | 93% |
Transfers with a transformation
5 fieldsThe value arrives, but a named, deterministic transform runs on the way — a value map, a lookup, a type conversion. Nothing here is invented at load time.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Lead IDid | none | Written to a dedicated unique salesforce_id property so every load is idempotent and re-runnable. | 100% |
| Companystring(255) | none | Becomes an associated company, created if it does not exist. Expect new company records for unconverted leads. | 100% |
| Lead Statuspicklist | hs_lead_status | Map lead status values. | 100% |
| Convertedboolean | lifecyclestage | Derive lifecycle stage from conversion state. | 100% |
| Owner IDreference | hubspot_owner_id | Resolve owner by email. | 100% |
Transfers with a loss of fidelity
1 fieldsThe record still arrives, but something about it does not survive the conversion. Each one is a call about whether the reduced version is good enough.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Lead Scorenumber(3,0) | engagement_score | Salesforce lead score and HubSpot engagement score are computed differently; the number is not comparable after migration. | 68% |
No destination equivalent
3 fieldsThe destination has nowhere to put this. Options are a custom property, a different model, or accepting the loss — but it will not happen by itself.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Commission Split (JSON)textarea | none | No destination property matches this field. | 12% |
| Forecast Override Reasontextarea | none | No destination property matches this field. | 42% |
| Legal Clause Matrixtextarea | none | No destination property matches this field. | 30% |
Recommended to leave behind
15 fieldsPortablov suggests not carrying these across — barely populated, referenced by nothing, or set by the destination itself and unwritable.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Ratingpicklist | none | Hot/Warm/Cold has no destination equivalent; HubSpot uses lead scoring instead. | 43% |
| Lead Sourcepicklist | none | Original acquisition channel has no destination property unless one is created. | 79% |
| Converted Account IDreference | none | Conversion links are resolved during the association pass rather than copied as properties. | 21% |
| Converted Contact IDreference | none | Conversion links are resolved during the association pass rather than copied as properties. | 21% |
| Converted Opportunity IDreference | none | Conversion links are resolved during the association pass rather than copied as properties. | 14% |
| MQL Datedatetime | none | HubSpot tracks lifecycle stage transition timestamps natively once the record is in the destination. | 36% |
| Migration Tier 2020boolean | none | Populated on only 0% of records — recommended for exclusion. | 0% |
| Migration Code 2016boolean | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Temp Source 2018string | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Interim Flag 2015picklist | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Interim Category 2015picklist | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Deprecated Rating 2020double | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Migration Score 2021picklist | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Migration Segment 2020string | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Legacy Stage 2016string | none | Populated on only 1% of records — recommended for exclusion. | 1% |
What each gap costs
A mapping gap is only worth arguing about once you know how many records it touches. These are the issues Portablov raised on this object, with the count behind each.
- medium478,948 records affected
Lead.Lead Score loses information
Salesforce lead score and HubSpot engagement score are computed differently; the number is not comparable after migration.
Portablov recommends: Confirm the reduced fidelity is acceptable, or add a custom property.
- medium84,520 records affected
Lead.Commission Split (JSON) cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium295,821 records affected
Lead.Forecast Override Reason cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium211,301 records affected
Lead.Legal Clause Matrix cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- low704,336 records affected
Lead.Lead Status needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
- low704,336 records affected
Lead.Converted needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
What a person has to decide
- 1
How are converted leads de-duplicated against the Contact they converted into? Both sides become HubSpot contacts, so without a de-duplication rule you create doubles.
- 2
Should unconverted leads create Company records? Every distinct company name on a lead becomes a company in HubSpot unless you decide otherwise — that is typically where an unexpected company count comes from.
- 3
Is lead source worth a custom property? HubSpot tracks lead *status*, not acquisition channel, so the original source is lost unless a property is created for it.
Synthetic demo estate These figures come from a full Portablov run over a fabricated Salesforce estate. How a specific field behaves depends on how your org is configured — Portablov reads your actual schema, fill rates and record counts rather than assuming this one.
Salesforce Opportunity → HubSpot Deal
Does a Salesforce Opportunity become a HubSpot Deal? Stages must be mapped into a specific HubSpot pipeline; a stage name alone has no meaning in HubSpot.
Opportunitydeals
Equivalent, with transformation · high confidence- Salesforce Opportunity
- A revenue record with an amount, a close date, a stage from a global picklist, a per-record win probability and a forecast category.
- HubSpot Deal
- A deal inside a specific pipeline. Stages belong to a pipeline rather than existing globally, and probability is derived from the stage rather than set per record.
- Transfer directly
- 24 / 57
- Transformed on the way
- 6 / 57
- Lose fidelity
- 2 / 57
- No equivalent
- 9 / 57
Field by field
Every field Portablov discovered on this object, grouped by what happens to it. “Populated” is the share of records where the source field actually has a value — the number that decides whether a gap matters.
Transfers directly
24 fieldsA destination property of a compatible type exists. The value arrives unchanged.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Opportunity Namestring(120) | dealname | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Amountcurrency(18,2) | amount | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Currencypicklist | deal_currency_code | Multi-currency requires the destination portal to have those currencies enabled with exchange rates configured. | 100% |
| Close Datedate | closedate | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Next Stepstring(255) | hs_next_step | Type-compatible property in the destination; the value is copied as-is. | 46% |
| Descriptiontextarea(32000) | description | Type-compatible property in the destination; the value is copied as-is. | 39% |
| Created Datedatetime | createdate | Type-compatible property in the destination; the value is copied as-is. | 100% |
| Discount %percent | discount_pct | Type-compatible property in the destination; the value is copied as-is. | 58% |
| Contract Term (Months)number(3,0) | contract_term_months | Type-compatible property in the destination; the value is copied as-is. | 72% |
| Territory Codestring | territory_code | Type-compatible property in the destination; the value is copied as-is. | 73% |
| Customer Tierpicklist | customer_tier | Type-compatible property in the destination; the value is copied as-is. | 60% |
| Account Manager Emailemail | account_manager_email | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Preferred Languagepicklist | preferred_language | Type-compatible property in the destination; the value is copied as-is. | 63% |
| Annual Seat Countint | annual_seat_count | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Payment Termspicklist | payment_terms | Type-compatible property in the destination; the value is copied as-is. | 81% |
| Partner Sourcedboolean | partner_sourced | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Expansion Potentialpicklist | expansion_potential | Type-compatible property in the destination; the value is copied as-is. | 59% |
| Primary Use Casepicklist | primary_use_case | Type-compatible property in the destination; the value is copied as-is. | 81% |
| Billing Frequencypicklist | billing_frequency | Type-compatible property in the destination; the value is copied as-is. | 61% |
| Competitor Displacedstring | competitor_displaced | Type-compatible property in the destination; the value is copied as-is. | 64% |
| Deployment Modelpicklist | deployment_model | Type-compatible property in the destination; the value is copied as-is. | 65% |
| Procurement Contactstring | procurement_contact | Type-compatible property in the destination; the value is copied as-is. | 85% |
| Discount Bandpicklist | discount_band | Type-compatible property in the destination; the value is copied as-is. | 66% |
| Product Familypicklist | product_family | Type-compatible property in the destination; the value is copied as-is. | 84% |
Transfers with a transformation
6 fieldsThe value arrives, but a named, deterministic transform runs on the way — a value map, a lookup, a type conversion. Nothing here is invented at load time.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Opportunity IDid | none | Written to a dedicated unique salesforce_id property so every load is idempotent and re-runnable. | 100% |
| Account IDreference | none | Destination property "associatedcompanyid" does not exist in the target portal and will be created during preparation. | 98% |
| Stagepicklist | dealstage | Deal stages are pipeline-scoped in HubSpot. Confirm the target pipeline before cutover or every deal lands in the default pipeline. | 100% |
| Forecast Categorypicklist | hs_forecast_category | Uppercase to HubSpot enumeration values. | 100% |
| Owner IDreference | hubspot_owner_id | Resolve owner by email. | 100% |
| ARRformula(currency) | arr | Formula field is frozen at cutover and will not recalculate in HubSpot. | 91% |
Transfers with a loss of fidelity
2 fieldsThe record still arrives, but something about it does not survive the conversion. Each one is a call about whether the reduced version is good enough.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Probability (%)percent | hs_deal_stage_probability | HubSpot derives probability from the deal stage. Per-record overrides are lost. | 100% |
| Opportunity Typepicklist | dealtype | HubSpot offers only newbusiness/existingbusiness. Renewal, Expansion and Upsell collapse into one value — reporting that distinguishes them will break. | 62% |
No destination equivalent
9 fieldsThe destination has nowhere to put this. Options are a custom property, a different model, or accepting the loss — but it will not happen by itself.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Campaign IDreference | none | Deal-level campaign attribution has no HubSpot equivalent; attribution reporting must be rebuilt. | 27% |
| Primary Competitormultipicklist | none | HubSpot has no multi-select equivalent that preserves Salesforce multipicklist semantics without a custom property and a delimiter convention. | 33% |
| Approval Chain Overridetextarea | none | No destination property matches this field. | 28% |
| Revenue Schedule Detailtextarea | none | No destination property matches this field. | 13% |
| Consumption Tier Formulastring | none | No destination property matches this field. | 43% |
| Territory Hierarchy Pathstring | none | No destination property matches this field. | 37% |
| Quota Credit Allocationtextarea | none | No destination property matches this field. | 18% |
| Escalation Path Overridetextarea | none | No destination property matches this field. | 45% |
| Audit Trail Digesttextarea | none | No destination property matches this field. | 24% |
Recommended to leave behind
16 fieldsPortablov suggests not carrying these across — barely populated, referenced by nothing, or set by the destination itself and unwritable.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Deal Desk Approvedboolean | none | Approval state is meaningful only alongside the Salesforce approval process, which is not portable. | 100% |
| Migration Flag 2015boolean | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Legacy Code 2016double | none | Populated on only 0% of records — recommended for exclusion. | 0% |
| Interim Rating 2014boolean | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Old Source 2018double | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Interim Owner 2019date | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Migration Category 2021double | none | Populated on only 0% of records — recommended for exclusion. | 0% |
| Migration Category 2020double | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Backup Category 2020string | none | Populated on only 3% of records — recommended for exclusion. | 3% |
| Temp Owner 2019string | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Deprecated Region 2014double | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Legacy Ref 2021date | none | Populated on only 0% of records — recommended for exclusion. | 0% |
| Deprecated Bucket 2014date | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Migration Segment 2020boolean | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Legacy Owner 2015double | none | Populated on only 1% of records — recommended for exclusion. | 1% |
| Backup Code 2017string | none | Populated on only 2% of records — recommended for exclusion. | 2% |
What each gap costs
A mapping gap is only worth arguing about once you know how many records it touches. These are the issues Portablov raised on this object, with the count behind each.
- medium204,118 records affected
Opportunity.Probability (%) loses information
HubSpot derives probability from the deal stage. Per-record overrides are lost.
Portablov recommends: Confirm the reduced fidelity is acceptable, or add a custom property.
- medium126,553 records affected
Opportunity.Opportunity Type loses information
HubSpot offers only newbusiness/existingbusiness. Renewal, Expansion and Upsell collapse into one value — reporting that distinguishes them will break.
Portablov recommends: Confirm the reduced fidelity is acceptable, or add a custom property.
- medium55,112 records affected
Opportunity.Campaign ID cannot be migrated
Deal-level campaign attribution has no HubSpot equivalent; attribution reporting must be rebuilt.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium67,359 records affected
Opportunity.Primary Competitor cannot be migrated
HubSpot has no multi-select equivalent that preserves Salesforce multipicklist semantics without a custom property and a delimiter convention.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium57,153 records affected
Opportunity.Approval Chain Override cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium26,535 records affected
Opportunity.Revenue Schedule Detail cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium87,771 records affected
Opportunity.Consumption Tier Formula cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium75,524 records affected
Opportunity.Territory Hierarchy Path cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium36,741 records affected
Opportunity.Quota Credit Allocation cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium91,853 records affected
Opportunity.Escalation Path Override cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium48,988 records affected
Opportunity.Audit Trail Digest cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- low204,118 records affected
Opportunity.Stage needs a value map
Deal stages are pipeline-scoped in HubSpot. Confirm the target pipeline before cutover or every deal lands in the default pipeline.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
- low204,118 records affected
Opportunity.Forecast Category needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
What a person has to decide
- 1
Which HubSpot pipeline is the target, and what does each Salesforce stage become inside it? A stage name on its own has no meaning in HubSpot — get this wrong and every deal lands in the default pipeline.
- 2
Can you live with two deal types? HubSpot offers `newbusiness` and `existingbusiness`. Renewal, expansion and upsell collapse together, so any reporting that separates them breaks.
- 3
Do you need per-record probability? HubSpot derives it from the stage; per-record overrides do not survive.
Synthetic demo estate These figures come from a full Portablov run over a fabricated Salesforce estate. How a specific field behaves depends on how your org is configured — Portablov reads your actual schema, fill rates and record counts rather than assuming this one.
Salesforce Case → HubSpot Ticket
Does a Salesforce Case become a HubSpot Ticket? Entitlements, milestones and business-hours calendars have no HubSpot equivalent and are not carried across.
Casetickets
Equivalent, with transformation · high confidence- Salesforce Case
- A support record with a customer-facing case number, a status, four priorities, and — where Service Cloud is configured — entitlements, milestones and business-hours calendars driving escalation and SLA.
- HubSpot Ticket
- A ticket in a pipeline, with a HubSpot-generated id and three priority levels. There is no entitlement, milestone or business-hours model.
- Transfer directly
- 9 / 34
- Transformed on the way
- 5 / 34
- Lose fidelity
- 1 / 34
- No equivalent
- 10 / 34
Field by field
Every field Portablov discovered on this object, grouped by what happens to it. “Populated” is the share of records where the source field actually has a value — the number that decides whether a gap matters.
Transfers directly
9 fieldsA destination property of a compatible type exists. The value arrives unchanged.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Subjectstring(255) | subject | Type-compatible property in the destination; the value is copied as-is. | 97% |
| Descriptiontextarea(32000) | content | Type-compatible property in the destination; the value is copied as-is. | 83% |
| Closed Datedatetime | closed_date | Type-compatible property in the destination; the value is copied as-is. | 78% |
| Industry Segmentpicklist | industry_segment | Type-compatible property in the destination; the value is copied as-is. | 77% |
| Last QBR Datedate | last_qbr_date | Type-compatible property in the destination; the value is copied as-is. | 63% |
| Primary Use Casepicklist | primary_use_case | Type-compatible property in the destination; the value is copied as-is. | 91% |
| Signed Datedate | signed_date | Type-compatible property in the destination; the value is copied as-is. | 76% |
| Deployment Modelpicklist | deployment_model | Type-compatible property in the destination; the value is copied as-is. | 77% |
| Reference Customerboolean | reference_customer | Type-compatible property in the destination; the value is copied as-is. | 91% |
Transfers with a transformation
5 fieldsThe value arrives, but a named, deterministic transform runs on the way — a value map, a lookup, a type conversion. Nothing here is invented at load time.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Case IDid | none | Written to a dedicated unique salesforce_id property so every load is idempotent and re-runnable. | 100% |
| Statuspicklist | hs_pipeline_stage | Two Salesforce statuses collapse onto one HubSpot stage. | 100% |
| Case Originpicklist | source_type | Uppercase to HubSpot source enumeration. | 94% |
| Owner IDreference | hubspot_owner_id | Resolve owner by email. | 100% |
| Product Areapicklist | product_area | Lowercase to HubSpot option values. | 72% |
Transfers with a loss of fidelity
1 fieldsThe record still arrives, but something about it does not survive the conversion. Each one is a call about whether the reduced version is good enough.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Prioritypicklist | hs_ticket_priority | HubSpot has three priorities; Critical and High become indistinguishable. | 100% |
No destination equivalent
10 fieldsThe destination has nowhere to put this. Options are a custom property, a different model, or accepting the loss — but it will not happen by itself.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Case Numberautonumber | none | HubSpot generates its own ticket ids. Customer-facing case numbers change — check any external references, email templates or SLAs that quote them. | 100% |
| Contact IDreference | none | No destination property matches this field. | 86% |
| Account IDreference | none | No destination property matches this field. | 90% |
| SLA Breachedformula(boolean) | none | Depends on Salesforce Entitlements and business hours, neither of which is portable. | 100% |
| Entitlement Milestone Statetextarea | none | No destination property matches this field. | 30% |
| Sharing Exception Notetextarea | none | No destination property matches this field. | 43% |
| Territory Hierarchy Pathstring | none | No destination property matches this field. | 44% |
| Escalation Path Overridetextarea | none | No destination property matches this field. | 36% |
| Regulatory Flagsmultipicklist | none | No destination property matches this field. | 34% |
| Renewal Uplift Formuladouble | none | No destination property matches this field. | 14% |
Recommended to leave behind
9 fieldsPortablov suggests not carrying these across — barely populated, referenced by nothing, or set by the destination itself and unwritable.
| Salesforce field | HubSpot property | What happens | Populated |
|---|---|---|---|
| Escalatedboolean | none | Escalation is a Salesforce entitlement-process concept with no destination equivalent. | 100% |
| CSATnumber(2,1) | none | Only 31% populated; HubSpot has its own feedback surveys. | 31% |
| Interim Status 2014double | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Legacy Rating 2016double | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Legacy Flag 2014picklist | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Deprecated Owner 2017double | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Deprecated Segment 2014picklist | none | Populated on only 4% of records — recommended for exclusion. | 4% |
| Deprecated Ref 2020double | none | Populated on only 2% of records — recommended for exclusion. | 2% |
| Legacy Rating 2019date | none | Populated on only 0% of records — recommended for exclusion. | 0% |
What each gap costs
A mapping gap is only worth arguing about once you know how many records it touches. These are the issues Portablov raised on this object, with the count behind each.
- high989,400 records affected
Case.Case Number cannot be migrated
HubSpot generates its own ticket ids. Customer-facing case numbers change — check any external references, email templates or SLAs that quote them.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- high850,884 records affected
Case.Contact ID cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- high890,460 records affected
Case.Account ID cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- high989,400 records affected
Case.SLA Breached cannot be migrated
Depends on Salesforce Entitlements and business hours, neither of which is portable.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium989,400 records affected
Case.Priority loses information
HubSpot has three priorities; Critical and High become indistinguishable.
Portablov recommends: Confirm the reduced fidelity is acceptable, or add a custom property.
- medium296,820 records affected
Case.Entitlement Milestone State cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium425,442 records affected
Case.Sharing Exception Note cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium435,336 records affected
Case.Territory Hierarchy Path cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium356,184 records affected
Case.Escalation Path Override cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium336,396 records affected
Case.Regulatory Flags cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- medium138,516 records affected
Case.Renewal Uplift Formula cannot be migrated
No destination property matches this field.
Portablov recommends: Create a custom HubSpot property and map manually, or confirm the field is genuinely no longer needed.
- low989,400 records affected
Case.Status needs a value map
Two Salesforce statuses collapse onto one HubSpot stage.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
- low930,036 records affected
Case.Case Origin needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
- low712,368 records affected
Case.Product Area needs a value map
Source and destination use different option sets. Portablov proposed a mapping; unmapped values fall back to the destination default.
Portablov recommends: Review the proposed value map and confirm every source option is covered.
What a person has to decide
- 1
Who owns the fact that case numbers change? HubSpot generates its own ids, so any email template, external system or SLA quoting a Salesforce case number needs updating.
- 2
How do four priorities become three? Critical and High become indistinguishable unless you model the difference elsewhere.
- 3
What replaces SLA and escalation? Both depend on Salesforce entitlements and business hours, neither of which is portable — they are rebuilt in HubSpot or retired.
Synthetic demo estate These figures come from a full Portablov run over a fabricated Salesforce estate. How a specific field behaves depends on how your org is configured — Portablov reads your actual schema, fill rates and record counts rather than assuming this one.
What Portablov assesses
Everything the switch touches.
- Objects and fields
- Every standard and custom object, every field, its type and how much of it is actually populated across your records.
- Users and licences
- Every login, its profile and permission sets, last login, records owned, and whether that person already exists in the destination portal.
- Automations
- Flows, workflow rules, process builders, validation rules and Apex triggers, checked against what the destination can express.
- Records, by volume
- Counts per object, so a mapping gap is quoted as a number of affected records rather than as a warning.
Why it is read-only
An assessment that can change something is not an assessment.
- Nothing is written to either platform
- The connectors request read scopes only, and report back the scopes they were actually granted so you can check them against what you expected.
- Credentials never reach the browser
- OAuth material is held in a managed secret store, referenced by an id. No API response can return it.
- You can upload an export instead
- If connecting production is a conversation you would rather not have yet, the assessment runs on an export.
- The assessment is yours to delete
- One action removes the estate snapshot, the user assessments, the mapping proposal and the findings.
The full model — tenant isolation, credential handling, encryption and audit, plus where we honestly stand on certification — is on the Portablov security page.
Find out what your Salesforce estate would actually take with it.
Connect read-only, or upload an export. Nothing is written to either platform, and the assessment is yours to delete.