CRM migration

Migrate from Odoo Marketing Automation to Freshsales

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 logo

Odoo Marketing Automation

Source

Freshsales

Destination

Freshsales logo

Compatibility

78%

7 of 9

objects map 1:1 between Odoo Marketing Automation and Freshsales.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Odoo Marketing Automation logo

Odoo Marketing Automation

What's pushing teams away

  • Custom Python code required for non-standard automation logic forces teams to hire Odoo developers or learn server actions to do anything outside the built-in activity types.
  • API access restricted to the Custom plan tier ($61/user/month) locks out smaller teams from programmatic data exports, bulk imports, and third-party integrations.
  • Two separate apps (Email Marketing and Marketing Automation) must be installed together for full functionality, creating confusion about feature ownership and workflow scope.
  • Reporting limitations — no native conversion tracking, weak analytics dashboards, and no built-in revenue attribution — push data-driven teams toward dedicated marketing automation platforms.

Choosing

Freshsales logo

Freshsales

What's pulling them in

  • Lowest barrier to entry among major CRMs — the free tier supports up to 3 users and includes core CRM functionality before committing to per-seat pricing.
  • Built-in chat, email, and phone reduce reliance on third-party integrations for basic sales communication and contact management.
  • Freddy AI contact scoring and deal insights are included on Pro plans at a lower price than comparable HubSpot tiers.
  • Kanban pipeline views across Contacts, Accounts, and Deals provide visual deal management without requiring custom configuration.
  • Integration with the broader Freshworks ecosystem (Freshdesk, Freshchat, Freshservice) reduces tool sprawl for teams already using Freshworks.

Object mapping

How Odoo Marketing Automation objects map to Freshsales

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

maps to

Freshsales

Contact

1:1
Fully supported

Odoo 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

maps to

Freshsales

Lead

1:1
Fully supported

Odoo 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

maps to

Freshsales

Deal

1:1
Fully supported

Odoo 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

maps to

Freshsales

Sales Campaign

1:1
Fully supported

Odoo 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

maps to

Freshsales

Workflow / Action Set

lossy
Fully supported

Odoo 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)

maps to

Freshsales

Email Template / Workflow Action

1:1
Fully supported

Odoo 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

maps to

Freshsales

Email Template

1:1
Fully supported

Odoo 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

maps to

Freshsales

Campaign / Email Sequence

lossy
Fully supported

Odoo 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

maps to

Freshsales

Users

1:1
Mapping required

Odoo 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.

Gotchas + challenges

What specifically takes care here

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 logo

Odoo Marketing Automation gotchas

High

External API access is gated behind the Custom plan

High

Automation rules with Python server actions cannot replay on non-Odoo destinations

Medium

No native conversion tracking within Marketing Automation

Medium

Two dependent apps must both be installed for full feature access

Freshsales logo

Freshsales gotchas

Medium

Freddy AI is Pro-tier only despite heavy marketing

High

Post-migration emails and sequences are disabled

Medium

Bot session credits are a one-time 500-session allocation

Medium

Phone credits charged per minute with no cap

Low

File storage limits scale with plan tier

Pair-specific challenges

  • Python server-action blocks cannot migrate to Freshsales

    Odoo Marketing Automation supports a Python Code activity type that executes arbitrary server-side logic referencing Odoo models and methods. These blocks have no equivalent on Freshsales or any other non-Odoo platform. We flag every automation rule containing a Python activity and present it as a manual-rebuild item in the automation inventory. All other rule metadata — triggers, conditions, timing, email activities, SMS activities, record-update actions — migrates fully. The rebuild scope for Python-dependent rules requires the customer's developer or admin to design equivalent Freshsales Workflow actions or custom code in Freshsales' extension framework.

  • Standard-plan Odoo databases lack external API access

    Odoo's XML-RPC External API is available only on the Custom plan ($61/user/month yearly). Standard-plan users cannot programmatically export Contacts, Leads, Campaigns, or automation rules. We work around this by using Odoo's native CSV/XLS export from list views for Standard-plan databases, which is slower, requires manual field selection per list view, and may not capture all custom fields. We confirm API availability during the discovery call and adjust the extraction method accordingly. If the customer is on Standard and has more than 5,000 records, we recommend upgrading to Custom or engaging Odoo support for a temporary upgrade before migration.

  • Marketing automation requires Freshsales Suite Growth or above

    Freshsales CRM (formerly Freshsales Classic) does not include marketing automation. The visual journey builder, behavioral segmentation, and campaign management features require Freshsales Suite with a Growth, Pro, or Enterprise tier license. If the customer purchases only Freshsales CRM (Sprout or Blossom), the Automation Rule metadata we migrate will have nowhere to execute. We confirm the destination Freshsales tier during scoping and flag any Campaign and Automation Rule migration as dependent on the customer securing the appropriate Suite tier.

  • Odoo Lead and Contact share a unified partner model

    Odoo does not separate Leads and Contacts at the database level — both are res.partner records distinguished by the type field. An Odoo Contact and an Odoo Lead can share the same res.partner ID if the Lead was created from an existing Contact. Freshsales maintains a strict Lead and Contact separation. We resolve this by checking the crm.lead type field: Leads (type='lead') map to Freshsales Lead; Contacts (type='contact' and customer=True) map to Freshsales Contact. When a crm.lead has type='opportunity', we map it to Freshsales Deal and attach it to the Account resolved from the partner_id.

  • Automation rules must be rebuilt in Freshsales' visual journey builder

    Odoo Automation Rules use a domain filter widget for audience targeting and a sequential activity chain for actions. Freshsales' visual journey builder uses a different mental model — triggers (event-based or time-based), branches (if/else conditions), and action nodes. The rule structure cannot be translated automatically. We deliver a written automation inventory for every Odoo Automation Rule and Campaign, documented with trigger, filter criteria, activity chain, and recommended Freshsales journey equivalent. The customer's Freshsales admin rebuilds these as Workflows post-migration. This is a manual process, not a code migration.

