CRM migration
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
Source
Twenty CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Odoo Marketing Automation and Twenty CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
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.
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 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)
Twenty CRM
Person
1:1Odoo 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)
Twenty CRM
Person (as leads)
1:1Odoo 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)
Twenty CRM
Opportunity
1:1Odoo 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)
Twenty CRM
Company
1:1Odoo 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
Twenty CRM
Workspace or custom target
lossyOdoo 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活动)
Twenty CRM
Written inventory (no execution)
1:1Odoo 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)
Twenty CRM
Written inventory (no execution)
1:1Individual 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
Twenty CRM
Note or activity log
1:1Odoo 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
Twenty CRM
Note (template reference)
1:1Odoo 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
Twenty CRM
Custom Field
lossyOdoo 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
Twenty CRM
Label
1:1Odoo 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
Twenty CRM
User
1:1Odoo 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.
| Odoo Marketing Automation | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact (res.partner type=contact) | Person1:1 | Fully supported | |
| Lead (crm.lead) | Person (as leads)1:1 | Fully supported | |
| Opportunity (crm.lead type=opportunity) | Opportunity1:1 | Fully supported | |
| Company (res.partner type=company) | Company1:1 | Fully supported | |
| Campaign | Workspace or custom targetlossy | Fully supported | |
| Automation Rule (不含Python活动) | Written inventory (no execution)1:1 | Fully supported | |
| Workflow Activity (Email, SMS, Update Record, Create Task) | Written inventory (no execution)1:1 | Fully supported | |
| Mass Mailing | Note or activity log1:1 | Fully supported | |
| Email Template | Note (template reference)1:1 | Fully supported | |
| Custom Field | Custom Fieldlossy | Fully supported | |
| Tag | Label1:1 | Fully supported | |
| User / Owner | User1:1 | 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.
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
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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.
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
Odoo Marketing Automation
Source
Strengths
Weaknesses
Twenty 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 Odoo Marketing Automation and Twenty 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
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 Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Odoo Marketing Automation
Other ways to arrive at Twenty 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.