CRM migration

Migrate from Odoo Marketing Automation to Twenty CRM

Field-level mapping, validation, and rollback between Odoo Marketing Automation and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

Odoo Marketing Automation logo

Odoo Marketing Automation

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

83%

10 of 12

objects map 1:1 between Odoo Marketing Automation and Twenty CRM.

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Odoo Marketing Automation to Twenty CRM is a migration from a full ERP suite marketing module to a purpose-built open-source CRM that does not include a native marketing automation engine. Odoo stores contacts and companies in a unified res.partner model; Twenty separates People from Companies. We resolve that structural difference during scoping, map Odoo CRM Leads and Opportunities to Twenty People and Opportunities respectively, and preserve tags, custom fields, and activity history across the move. Automation rules containing Python server actions cannot execute on Twenty because they reference Odoo-specific models and methods with no TypeScript equivalent. We flag every Python activity in the automation inventory and deliver it as a written rebuild guide. Mass mailing records migrate as archived campaign history; email templates migrate as content but not as executable workflows because Twenty has no marketing automation trigger system. The destination is self-hosted or cloud, with no per-user licensing for self-hosted deployments, which eliminates the Odoo Custom plan API gate that blocks programmatic exports on Standard.

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

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Odoo Marketing Automation objects map to Twenty CRM

Each row shows how a Odoo Marketing Automation object lands in Twenty CRM, 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 (res.partner type=contact)

maps to

Twenty CRM

Person

1:1
Fully supported

Odoo stores contacts in the res.partner table with a partner_type or is_company flag distinguishing individuals from organizations. We filter res.partner records where is_company is false and map them to Twenty Person records. The contact name, email, phone, and address fields transfer directly. Custom fields on the partner record carry over as key-value pairs. Tags on the Odoo contact become Twenty Person labels.

Odoo Marketing Automation

Lead (crm.lead)

maps to

Twenty CRM

Person (as leads)

1:1
Fully supported

Odoo CRM Leads map to Twenty Person records in the pre-conversion state. The lead name, email, phone, source, priority, and expected closing date transfer. Stage names vary by Odoo database and require a mapping table that we build during scoping. Odoo's lead-to-opportunity conversion data (lost_reason, won_date) migrates as custom fields on the Person record for audit. The customer decides whether to convert leads to opportunities during migration or preserve them as open People records.

Odoo Marketing Automation

Opportunity (crm.lead type=opportunity)

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Odoo CRM Opportunities map directly to Twenty Opportunities. Opportunity name, stage, expected revenue, close date, lost reason, and priority transfer. The Odoo crm.lead stage field maps to Twenty Opportunity stage values, and we configure the destination stage pipeline before migration. Partner (account) lookup resolves to the target Company record via the partner_id foreign key.

Odoo Marketing Automation

Company (res.partner type=company)

maps to

Twenty CRM

Company

1:1
Fully supported

Odoo organizations stored in res.partner with is_company=true map to Twenty Company records. Company name, website, address, industry, and employee count transfer. The domain field on the Odoo company record populates the Company domain. We handle the parent_company hierarchy where it exists in Odoo, linking subsidiaries to parent Companies via the parent_id relationship.

Odoo Marketing Automation

Campaign

maps to

Twenty CRM

Workspace or custom target

lossy
Fully supported

Odoo Marketing Automation Campaigns map as named containers in Twenty CRM. Twenty does not have a native Campaign object equivalent to Odoo's marketing campaign container, so we create a naming convention using a workspace prefix or a custom target label that groups related Opportunities and People by campaign origin. Campaign state (active, draft, archived) migrates as a tag on the grouped records.

Odoo Marketing Automation

Automation Rule (不含Python活动)

maps to

Twenty CRM

Written inventory (no execution)

1:1
Fully supported

Odoo Automation Rules with trigger types of time-based, email event, or server action (excluding Python Code) are documented in full. We capture the rule name, trigger type, filter domain (the domain widget conditions), action chain (send email, update record, create task), timing, and child activity links. This becomes a written automation inventory that the customer's admin uses to rebuild equivalent logic in their chosen automation tool (e.g., Zapier, Make, or a dedicated MAP). Python Code activity blocks are flagged separately as non-rebuildable without custom development.

Odoo Marketing Automation

