CRM migration
Field-level mapping, validation, and rollback between Freshsales and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Freshsales
Source
Odoo CRM
Destination
Compatibility
10 of 14
objects map 1:1 between Freshsales and Odoo CRM.
Complexity
BStandard
Timeline
4-7 weeks
Try the reverse
Overview
Moving from Freshsales to Odoo CRM is an all-in-one ERP migration, not a side-by-side CRM replacement. Freshsales maintains separate Leads, Contacts, and Accounts objects with lifecycle stages and Freddy AI scoring on Pro and Enterprise tiers. Odoo CRM uses a Lead object that can be converted to a Contact and Account (via the Partner model), with pipeline stages managed through Odoo's stage configuration rather than named pipelines. We handle the Contact-to-Account association model from Freshsales, map Deals to Odoo Opportunities with stage alignment, and preserve custom field definitions. We do not migrate Freddy AI scores, telephony credits, bot sessions, Workflows, or Sequences — these are either platform-specific or require a separate rebuild in Odoo's automation framework. The Odoo Partner object replaces both Freshsales Accounts and Contacts in a unified model, which requires careful relationship resolution during import. Activity history (calls, emails, meetings, tasks) migrates via Odoo's mail.message and mail.activity APIs with parent-record resolution.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Source platform
Freshsales platform overview
Scorecard, SWOT, gotchas, and pricing for Freshsales.
Destination platform
Odoo CRM platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo CRM.
Data migration guide
The complete Odoo CRM migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Freshsales migration guide
Understand the data you're exporting from Freshsales before mapping it.
Destination checklist
Odoo CRM migration checklist
Pre- and post-cutover tasks for moving onto Odoo CRM.
Source checklist
Freshsales migration checklist
Exit checklist for unwinding your Freshsales setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Freshsales object lands in Odoo CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Freshsales
Lead
Odoo CRM
CRM Lead (crm.lead)
1:1Freshsales Leads map directly to Odoo CRM Lead (crm.lead model). Lead_Status, lifecycle stage, source tracking, and owner assignment migrate as custom fields on the Odoo Lead. Odoo's Lead object handles both prospect qualification and the conversion step (Lead → Contact + Partner). We preserve the original Freshsales lead_status as a text field and map lifecycle stages to Odoo's lead_ids stage_name.
Freshsales
Contact
Odoo CRM
Partner (res.partner)
many:1Freshsales Contacts attach to Accounts and have individual contact details (name, email, phone, title, lifecycle stage). Odoo uses res.partner for both companies and people; person-type partners linked to company-type partners. We resolve the Freshsales Account (company) first, create the company-type Partner, then create person-type Partners for each Contact with a parent_id link to the company Partner. Duplicate detection uses email domain + name.
Freshsales
Account
Odoo CRM
Partner (res.partner)
1:1Freshsales Accounts map to Odoo company-type Partners (res.partner with partner_type = company). The Freshsales account name becomes the Partner display name, website migrates to website field, industry and employee count map to custom Partner fields. Multiple Contacts under one Freshsales Account merge into person-type Partners under the same company Partner.
Freshsales
Deal
Odoo CRM
Opportunity (crm.lead with type = opportunity)
1:1Freshsales Deals map to Odoo CRM Opportunities (crm.lead records with type=opportunity). The Freshsales pipeline stage maps to an Odoo CRM Stage in the configured pipeline. Deal amount, probability, expected close date, and owner migrate to the Odoo opportunity fields. Stage mapping requires configuration of Odoo CRM stages to match Freshsales pipeline stage names and probabilities.
Freshsales
Deal Stage
Odoo CRM
CRM Stage (crm.stage)
lossyFreshsales pipeline stages map to Odoo CRM stages within the configured sales team pipeline. We create Odoo stages that match Freshsales stage names, probabilities, and order, and assign them to the appropriate crm.team. Stage sequence and probability percentages migrate from Freshsales Deal pipeline stage definitions.
Freshsales
Product
Odoo CRM
Product (product.product)
1:1Freshsales Products map to Odoo Product (product.product). Product name, SKU (hs_sku), unit price, and description migrate. Odoo's product variants and price list architecture requires creating a product.template as the parent, with product.product variants if the Freshsales product has attribute combinations.
Freshsales
Activity: Task
Odoo CRM
Mail Activity (mail.activity)
1:1Freshsales Tasks map to Odoo mail.activity records linked to the corresponding crm.lead or res.partner. Task title, due date, status, priority, and owner migrate. ActivityDate maps to Odoo's date_deadline and mail.activity's activity_type_id. Owner resolution uses email matching against Odoo res.users.
Freshsales
Activity: Call
Odoo CRM
Mail Activity + Call Log (mail.activity)
1:1Freshsales call engagements map to Odoo mail.activity with activity_type_id set to the call activity type. Call duration, disposition, and recording URL migrate to custom fields on the mail.activity record. Odoo does not have native call recording storage, so recordings are attached as ir.attachment records linked to the activity or the related Partner/Lead.
Freshsales
Activity: Event/Meeting
Odoo CRM
Calendar Event (calendar.event)
1:1Freshsales Events and meetings map to Odoo calendar.event records. Start datetime, end datetime, location, description, and attendee list migrate. Odoo calendar.attendee records are created for each meeting attendee linked to the relevant res.partner or crm.lead.
Freshsales
Activity: Email
Odoo CRM
Mail Message (mail.message)
1:1Freshsales email engagements migrate to Odoo mail.message records attached to the crm.lead or res.partner. Email subject, body (HTML), from/to addresses, and timestamp migrate. Odoo's mail.thread model automatically links mail.message records to the correct record type via the model and res_id fields.
Freshsales
Custom Field
Odoo CRM
Custom Field (ir.model.fields)
lossyFreshsales custom fields on Leads, Contacts, Accounts, and Deals map to Odoo custom fields created via Settings > Technical > Database Structure > Fields. Field type mapping: text to char, number to float or integer, date to date, dropdown to selection, checkbox to boolean. We create fields before data migration so the schema is ready at load time.
Freshsales
Attachment
Odoo CRM
Attachment (ir.attachment)
1:1Freshsales file attachments migrate as Odoo ir.attachment records linked to the parent crm.lead, res.partner, or product.product. We resolve the attachment's original record context, retrieve the file content via Freshsales API, and store it in Odoo's attachment storage. Storage limits in Odoo depend on the hosting plan (Odoo Online,.sh, or on-premise).
Freshsales
Owner
Odoo CRM
User (res.users)
1:1Freshsales Owners map to Odoo res.users by email match. We extract all distinct owner_ids from Contacts, Accounts, Deals, and Activities and attempt email-based matching against the destination Odoo User list. Unmatched owners are held in a reconciliation queue for the customer's Odoo admin to provision res.users records before record import continues.
Freshsales
Territory (Pro tier only)
Odoo CRM
Sales Team (crm.team)
lossyFreshsales territory assignments (Pro-tier only) map to Odoo crm.team records. We create one crm.team per Freshsales territory, assign the territory's owner and members as Odoo res.users team members, and set territory assignment as a Lead routing rule in the team's action rules.
| Freshsales | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | CRM Lead (crm.lead)1:1 | Fully supported | |
| Contact | Partner (res.partner)many:1 | Fully supported | |
| Account | Partner (res.partner)1:1 | Fully supported | |
| Deal | Opportunity (crm.lead with type = opportunity)1:1 | Fully supported | |
| Deal Stage | CRM Stage (crm.stage)lossy | Fully supported | |
| Product | Product (product.product)1:1 | Fully supported | |
| Activity: Task | Mail Activity (mail.activity)1:1 | Fully supported | |
| Activity: Call | Mail Activity + Call Log (mail.activity)1:1 | Fully supported | |
| Activity: Event/Meeting | Calendar Event (calendar.event)1:1 | Fully supported | |
| Activity: Email | Mail Message (mail.message)1:1 | Fully supported | |
| Custom Field | Custom Field (ir.model.fields)lossy | Fully supported | |
| Attachment | Attachment (ir.attachment)1:1 | Fully supported | |
| Owner | User (res.users)1:1 | Fully supported | |
| Territory (Pro tier only) | Sales Team (crm.team)lossy | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Discovery and Odoo environment preparation
We audit the source Freshsales account across plan tier (Free/Growth/Pro/Enterprise), custom field definitions, pipeline count, active workflows, sales sequences, bot session usage, telephony call records, and product catalog. We pair this with an Odoo environment assessment: Online vs.sh vs on-premise, CRM app installation status, existing crm.team and crm.stage configuration, and whether the Odoo migration is CRM-only or part of a broader ERP implementation. The discovery output is a written migration scope document covering object inventory, custom field mapping, pipeline stage configuration, and the Lead conversion workflow decision.
Schema design and Odoo field creation
We design the destination Odoo schema before any data moves. This includes creating ir.model.fields for every mapped custom field from Freshsales, configuring crm.team records for each Freshsales pipeline or territory, setting up crm.stage records with matching names and probabilities, configuring res.partner title and industry options to match Freshsales picklist values, and designing the Lead conversion action settings. Custom fields are deployed via Odoo's Technical Settings UI or XML data file in a staging database before migration begins.
Staging migration and reconciliation
We run a full migration into the Odoo staging environment using production-like data volume. The customer's Odoo administrator reconciles record counts across Leads, Contacts, Accounts, Deals, and Activities against the Freshsales source. We spot-check 25-50 records field-by-field for data accuracy, verify the parent_id chain on Partner records, confirm stage assignment on Opportunities, and validate attachment integrity. Sign-off from the customer's Odoo admin on staging results authorizes the production migration date.
Owner reconciliation and User provisioning
We extract every distinct Freshsales owner_id from Contacts, Accounts, Deals, and Activities and match by email against the destination Odoo res.users table. Any Freshsales owner without a matching Odoo User is added to a reconciliation queue. The customer's Odoo admin provisions missing res.users records before production migration resumes. OwnerId references are required on most Odoo CRM records, so this step gates the production migration.
Production migration in dependency order
We run production migration in the following sequence: company-type Partners (from Freshsales Accounts), then person-type Partners (from Freshsales Contacts with parent_id resolved), then Leads (crm.lead), then Opportunities (crm.lead type=opportunity from Freshsales Deals), then Products, then Activities (mail.activity, mail.message, calendar.event via Odoo ORM API), then Attachments (ir.attachment). Each phase emits a row-count reconciliation report. We use Odoo's XML-RPC or JSON-RPC API with batch chunking for large record sets.
Cutover, delta sync, and Workflow inventory delivery
We freeze Freshsales writes during the cutover window, run a final delta migration for any records modified during the migration period, and enable Odoo as the system of record. We deliver the Workflow and Sequence inventory document to the customer's admin team. We support a one-week hypercare window to resolve any data quality issues raised by the sales team. We do not rebuild Freshsales Workflows or Sequences inside the migration scope; that work is a separate Odoo automation configuration engagement.
Platform deep dives
Freshsales
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Freshsales and Odoo CRM.
Object compatibility
2 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Freshsales: Not publicly documented on Freshworks CRM; Freshdesk docs reference rate limits but Freshsales-specific limits are undocumented.
Data volume sensitivity
Freshsales doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Freshsales to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Freshsales to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Freshsales
Other ways to arrive at Odoo CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.