Migration approach

Six steps for a successful Odoo Marketing Automation to Freshsales data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Odoo Marketing Automation logo

Odoo Marketing Automation

Source

Strengths

  • Native integration with the broader Odoo suite (CRM, Sales, eCommerce, Inventory, Accounting) means automation can act on transactional data without ETL.
  • Transparent per-app pricing is far cheaper than per-contact platforms (HubSpot, Marketo) for large contact databases — a structural advantage for high-volume senders.
  • Drag-and-drop email editor and visual workflow builder usable without coding knowledge once the Odoo learning curve is cleared.
  • Multi-channel support: email, SMS, and social media campaigns orchestrated from one platform.
  • Open-source codebase (Community Edition) provides a no-licence path for teams with internal Odoo developers.

Weaknesses

  • Steep learning curve for the Odoo UI — reviewers consistently note beginners struggle to orient versus purpose-built marketing tools like Mailchimp or ActiveCampaign.
  • Segmentation depth is limited compared to dedicated marketing automation platforms; complex predicate logic requires technical or developer help.
  • Automation workflow flexibility is rigid for non-standard scenarios; multi-branch logic and dynamic content insertion are weaker than HubSpot or Klaviyo.
  • Reporting and analytics are basic — most teams add Odoo Studio reporting or external BI tools (Power BI, Metabase) for executive-grade dashboards.
  • Third-party integration out of the box is limited to the Odoo connector ecosystem; bespoke integrations require Odoo development.
Freshsales logo

Freshsales

Destination

Strengths

  • Generous free tier for small teams with core CRM functionality without per-seat costs.
  • All-in-one sales CRM with built-in telephony, chat, and email reducing third-party tool dependency.
  • Freddy AI contact scoring and deal predictions available on Pro tier.
  • Multiple pipeline views with Kanban and list options across all plans.

Weaknesses

  • Reports lack depth compared to competitors like HubSpot, with limited customization options.
  • Integration setup is poorly documented with no clear guides for connecting third-party tools.
  • AI features gated behind $39/user/month Pro tier despite marketing emphasis on Freddy AI.
  • Bot sessions limited to 500 one-time allocation with no monthly refresh.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo Marketing Automation and Freshsales.

  • Object compatibility

    B

    2 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Odoo Marketing Automation: Not publicly documented by Odoo.

  • Data volume sensitivity

    B

    Odoo Marketing Automation doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Odoo Marketing Automation to Freshsales migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Odoo Marketing Automation to Freshsales data migrations

Answers to the questions buyers ask most during Odoo Marketing Automation to Freshsales migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for databases under 20,000 total records (Contacts, Leads, Deals) with no custom objects and a clean automation rule set. Standard-plan Odoo databases with no API access add one to two weeks because CSV export from list views requires more manual scoping per object. Migrations with over 20,000 records, multiple active Automation Rules, custom Odoo Studio fields, or an Odoo database that spans CRM, Email Marketing, and SMS Marketing apps move to six to ten weeks because of extraction complexity, field type mapping, and automation inventory documentation scope.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Odoo Marketing Automation.
Land in Freshsales, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day