crossary
How it worksSee it workTrustPricingFree template
Log inStart free
Start free
Worked example

Salesforce to HubSpot: the contact mapping, exactly as it came out

Two public vendor references in, one draft mapping out, nothing edited afterwards. A CRM-to-CRM migration looks easy until the draft is honest about it: most of HubSpot's contact record belongs to HubSpot itself, the pairs that do bind are identifier translations needing a crosswalk someone must own, and the fields that look effortless are the minority.

Updated August 2026

What went in

Two documents, both published by the vendors themselves, both used as-is:

  • Source — Salesforce’s Object Reference for the Contact object (API v258.0): 81 standard fields, each with Salesforce’s own type and capability line — a field without Create/Update is read-only in the API, which decides what a migration can even touch.
  • Target — HubSpot’s knowledge-base reference for the default contact properties: 171 properties across ten sections, from First name to the analytics, email, and ads state HubSpot writes itself.

Both files were read in full — no truncation, nothing dropped. The extracted inventory held all 81 source fields and all 171 target properties: the first run of the three published examples to inventory both sides completely.

Crossary's Fields tab for this run: 252 of 252 extracted fields applied, the Salesforce Contact source fields listed with type and description, a banner naming the one blocker question open on that tab, and the clarifying-questions panel open on a blocker asking how Salesforce OwnerId values should be resolved to HubSpot contact owners.
252 fields out of two documents, none dropped.The inventory both sides are mapped against — 81 from Salesforce's Contact object, 171 from HubSpot's default contact properties. The blocker on the right is already asking the ownership question.

What binding actually means here

This run produced zero transformation rows — no concatenations, no reformatting. Where the two CRMs mean the same thing they nearly share a name, and everything genuinely cross-system came back as a lookup: a rule that needs a crosswalk a human must supply and own. Three rows from the run:

Contact ownerlookupmedium

LOOKUP HubSpot owner ID USING Salesforce OwnerId VIA approved user cross-reference

Both fields represent contact ownership, but Salesforce and HubSpot user identifiers require cross-system translation. Assumption, stated on the row: an approved Salesforce-user-to-HubSpot-owner cross-reference will be available.

“the contact's owner. You can assign additional users to the contact record by creating a custom HubSpot user field type property.” — HubSpot, Contact owner

Every record has an owner and no owner survives a CRM switch by copying: the IDs belong to different systems. The row says exactly what is missing — the user crosswalk — and a blocker question below asks who supplies it. Medium confidence, because the rule is only as good as a table that doesn’t exist yet.

First conversiongeneratedhigh

Not migrated: set by HubSpot

HubSpot automatically sets this property and does not permit manual editing.

No quote — this row makes no claim about the source document. It says the target system owns the value, which is different from a gap and different from a mapping.

The dominant row of this run: 116 of HubSpot’s 171 default properties are analytics history, email engagement, ads attribution, and calculated state that HubSpot writes itself. Each of those rows is a thing not to migrate — trying to write them is how imported contacts end up with fabricated engagement history.

Company nameunknownnone

AccountId identifies a related account but does not emit the company name required by this target.

No expression — an abstention has no rule. The draft raised a blocker instead: should company-level values be obtained by joining an Account extract?

The row that shows the draft understood the shape of the data. The company name a HubSpot contact displays lives on the Salesforce Account, reachable only through a join — so instead of mapping the ID into a name field and being confidently wrong, the run abstained and asked whether to expand scope. A wrong mapping is worse than an honest gap.

What came out

Of the 171 HubSpot properties, the run bound 22 to a Salesforce source — 16 near-verbatim matches and 6 crosswalk lookups — explained 116 as HubSpot’s own machinery, and abstained on 33 — raising 16 questions, four of them serious enough to stop on. A tool that returned 171 confident rows here would have invented most of them; the gaps are what make the review of the rest mean something.

Contact

Salesforce→HubSpot

138 / 171 target fields mapped