Workflow Activity (Email, SMS, Update Record, Create Task)

maps to

Twenty CRM

Written inventory (no execution)

1:1
Fully supported

Individual workflow steps within an Automation Rule are documented as part of the automation inventory. Email activity steps capture the template reference and timing. SMS steps capture the SMS template and recipient logic. Update Record steps capture the field and new value. Create Task steps capture the assignee, deadline, and description. Each activity step is mapped to its parent Automation Rule for complete rebuild context.

Odoo Marketing Automation

Mass Mailing

maps to

Twenty CRM

Note or activity log

1:1
Fully supported

Odoo Email Marketing mass mailing records migrate as archived campaign history. Subject, scheduled date, recipient count, and sent/failed/delivered metrics transfer to a Note record or custom activity log on the relevant Campaign grouping. Email body HTML migrates as a Note attachment for reference. Delivery receipts and bounce data do not have a Twenty equivalent and are preserved in the mass mailing inventory for post-migration review.

Odoo Marketing Automation

Email Template

maps to

Twenty CRM

Note (template reference)

1:1
Fully supported

Odoo Email Templates (mail.template model) migrate as Note records with the template name, subject, and HTML body preserved. Inline images and variable placeholders (${object.field}) are flagged as needing manual revision because Twenty does not execute template rendering. The template serves as a content reference for the customer's team to recreate in their chosen email tool.

Odoo Marketing Automation

Custom Field

maps to

Twenty CRM

Custom Field

lossy
Fully supported

Odoo custom fields added via Odoo Studio or ir.model.fields migrate as key-value pairs on the parent record. Field types (char, integer, many2one, date, etc.) are read from ir.model.fields metadata and mapped to the equivalent type in Twenty's schema. Many2one relations (e.g., custom fields pointing to a product or user) are resolved to the migrated record ID or flagged for manual resolution if the target record type is not in scope.

Odoo Marketing Automation

Tag

maps to

Twenty CRM

Label

1:1
Fully supported

Odoo tags on Contacts, Leads, and Opportunities (stored in ir.attachment as a tagging model) migrate as string arrays and reassign by name as Twenty Labels on Person and Opportunity records. Tag color metadata from Odoo does not transfer as Twenty does not have an equivalent color-coding attribute on Labels.

Odoo Marketing Automation

User / Owner

maps to

Twenty CRM

User

1:1
Fully supported

Odoo user accounts referenced as create_uid, write_uid, and assignees on CRM records and automation rules map to Twenty User records by email match. Any Odoo Owner without a matching Twenty User is held in a reconciliation queue for the customer's admin to provision before record import resumes. Inactive Odoo users map to inactive Twenty Users to preserve ownership history.

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

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Python server-action blocks cannot execute on Twenty

    Odoo Marketing Automation supports a Python Code activity type that executes arbitrary server-side logic referencing Odoo models, methods, and environment context. Twenty CRM is built in TypeScript with no server-side Python runtime. Every automation rule containing a Python activity is flagged as non-rebuildable without custom TypeScript development. We document the Python block contents, the Odoo model it references, and the intended outcome, and the customer's engineering team rebuilds it as a TypeScript extension or external automation tool integration. All other rule metadata (triggers, timing, email activities, Update Record steps) migrates in full.

  • Standard plan API restriction blocks programmatic exports

    Odoo's XML-RPC External API is available only on the Custom plan ($61/user/month). Standard plan databases cannot programmatically export Contacts, Leads, Campaigns, or automation rules. We work around this by using Odoo's native CSV/XLS export from list views, which is slower, requires manual scoping of each view, and does not export automation rule metadata. We confirm API availability during discovery and adjust the extraction method accordingly. If the database is on Standard, the automation rule inventory requires manual export from the Marketing Automation UI per rule.

  • Twenty has no native marketing automation engine

    Odoo Marketing Automation is a marketing automation platform embedded in an ERP. Twenty CRM is a CRM with no built-in equivalent to campaign builders, email/SMS automation triggers, or lead scoring. Automation rules, mass mailing schedules, and workflow activities do not have a functional equivalent to migrate to. We deliver a complete written inventory of every automation rule and workflow activity with enough context for the customer's team to rebuild in a dedicated marketing automation platform. We do not rebuild or configure any marketing automation in Twenty.

  • Partner-to-company restructure requires disambiguation

    Odoo's res.partner model stores contacts and companies in the same table with an is_company flag. Twenty separates Companies and People into distinct objects with a Person-Company relationship link. The migration must split the partner table at read time, filtering contacts from companies and linking Person records to Company records via the parent_id relationship. Parent-child company hierarchies in Odoo require mapping to the Company nesting model in Twenty. This disambiguation step adds scope that a simple contact-to-contact migration does not have.

  • Attachments do not migrate

    Odoo attachments stored in ir.attachment as binary blobs with path dependencies on the filestore are not migrated. This affects email template inline images, mass mailing assets, and any document attachments on Leads, Opportunities, or CRM records. We flag the existence of attachments during scoping and note the approximate volume. The customer's team must re-upload these assets post-migration if they are actively used.

