CRM migration
Field-level mapping, validation, and rollback between Odoo Marketing Automation and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Odoo Marketing Automation
Source
Freshsales
Destination
Compatibility
7 of 9
objects map 1:1 between Odoo Marketing Automation and Freshsales.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Odoo Marketing Automation to Freshsales is a migration from an ERP-bundled marketing module to a purpose-built sales CRM that layers in marketing automation from the Growth tier upward. Odoo Marketing Automation is not a standalone product — it installs alongside Email Marketing and optionally SMS Marketing, and it reads directly from Odoo's CRM Contacts and Leads. Freshsales uses a unified Contact model with a separate Leads object, and marketing automation lives in Freshsales Suite Growth and above as a visual journey builder. We extract Campaigns, Automation Rules, Workflow Activities, Mass Mailings, and email templates via Odoo's XML-RPC external API (which requires the Custom plan at $61/user/month) or CSV export from list views for Standard-plan databases. We then load Contacts, Leads, Deals, and email template metadata into Freshsales through its REST API. Automation rules containing Python server-action blocks cannot replay outside Odoo — we flag every instance and deliver a written inventory for the customer's admin to rebuild in Freshsales' visual workflow builder. We do not migrate workflows, sequences, forms, landing pages, or reports as code.
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.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Odoo Marketing Automation object lands in Freshsales, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo Marketing Automation
Contact
Freshsales
Contact
1:1Odoo Contacts (res.partner with customer flag) map directly to Freshsales Contact records. We extract name, email, phone, mobile, company_name, street, city, state_id, country_id, tag_ids, and custom field values via XML-RPC (Custom plan) or CSV export (Standard plan). The Odoo partner record's display_name becomes Freshsales Contact's full_name, and email becomes the primary email field. Tags stored in Odoo's ir.attachment model flatten to a string array and load into Freshsales Contact's Tags field by name match.
Odoo Marketing Automation
Lead
Freshsales
Lead
1:1Odoo Leads (crm.lead with type='lead') map to Freshsales Lead records. We extract name, email, phone, partner_name (company on Lead), source_id, stage_id, priority, expected_revenue, lost_reason, and tag_ids. Odoo Lead stage names (e.g., New, Qualified, Proposal Sent) are mapped to Freshsales Lead Status values during migration. The original Odoo stage names are preserved in a custom field odoo_stage__c for reconciliation after cutover.
Odoo Marketing Automation
Opportunity
Freshsales
Deal
1:1Odoo Opportunities (crm.lead with type='opportunity') map to Freshsales Deal records. We extract name, partner_id (Account lookup), stage_id, probability, expected_revenue, date_deadline, lost_reason, user_id (Owner lookup), and tag_ids. Odoo's probability field maps to Freshsales Deal's probability field directly. The partner_id lookup resolves to the Freshsales Contact or Account record that was created from the same res.partner record during the Contact migration phase.
Odoo Marketing Automation
Campaign
Freshsales
Sales Campaign
1:1Odoo Campaigns (marketing.campaign) map to Freshsales Sales Campaigns, which are available on Freshsales Suite Growth and above. We extract campaign name, target_model (Contact or Lead), audience_domain_filter (domain expression), state (draft/running/done/cancel), and trace participant counts. The audience domain filter is documented as a manual filter to recreate in Freshsales' campaign audience builder rather than migrated as a live automation trigger.
Odoo Marketing Automation
Automation Rule
Freshsales
Workflow / Action Set
lossyOdoo Automation Rules (marketing.activity) map to Freshsales Workflows. We extract rule name, trigger_type (time-based, email_event, server_action), filter_domain (domain expression), action chain (email, SMS, update_record, create_task, Python Code), and activity ordering. Rules containing Python Code activity are flagged as manual-rebuild items — Python cannot execute on Freshsales. All other trigger conditions, delays, and action templates are documented in the automation inventory for the customer to rebuild in Freshsales' visual journey builder.
Odoo Marketing Automation
Workflow Activity (Email)
Freshsales
Email Template / Workflow Action
1:1Odoo email activities within Automation Rules reference an Email Template (mail.template). We extract the template name, subject, body HTML, and attachment references. The template body HTML loads into Freshsales' email template storage. The activity trigger (e.g., send immediately, send after X days) is documented as a Freshsales Workflow step for the admin to configure post-migration.
Odoo Marketing Automation
Email Template
Freshsales
Email Template
1:1Odoo Email Templates (mail.template) migrate as Freshsales Email Templates. We extract template name, subject, body HTML (with inline images converted to accessible URLs), and model_id (which determines which record type the template applies to). Variable placeholders in Odoo's {{object.field}} syntax are documented and mapped to Freshsales' {{contact.field_name}} variable syntax where applicable.
Odoo Marketing Automation
Mass Mailing
Freshsales
Campaign / Email Sequence
lossyOdoo Mass Mailings (mailing.mailing) migrate as Freshsales Campaign email records or email sequence steps. We extract subject, mailing_type (email/SMS/mail), body HTML, scheduled_date, recipient_count, and mailing_state. The recipient list is resolved by re-querying the Odoo Contact or Lead domain at migration time, since the mailing record itself only stores a domain filter rather than a static recipient list.
Odoo Marketing Automation
Users / Owners
Freshsales
Users
1:1Odoo user accounts (res.users) referenced as create_uid, write_uid, and assignees on CRM and automation records map to Freshsales Users by email match. We extract login (email), name, and active status. Any Odoo user without a matching Freshsales User by email is placed in a reconciliation queue for the customer's admin to provision before record import proceeds.
| Odoo Marketing Automation | Freshsales | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Campaign | Sales Campaign1:1 | Fully supported | |
| Automation Rule | Workflow / Action Setlossy | Fully supported | |
| Workflow Activity (Email) | Email Template / Workflow Action1:1 | Fully supported | |
| Email Template | Email Template1:1 | Fully supported | |
| Mass Mailing | Campaign / Email Sequencelossy | Fully supported | |
| Users / Owners | Users1:1 | Mapping required |
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.
Odoo Marketing Automation gotchas
External API access is gated behind the Custom plan
Automation rules with Python server actions cannot replay on non-Odoo destinations
No native conversion tracking within Marketing Automation
Two dependent apps must both be installed for full feature access
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
Pair-specific challenges
Migration approach
Discovery and plan-tier check
We audit the source Odoo database: plan tier (Standard or Custom), active apps (Marketing Automation, Email Marketing, SMS Marketing), record volumes per object (Contacts, Leads, Opportunities, Campaigns, Automation Rules, Email Templates), and custom field definitions via ir.model.fields. We confirm XML-RPC API availability during this call and determine whether extraction uses the API (Custom plan) or CSV export from list views (Standard plan). We also identify which Odoo users correspond to CRM owners and whether the destination Freshsales tenant has the Growth-tier marketing automation license needed to host migrated campaigns.
Automation inventory and Python-flag extraction
We extract all Automation Rules (marketing.activity records) with their trigger_type, filter_domain, and action chain, flagging every rule that contains a Python Code activity. We extract Campaign metadata (name, target model, audience domain, state, participant counts) and Email Template metadata (name, subject, body HTML, model reference). We produce the automation inventory document before any data extraction begins so that the customer understands the rebuild scope and can allocate admin time to the Freshsales workflow builder post-migration. Python-dependent rules are explicitly excluded from migration and marked as manual-rebuild items.
Data extraction and cleansing
For Custom-plan databases, we pull Contacts, Leads, Opportunities, and Email Templates via XML-RPC using Odoo's external API endpoint (/xmlrpc/2/object) with the res.partner, crm.lead, and mail.template models. For Standard-plan databases, we export CSV files from Odoo's list views and normalize the field names. We deduplicate Contacts that share the same email address, flag incomplete records missing required fields (name, email), and validate email format against RFC 5322 before loading into Freshsales. Data cleansing is a separate chargeable phase if record quality issues exceed 15 percent of total volume.
Freshsales schema preparation and owner reconciliation
We create custom fields on Freshsales Contacts, Leads, and Deals to host Odoo-specific data (odoo_partner_id, odoo_stage__c, odoo_lost_reason__c) and to store any Odoo custom field values that have no Freshsales standard equivalent. We extract Odoo user accounts by email and match them against Freshsales Users. Any Odoo user without a matching Freshsales User is placed in a reconciliation queue for the customer's admin to provision before record import proceeds, because OwnerId references are required on Leads, Contacts, and Deals.
Production migration in dependency order
We run production migration in this sequence: Contacts (with tags resolved), Leads (with stage name mapping applied and original stage stored in odoo_stage__c), Deals (with partner_id resolved to Contact or Account, probability migrated, owner resolved), Email Templates (HTML body loaded into Freshsales template storage), and Campaign metadata (as Freshsales Sales Campaign records). Automation Rules are not migrated as code — they are documented in the automation inventory delivered at step 2. Each phase emits a row-count reconciliation report before the next phase begins, and we validate a random sample of 25-50 records against the Odoo source.
Cutover, delta migration, and automation handoff
We freeze writes on the Odoo source during the cutover window, run a final delta migration for any records created or modified since the initial extraction, then set Freshsales as the system of record. We deliver the automation inventory document to the customer's Freshsales admin, which lists every Odoo Campaign and Automation Rule with its trigger, conditions, action chain, and recommended Freshsales Workflow equivalent. We support a three-day hypercare window where we resolve any reconciliation discrepancies raised by the customer's team. We do not rebuild Odoo Automation Rules as Freshsales Workflows as part of the migration scope — that is a separate rebuild engagement or internal admin task.
Platform deep dives
Odoo Marketing Automation
Source
Strengths
Weaknesses
Freshsales
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 Odoo Marketing Automation and Freshsales.
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
Odoo Marketing Automation: Not publicly documented by Odoo.
Data volume sensitivity
Odoo Marketing Automation 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 Odoo Marketing Automation to Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Marketing Automation to Freshsales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Odoo Marketing Automation
Other ways to arrive at Freshsales
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.