22mapped from a source field
116need no source field
33the run declined to guess
One mark per HubSpot field in this run’s target inventory. 138 of 171 carry a mapping; the 33 open rings are the ones the run declined to guess, and they are the reason the review is worth doing.
Crossary's mapping review table for this run: 138 of 171 target properties carrying a proposal or an explanation, 33 not yet mapped, rows reading 'no source' each carrying the question the AI raised instead of a guess — Brands, Company name, Employment Role, Lifecycle stage. A banner above the table names the three blocker questions open on that tab; the table below stays fully editable. The panel on the right holds the unanswered blocker questions.
The gaps are rows, not silence.Company name and Lifecycle stage sit in the table carrying their questions rather than guesses. The blockers on the right hold the export until a human decides — including whether to join the Account extract. The review itself stays open meanwhile.

The 22 it bound to a source

Unedited. Confidence is the model’s own self-assessment, a cue for what to review first, never a verification — note that every crosswalk lookup rates itself medium, not high.

SalesforceHubSpotTypeConfidence
MailingCityCitydirecthigh
OwnerIdContact ownerlookupmedium
MailingCountryCountry/Regiondirecthigh
MailingCountryCodeCountry/Region Codedirecthigh
EmailEmaildirecthigh
TitleTypeEmployment Senioritylookupmedium
FaxFax numberdirecthigh
FirstNameFirst namedirecthigh
TitleJob titledirecthigh
LastNameLast namedirecthigh
MobilePhoneMobile phone numberdirecthigh
PhonePhone numberdirecthigh
MailingPostalCodePostal codedirecthigh
SalutationSalutationdirecthigh
MailingStateState/Regiondirecthigh
MailingStateCodeState/Region Codedirecthigh
MailingStreetStreet addressdirecthigh
BuyerAttributesBuying rolelookupmedium
LeadSourceSourceslookupmedium
BirthdateDate of birthdirecthigh
GenderIdentityGenderlookupmedium
TitleTypeSenioritylookupmedium

The four it stopped on

If you have moved a team between these two CRMs, you have had these exact arguments:

  • How should Salesforce OwnerId values be resolved to HubSpot Contact owner users?
  • Should company-level values be obtained by joining Salesforce Contact.AccountId to an Account extract?
  • How should Salesforce Department, DepartmentGroup, and TitleType populate HubSpot employment properties?
  • Please confirm the enum crosswalk strategy for Buying role, Sources, Gender, Employment Seniority, and Seniority.

None of these can be answered from the two references. The ownership question decides who gets notified about every migrated contact; the Account join decides whether company fields arrive at all; the enum crosswalks decide whether picklist history survives or collapses to blanks.

What this does not show

  • It is not a reviewed workbook. This is raw output. A real deliverable has a human decision on every row; that step is the product, and it hasn’t been done here.
  • The 22 are not verified correct. They are proposals with their reasoning attached so you can check them quickly.
  • Only 2 of 171 rows carry a verbatim spec quote. Both vendor references describe fields in one-line summaries, so most rows rest on stated reasoning rather than quotation — and both quotes that do exist were verified against the source text before publishing. Where a spec argues its rules at length, as the QuickBooks examples do, the quotes come with it.
  • It maps the spec, not your data. Nothing here touched a contact record, and nothing moves anything: Crossary produces the design a developer then implements. Custom fields — where most real Salesforce orgs keep their pain — would come from your org’s own field inventory, not the standard reference.
Run on 18 August 2026 against the vendors’ then-current public references, each reformatted one field per entry for ingestion — content unchanged; no mapping row was edited after the run. The blank version of this deliverable is a free source-to-target mapping template, and the same pipeline’s ERP runs are the NetSuite and Business Central worked examples. How the drafting stays trustworthy — evidence quotes, confidence as a triage cue, honest abstention — is covered on the AI data mapping page.

See this on your own specs

The fastest way to judge this is on a case you know. Email a source and target spec pair — redacted is fine — to support@crossary.com and you’ll get back exactly what this page shows: the draft workbook, gaps and questions included. Not a reviewed deliverable, not a sales call — the honest first pass, on your case.

Or run it yourself — freeOr walk a smaller worked sample first
crossary

Source-to-target data mapping that shows its work — and flags the gaps instead of guessing.

Product
The reviewed rowHow it worksThe guided sampleWorked examplesGuidesFree mapping templatePricing
Trust
Trust mechanicsFAQSecurityPrivacy & data
Company
SupportTermsLog in
© 2026 Crossary. All rights reserved.AI proposes · you decide · nothing ships you didn't approve.
TermsPrivacyCookiesSubprocessorsDPA