HubSpot to Odoo: Migration vs Integration
Businesses connect HubSpot and Odoo for two reasons. Some want to migrate away from HubSpot entirely — moving contacts, deals, and history into Odoo CRM. Others want to run both systems: HubSpot for inbound marketing and lead capture, Odoo for operations, invoicing, and ERP. This guide covers both scenarios.
Option 1: Full Migration from HubSpot to Odoo
Step 1: Export Data from HubSpot
- Go to Contacts → Actions → Export
- Select all properties you need (name, email, company, phone, lifecycle stage, deal info)
- Export as CSV
- Repeat for Deals, Companies, and Tickets
Step 2: Map HubSpot Fields to Odoo
| HubSpot | Odoo Model | Odoo Field |
|---|---|---|
| Contact | res.partner | name, email, phone |
| Company | res.partner (company) | name, is_company=True |
| Deal | crm.lead | name, expected_revenue, stage_id |
| Lifecycle Stage | crm.stage | Map to pipeline stages |
| Deal Owner | crm.lead | user_id (salesperson) |
| Ticket | helpdesk.ticket | name, description, priority |
Step 3: Import into Odoo
- Clean your CSV files — remove duplicates, standardize phone formats, fix encoding
- Import Companies first (Contacts → Import → select CSV)
- Import Contacts next, linking to companies via company name
- Import Deals as CRM leads/opportunities, linking to contacts
- Verify record counts match after import
Step 4: Map Deal Stages
HubSpot deal stages rarely match Odoo's default CRM stages. Create matching stages in Odoo before importing:
# HubSpot stages → Odoo stages mapping
Appointment Scheduled → Qualified
Qualified to Buy → Qualified
Presentation Scheduled → Proposition
Decision Maker Bought-In → Proposition
Contract Sent → Negotiation
Closed Won → Won
Closed Lost → LostOption 2: Live Integration (Both Systems Running)
Using HubSpot API + Odoo Automated Actions
For real-time sync between HubSpot and Odoo, use HubSpot's REST API:
- Generate a Private App in HubSpot (Settings → Integrations → Private Apps)
- Grant scopes:
crm.objects.contacts.read,crm.objects.contacts.write,crm.objects.deals.read - Copy the access token
- In Odoo, store the token as a system parameter:
hubspot_api_token
Sync Contacts Bidirectionally
Create an Odoo cron job that runs every 15 minutes:
# Pseudocode for HubSpot → Odoo sync
1. GET /crm/v3/objects/contacts?lastModified > last_sync_time
2. For each contact:
a. Search Odoo by email
b. If found: update fields
c. If not found: create new res.partner
3. Update last_sync_timeSync Deals to Odoo CRM
When a deal reaches a specific stage in HubSpot, create or update the corresponding opportunity in Odoo CRM. This lets your sales team work in HubSpot while operations and invoicing happen in Odoo.
Using Zapier as a Bridge
If you want to avoid custom code, Zapier connects HubSpot and Odoo with pre-built triggers and actions. See our Zapier integration guide for details. Common zaps:
- HubSpot new contact → Create Odoo contact
- HubSpot deal closed won → Create Odoo sale order
- Odoo invoice paid → Update HubSpot deal property
Troubleshooting
Duplicate Contacts After Migration
HubSpot allows multiple contacts with the same email. Odoo does not enforce email uniqueness by default but will create duplicates. Use Odoo's Merge Contacts wizard or deduplicate before import.
Lost Deal History
HubSpot's activity timeline (emails, calls, notes) does not export cleanly to CSV. Use the API to pull activities and create corresponding chatter messages in Odoo for a complete history.
API Rate Limits
HubSpot's private app API allows 100 requests per 10 seconds. For initial migration of large databases (10K+ contacts), use the batch endpoints and add delays between batches.
DeployMonkey Migration Assistance
DeployMonkey's AI agent can help plan your HubSpot-to-Odoo migration, map fields, and validate imported data. Spin up a test Odoo instance on DeployMonkey, run your migration there first, verify everything, then apply to production.