Hey folks! I've been knee-deep in data migrations lately (moving from Grafana to Datadog for dashboards, what a project! 😅), and a buddy at work just asked me about migrating from Salesforce to HubSpot. It's a different beast than observability tools, but the principles are similar: don't lose data, keep things running, and have a rollback plan.
Here's a step-by-step walkthrough I helped him sketch out, based on the "monitor everything, test in stages" approach we use in tech.
**Phase 1: Audit & Plan (The "What are we moving?")**
* **Inventory Your Data:** Catalog all objects you care about in Salesforce: Leads, Contacts, Accounts, Opportunities, custom objects, and their relationships. Don't forget Notes & Attachments!
* **Field Mapping Spreadsheet:** This is your bible. List every Salesforce field and map it to the corresponding HubSpot field. Watch out for mismatched data types (like picklists to dropdowns).
* **Clean House First:** Use this chance to deduplicate and fix stale data. Cleaning *before* the migration saves huge headaches later. I'd run some reports to find duplicates and incomplete records.
**Phase 2: The Data Migration Approach**
You've got two main paths:
1. **HubSpot's Native Import Tools:** Good for simple, one-time exports of standard objects (Contacts, Companies, Deals). You'd export CSV files from Salesforce, transform them to match HubSpot's format, and import.
2. **A Middleware Tool or API Script:** For complex, multi-object migrations with relationships. You'd use something like Zapier, Stitch, or a custom script. Here's a super simplified Python example using the `simple-salesforce` and `hubspot-api-client` libraries to show the concept:
```python
# Pseudo-code example - you'd need error handling, batching, and logging!
from simple_salesforce import Salesforce
from hubspot import HubSpot
# Extract from Salesforce
sf = Salesforce(username=..., password=..., security_token=...)
salesforce_contacts = sf.Contact.query("SELECT Id, Email, FirstName, LastName FROM Contact LIMIT 100")
# Transform & Load to HubSpot
hs = HubSpot(api_key=...)
for contact in salesforce_contacts:
hs_client.crm.contacts.basic_api.create(
properties={
"email": contact['Email'],
"firstname": contact['FirstName'],
"lastname": contact['LastName'],
"salesforce_id__c": contact['Id'] # Keep the old ID for reference!
}
)
```
**Phase 3: Cutover Plan & Timeline**
* **Run a Pilot:** Migrate a small, safe subset first (like 50-100 test Contacts). Validate everything in HubSpot.
* **Staged Cutover:** Consider migrating in waves—maybe all Contacts first, then Companies, then Deals—rather than all at once. This makes validation easier.
* **Parallel Run (if possible):** For a period, create new records in both systems to ensure HubSpot works for your team's processes. This isn't always feasible but is the gold standard.
* **Final Cutover & Decommission:** Redirect your teams to HubSpot on a set date, and make Salesforce read-only for a while for reference.
**How long did it actually take?** For my friend's mid-sized sales team (~10k records), the whole process took about **6 weeks**. The bulk of that was planning, cleaning, and the staged cutover. The actual data transfer for their volume only took a weekend.
Biggest tip? **Preserve your old Salesforce record IDs in a custom field in HubSpot.** It's like adding a `trace_id` when you're doing distributed tracing—it lets you link records back if you need to debug. Good luck
Dashboards or it didn't happen.