Salesforce + HubSpot Integration Guide
This guide walks you through setting up a complete integration between Salesforce and HubSpot. By the end, contacts, leads, and accounts will stay in sync across both CRMs.
Overview
Goal: Keep Salesforce and HubSpot records consistent so sales teams using either platform work from the same customer data.
What You'll Set Up:
- Salesforce Contacts synced with HubSpot Contacts
- Salesforce Leads synced with HubSpot Contacts (with lifecycle stage mapping)
- Salesforce Accounts synced with HubSpot Companies
- Bidirectional updates with configurable conflict resolution
Time Required: 20–30 minutes
Prerequisites
Before starting, ensure you have:
- [ ] A FluxCascade account (sign up free)
- [ ] Admin access to your Salesforce org (System Administrator profile or equivalent)
- [ ] Admin access to your HubSpot portal
- [ ] Both platforms connected to FluxCascade
If you haven't connected your platforms yet, see the Salesforce integration docs and HubSpot integration docs first.
Step 1: Choose Your Sync Direction
Before creating mappings, decide which direction data should flow:
Option A: Salesforce → HubSpot (one-way) Best when Salesforce is your system of record and HubSpot is used for marketing.
Option B: HubSpot → Salesforce (one-way) Best when HubSpot captures inbound leads and Salesforce manages the sales pipeline.
Option C: Bidirectional (recommended for most teams) Both systems stay current. Requires conflict resolution rules.
Step 2: Plan Your Contact Field Mapping
Recommended Contact Field Pairs
| Salesforce Field | HubSpot Field | Notes |
|---|---|---|
FirstName | firstname | Direct mapping |
LastName | lastname | Direct mapping |
Email | email | Used for matching records |
Phone | phone | Add phone_e164 transform |
MobilePhone | mobilephone | Add phone_e164 transform |
Title | jobtitle | Direct mapping |
MailingStreet | address | Address component |
MailingCity | city | Address component |
MailingState | state | Address component |
MailingPostalCode | zip | Address component |
Lead Field Mapping
When syncing Salesforce Leads to HubSpot, the records land as HubSpot Contacts with a lifecycle stage of "Lead."
| Salesforce Lead Field | HubSpot Contact Field | Notes |
|---|---|---|
FirstName | firstname | Direct mapping |
LastName | lastname | Direct mapping |
Email | email | Matching field |
Company | company | Direct mapping |
Status | hs_lead_status | Use value mapping transform |
LeadSource | hs_analytics_source | May need value mapping |
Account ↔ Company Mapping
Salesforce Accounts correspond to HubSpot Companies. This is a separate mapping from Contacts.
| Salesforce Account Field | HubSpot Company Field | Notes |
|---|---|---|
Name | name | Direct mapping |
Website | domain | Strip protocol with extract_domain |
Phone | phone | Add phone_e164 transform |
Industry | industry | Direct mapping |
NumberOfEmployees | numberofemployees | Direct mapping |
AnnualRevenue | annualrevenue | Direct mapping |
Step 3: Create the Contact Mapping
- Go to Mappings in FluxCascade
- Click New Mapping
- Configure the basics:
Source:
- Connection: Your Salesforce connection
- Object: Contacts
Target:
- Connection: Your HubSpot connection
- Object: Contacts
Direction: Bidirectional (recommended)
- Click Continue
Step 4: Configure Contact Field Pairs
Add these field pairs:
-
First Name
- Source:
FirstName - Target:
firstname - Transform: None
- Source:
-
Last Name
- Source:
LastName - Target:
lastname - Transform: None
- Source:
-
Email (Matching Field)
- Source:
Email - Target:
email - Transform:
lowercase - Mark as Matching Field
- Source:
-
Phone
- Source:
Phone - Target:
phone - Transform:
phone_e164 - Default country: US (or your country)
- Source:
-
Mobile Phone
- Source:
MobilePhone - Target:
mobilephone - Transform:
phone_e164
- Source:
-
Job Title
- Source:
Title - Target:
jobtitle - Transform: None
- Source:
Address Fields
-
Street
- Source:
MailingStreet - Target:
address
- Source:
-
City
- Source:
MailingCity - Target:
city
- Source:
-
State
- Source:
MailingState - Target:
state
- Source:
-
Postal Code
- Source:
MailingPostalCode - Target:
zip
- Source:
Step 5: Create the Account ↔ Company Mapping
Create a second mapping for organizations:
- Go to Mappings → New Mapping
- Source: Salesforce → Accounts
- Target: HubSpot → Companies
- Direction: Bidirectional
Add the field pairs from the Account ↔ Company table above. Use domain as the matching field for Companies (HubSpot deduplicates companies by domain).
Step 6: Configure Bidirectional Conflict Resolution
For bidirectional sync, set rules for when both systems update the same record:
Recommended Settings:
- Overall Strategy: Last Write Wins
- Email field: Salesforce wins – CRM of record owns email
- Phone field: Last Write Wins – both teams may update
- Address fields: Last Write Wins
- Company name: Salesforce wins (if Salesforce is the org-level system of record)
Step 7: Handle Lead Sync (Optional)
If you also want to sync Salesforce Leads:
- Create a third mapping: Salesforce Leads → HubSpot Contacts
- Direction: Salesforce → HubSpot (one-way is typical for leads)
- Set
lifecyclestageto a static value ofleadon the HubSpot side - Use email as the matching field
Note: When a Salesforce Lead is converted to a Contact, the Contact mapping takes over. Set up a filter to exclude converted leads from the Lead mapping.
Step 8: Test the Mapping
Before going live:
-
Click Test Sync
-
Review the preview showing what would sync
-
Check for:
- Correct field mapping
- Expected record counts
- Any transformation errors
- Duplicate detection working as expected
-
If issues appear, adjust configuration and test again
Step 9: Run Initial Sync
Once testing looks good:
- Click Sync Now
- Choose Full Sync for initial population
- Monitor progress in real-time
- Review completion statistics
Expected Results:
- Salesforce Contacts created as HubSpot Contacts (and vice versa)
- Salesforce Accounts created as HubSpot Companies (and vice versa)
- Existing matches updated with consistent data
Step 10: Enable Scheduled Sync
Set up automatic syncing:
- Go to mapping Settings
- Enable Scheduled Sync
- Choose frequency: Every 15 minutes (recommended)
- Save
Repeat for each mapping (Contacts, Accounts, Leads).
Verification
Check Salesforce
- Open a Contact that should have synced
- Verify HubSpot-created contacts appear
- Check field values match
Check HubSpot
- Open a contact that should have synced from Salesforce
- Verify field values match
- Check that Company associations are correct
Review Sync Logs
- Go to Syncs
- Click on recent sync jobs
- Verify success rates and check for errors
Common Issues & Solutions
Duplicate Records Created
Cause: Matching field not finding existing records across systems.
Solution:
- Ensure email is the matching field for Contacts
- Enable case-insensitive matching
- Verify emails exist in both systems before the first sync
- Consider running a dedup pass before enabling bidirectional sync
Salesforce PascalCase vs. HubSpot Lowercase
Cause: Salesforce uses PascalCase field names (FirstName), HubSpot uses lowercase (firstname).
Solution: FluxCascade handles this automatically in the field selector. No manual case conversion is needed.
Account ↔ Company Domain Mismatch
Cause: Salesforce Website contains a full URL (https://example.com), but HubSpot domain expects just the domain (example.com).
Solution: Add the extract_domain transform to the Website → domain field pair.
Lead Conversion Creates Duplicates
Cause: A Salesforce Lead converts to a Contact, but the Contact mapping creates a new HubSpot record.
Solution:
- Filter converted leads from the Lead mapping
- Ensure email matching catches the overlap
- Use HubSpot's built-in deduplication after initial sync
Best Practices
-
Map Contacts first, Accounts second – Get person-level data working before tackling organizations
-
Use email as the primary matching field – Most reliable identifier shared between both platforms
-
Keep Lead sync one-way – Salesforce → HubSpot avoids complex bidirectional lead/contact overlap
-
Normalize phone numbers – Apply
phone_e164transforms to prevent format-based mismatches -
Test with a small batch – Run a test sync on a filtered subset before syncing your full database
-
Monitor the first week closely – Check sync logs daily to catch mapping issues early
Next Steps
- Field Transformations – Advanced data transformation options
- Conflict Resolution – Configure bidirectional conflict handling
- Error Handling – Handle sync failures gracefully