Migration approach

Six steps for a successful Odoo Marketing Automation to Twenty CRM data migration

  1. Discovery and plan-gate audit

    We audit the source Odoo database across plan tier (Standard or Custom), active modules (Marketing Automation, Email Marketing, SMS Marketing), CRM module status, and API access method. We inventory every Campaign, Automation Rule, and Workflow Activity and flag Python Code activity blocks. We count Contacts, Leads, Opportunities, custom fields (via ir.model.fields), and mass mailing records. The discovery output is a written migration scope document with a data volume table, a Python activity flag list, and a recommendation on whether to use XML-RPC API or CSV export based on the plan tier.

  2. Schema design and partner disambiguation rule

    We design the destination schema in Twenty CRM. This includes creating the Company and Person objects (with any custom fields from ir.model.fields mapped by type), configuring the Opportunity pipeline with stage values mapped from Odoo's crm_stage table, and establishing the Person-to-Company link rule based on the parent_id field in Odoo's res.partner. We create a partner-disambiguation transform that runs before any Person or Company insert, separating contacts from organizations in the same source table. Custom field types are validated against Twenty's schema builder capabilities.

  3. Sandbox migration and reconciliation

    We run a full migration into a Twenty instance (self-hosted or cloud) using production-equivalent data volume. The customer's team reconciles record counts (Companies in, People in, Opportunities in), spot-checks 25-50 records against the Odoo source for field accuracy, and reviews the Person-to-Company link quality. Any mapping corrections, stage name adjustments, or custom field type changes happen in the sandbox before production migration begins.

  4. Owner reconciliation and user provisioning

    We extract every distinct Odoo user referenced as create_uid, write_uid, assignee, or rule owner on CRM records and automation rules and match by email against the Twenty destination's User table. Any Odoo user without a matching Twenty User goes to a reconciliation queue. The customer's admin provisions missing Users before production migration resumes. Automation rule owner assignment is preserved as a note on the rule inventory document.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Companies (from Odoo organizations), People (from Odoo contacts and leads, with the disambiguation transform applied), Opportunities (with Person and Company lookups resolved), Tags and Labels (by name), Custom Fields (as key-value pairs on parent records), Mass Mailing history (as Note records), Email Templates (as Note records with HTML content), and Automation Rule inventory (as written documentation). Each phase emits a row-count reconciliation report before the next phase begins.

  6. Automation rebuild handoff and cutover

    We deliver the complete automation rule inventory document covering every Campaign, Automation Rule, and Workflow Activity with trigger type, filter conditions, action chain, and a note on Python Code block status. This document is the input for the customer's team to rebuild automation logic in their chosen tool. We do not rebuild or configure automations in Twenty. We support a one-week hypercare window to resolve any record reconciliation issues. We coordinate the final cutover, freeze window on Odoo writes, and a delta import of any records modified during the migration window.

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.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 Twenty CRM.

  • 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 Twenty CRM 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 Twenty CRM data migrations

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

Can't find your answer?

Walk through your Odoo Marketing Automation to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Standard CRM migrations under 20,000 Contacts, 10,000 Leads, and 200 automation rules typically land between four and eight weeks. Projects with active Python server-action blocks, large mass mailing histories, multi-company Odoo deployments, or complex partner hierarchies requiring disambiguation move to ten to sixteen weeks because of the schema restructure and automation inventory documentation scope. Discovery alone takes one to two weeks regardless of size.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Odoo Marketing Automation.
Land in Twenty CRM, 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