RevOps Playbook: Field Mapping, Lifecycle, and Attribution Between HubSpot and Salesforce
Published by Bles Software, a custom software and AI company based in Yehud-Monoson, Israel, building web apps, AI agents and API integrations for clients in Israel, the US, the UK and the EU.
Precise field mapping is the backbone of a trustworthy HubSpot ↔ Salesforce integration. When values align, lifecycle transitions become predictable and attribution ties marketing influence to pipeline without tedious reconciliation. This playbook provides an opinionated blueprint for mapping the fields that matter, orchestrating lifecycle, and preserving campaign attribution from first touch to closed won.
Principles for a Minimal, Powerful Schema
RevOps systems tend to grow until they are hard to manage. Prevent that outcome with four principles:
- Purpose first: every field must answer a recurring business question.
- One owner: each field has a single system of record and a clear sync direction.
- Tight enums: picklists contain only allowed values; free text is rare.
- Diff‑resistance: conflict winners are deterministic; nulls and invalids have safe defaults.
If a proposed field doesn’t meet these principles, defer it and capture the underlying requirement in your backlog.
Identity and Keys
Identity mapping preserves uniqueness and prevents duplication.
- Primary Person Key:
Email(HubSpot source‑of‑truth; enforce lowercase and trim). In Salesforce, store the HubSpot VID/Record ID as an external ID. - Primary Company Key:
Company Domainfor B2B; fall back to exact Account Name only when domain is absent and risk of collision is low. - System IDs: Store both HubSpot and Salesforce record IDs bidirectionally so any system can fetch the other’s record reliably.
When both sides update identity at the same time, Salesforce typically wins for Account/Contact keys; HubSpot wins for behavioral keys.
Lifecycle and Status Fields
Lifecycle is the control plane for routing and reporting. Map it explicitly and guard against regressions.
- HubSpot Lifecycle Stage (HS owner): Anonymous → Subscriber → Lead → MQL → SQL → Opportunity → Customer.
- Salesforce Lead Status (SF owner): Open → Working → Qualified/Accepted → Disqualified (with reasons).
- Opportunity Stage (SF owner): Stage progression that ties to forecast categories.
Mappings:
HubSpot Lifecycle: MQL→ setSalesforce Lead Status: Qualified(or your acceptance stage). Require a reason code (e.g., Score Threshold, Event, Hand Raise).Salesforce Lead Status: Disqualified→ set HubSpot lifecycle toLeadand writeDisqualification Reasonback to HubSpot.- When Opportunity is created in Salesforce and Contact is the primary, update HubSpot lifecycle to
Opportunityand associate Campaigns.
Prevent regressions by blocking moves from SQL/Opportunity back to Lead unless explicitly requested with a reason.
Routing, Ownership, and Territories
Routing fields dictate who works what and when.
- Owner: Salesforce is the owner of record. Sync Owner to HubSpot for segmentation and personalization only.
- Queue/Territory: Salesforce source‑of‑truth. If HubSpot uses these for workflows, treat them as read‑only mirrors.
- SLA Timestamps: Calculate “first response” and “time to acceptance” in a data warehouse or Salesforce; write back to HubSpot for campaign rules if needed.
Ownership changes should be evented (Platform Events, webhooks, or periodic diff jobs) to avoid drift.
Qualification and ICP Fields
Push only qualification attributes you actively use for scoring and segmentation.
- Firmographic: Industry, Employee Count band, Annual Revenue band, Region.
- Fit and Intent: ICP Fit Tier, Buying Role, Persona, Intent Provider score (if used), Product of Interest.
- Source and Campaign: UTM params normalized in HubSpot; Campaign Member Status standardized in Salesforce.
Maintain a translation matrix: if HubSpot’s Industry taxonomy is finer, map it to your Salesforce picklist via a controlled lookup or middleware.
Campaigns and Campaign Members
Attribution hinges on consistent Campaigns.
- Salesforce Campaigns are hierarchical: Parent Campaigns represent initiatives; child Campaigns represent tactics.
- Standardize Campaign Member Status per tactic (e.g.,
Invited,Registered,Attendedfor events;Sent,Opened,Clickedfor email). - HubSpot Campaigns should map to Salesforce Campaigns by ID. When that’s not feasible, maintain a concordance table keyed on a durable name.
Rules of engagement:
- Always create/update Campaign Members before Opportunity creation or association so influence can be recorded from day one.
- Disallow free‑text Campaign names that create accidental duplicates; enforce a naming template in both systems.
Attribution Models and Data Contracts
Choose models that match your motion and stick to them.
- Primary: Position‑based (40/20/40) for mid‑market motions where first and last touch matter.
- Secondary: Linear for long enterprise cycles where touches are many.
- Diagnostic: First‑touch and last‑touch for channel intake and conversion analysis.
Contract the inputs per model: required Campaign types, eligible Member Statuses, and minimum engagement signals. If those inputs are missing, the model should exclude or flag the record rather than fabricate influence.
Conflict Resolution and Null Safety
Conflicts occur when both systems change a field between syncs. Define systemic winners:
- Person identity and behavior (e.g., last web session): HubSpot wins.
- Commercial and ownership data (Lead Status, Opportunity Stage): Salesforce wins.
- Enums with overlapping but not identical sets: apply translation and then winner logic.
For nulls:
- If HubSpot sends null to a Salesforce‑owned field, ignore the change.
- If Salesforce sends null to a HubSpot‑owned field that powers workflows, backfill a safe default and raise a data quality alert.
Practical Mapping Matrix (Starter)
Below is a compact starter matrix you can copy into your data dictionary. Expand with your exact field API names and owners.
- Email (HS → SF): lowercase, trim; conflict = HS wins; required for person creation.
- Company Domain (HS ↔ SF): conflict = SF wins; used for account matching.
- Lifecycle Stage (HS ↔ SF): HS owns up to MQL; SF owns SQL→Customer; block regressions.
- Lead Status (SF → HS): authoritative for sales‑owned stages; HS reads only.
- Owner (SF → HS): authoritative; HS mirrors for segmentation.
- Industry (HS ↔ SF via translation): resolve enumerations; SF wins on conflict.
- Campaign Member Status (SF ↔ HS): align to tactic templates; SF canonical; HS reads and proposes.
Keep the matrix versioned in git and require pull requests for any change.
Testing the Mapping End‑to‑End
Use small, labeled cohorts and time‑boxed runs.
- Create five test contacts that represent common paths: inbound demo, content MQL, event attendee, partner referral, and cold outbound reply.
- Progress each through lifecycle while manipulating a few key fields (industry, region, product of interest). Verify mapping and directionality.
- Create one test opportunity per cohort and associate relevant campaigns. Confirm attribution appears correctly.
- Purposely induce a conflict (change the same picklist on both sides) and verify the winner matches your contract.
Record results with screenshots and the final record payloads. Store them alongside the mapping matrix.
Observability and Audits
Build simple checks to prove your mapping stays healthy:
- Percentage of mapped fields that updated in the last 7 days for active records.
- Count of rejected updates due to validation or picklist issues.
- Drift checks for owners and territories (HubSpot vs. Salesforce).
- Missing Campaign association rate for Opportunities created last 30 days.
Alert when metrics cross thresholds, and add the alert IDs to your runbooks.
FAQ
How do we map both Leads and Contacts from HubSpot contacts?
Treat HubSpot Contacts as people and decide in Salesforce whether they begin life as Leads or are attached as Contacts to existing Accounts. Use domain matching and dedupe to avoid creating a Lead when a Contact already exists. Document the precise decision tree and keep it in your repo.
Can we keep HubSpot as the source for UTM parameters?
Yes. HubSpot is better positioned to capture and normalize UTMs at session time. Mirror the normalized values to Salesforce for reporting and campaign association, but lock editing on the Salesforce side to avoid drift.
What if our industry lists don’t match?
Adopt a translation layer. Either maintain a mapping table in middleware or a controlled HubSpot workflow that converts granular values into your Salesforce picklist. Avoid pushing HubSpot’s free‑text into Salesforce where validation rules will block it.
How should we handle multi‑product interest fields?
Use a primary product of interest picklist plus a secondary multi‑select if absolutely necessary. Sync the primary only. Store additional selections in a text array field in HubSpot and expose them to Salesforce via a read‑only text field if the business case requires it.
How do we test attribution reliably?
Run a calendarized test: create a known first‑touch campaign, then a mid‑funnel engagement, and finally a last‑touch campaign. Create an opportunity and associate the contact. Validate that the position‑based model allocates weight per the contract and that campaign types are eligible.
More RevOps Playbooks from Bles Software
- Attribution & Pipeline Reporting Setup | Bles Software
- Data Mapping Checklist (Leads/Contacts/Opportunities) | Bles Software
- Field Governance & Picklists | Bles Software
- Sync Rules: Deduping, Owners, Lifecycle | Bles Software
- HubSpot ↔ QuickBooks Integration Playbook | Bles Software
- Errors & Retries: Top Fixes | Bles Software
- HubSpot ↔ Salesforce Integration: Executive Guide | Bles Software
- HubSpot ↔ Salesforce: Cost & Timeline Drivers | Bles Software
- Daily AI Roundup: AI agent, model and enterprise AI news