CRM migration
Field-level mapping, validation, and rollback between Smarketing Cloud and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Smarketing Cloud
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Smarketing Cloud and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Smarketing Cloud to Odoo CRM is a migration from a closed, SMB-focused all-in-one platform to an open-source ERP suite with a user-based pricing model. Smarketing Cloud provides no published API documentation or public developer portal, which means we must build custom ETL pipelines from UI-based exports and screen-scraping where necessary. We audit the full export availability per account during discovery, flag any fields that do not map cleanly, and present them to the customer for resolution before import. Odoo CRM models leads and opportunities differently from Smarketing Cloud's Deal-centric structure: Odoo uses a crm.lead record that transitions through a pipeline and can be converted to a partner; we configure the stage names, probability weights, and conversion rules before migration. We do not migrate Workflows, Sequences, Automations, or Email Templates as code. We deliver a written inventory of every automation requiring rebuild in Odoo's Studio and ir.actions framework for the customer's admin to rebuild post-migration.
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 Smarketing Cloud 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.
Smarketing Cloud
Contact
Odoo CRM
res.partner
1:1Smarketing Cloud Contact records map to Odoo res.partner in address type (is_company=False). Standard fields (name, email, phone, website) map directly. Custom Contact properties migrate as custom partner fields created via Odoo's Settings > Technical > Custom Fields interface. The res.partner model in Odoo conflates individuals and organizations under one table with an is_company flag; we set is_company=False for all Contact records. Lifecycle stage from Smarketing Cloud maps to a custom stage field partner_stage__c and is preserved for reporting continuity.
Smarketing Cloud
Company
Odoo CRM
res.partner (is_company=True)
1:1Smarketing Cloud Company records map to Odoo res.partner with is_company=True. The Company-Contact linkage is preserved via the child_ids relationship on the parent res.partner record. We export Companies first, then Contacts, so the parent Company record exists before we create child Contact records with parent_id resolved.
Smarketing Cloud
Deal
Odoo CRM
crm.lead
1:1Smarketing Cloud Deals map to Odoo crm.lead in Opportunity mode (type='opportunity'). The deal amount, currency, and close date map to Odoo's expected_revenue, currency_id, and date_closed. Deal stage maps to Odoo stage_id by matching stage names; we configure the destination stage sequence before migration so the name-to-ID lookup resolves at import time. Pipeline assignment from Smarketing Cloud maps to crm.team_id in Odoo.
Smarketing Cloud
Pipeline
Odoo CRM
crm.team + crm.stage
lossyEach Smarketing Cloud Deal pipeline becomes an Odoo crm.team (sales team) with its own stage sequence. We extract the full stage order and probability weights from Smarketing Cloud and configure matching stage records in Odoo via the crm.stage model before Deal migration. Stage names that differ from Odoo defaults are created as new stage records scoped to the relevant team.
Smarketing Cloud
Campaign
Odoo CRM
crm.tag + mail.mailing
1:1Smarketing Cloud Campaign membership (which Contact was enrolled in which Campaign and when) migrates to Odoo as crm.tag records on the Contact partner record, with a custom Campaign enrollment date field campaign_enrolled_date__c. Active Campaign send history is documented as a mail.mailing configuration reference for the customer's admin to rebuild in Odoo's Email Marketing app if the customer licenses it.
Smarketing Cloud
Activity
Odoo CRM
mail.activity
1:1Smarketing Cloud activity logs (calls, emails, notes, tasks) linked to Contacts and Companies map to Odoo mail.activity records. Activity type from Smarketing Cloud maps to activity_type_id in Odoo (call, email, meeting, todo). The res.partner record is the activity's res_id target. Owner assignment maps by resolving Smarketing Cloud owner email to the corresponding Odoo res.users record via email match.
Smarketing Cloud
Attachment
Odoo CRM
ir.attachment
1:1File attachments linked to Contacts, Companies, or Activities are exported from Smarketing Cloud with their file URL and metadata. We download files to a staging bucket and re-upload to Odoo as ir.attachment records linked to the corresponding res.partner or crm.lead via res_model and res_id. The original filename and mimetype are preserved.
Smarketing Cloud
User
Odoo CRM
res.users
1:1Smarketing Cloud User records (name, email, role, team assignment) map to Odoo res.users. We map Smarketing Cloud roles to Odoo access rights groups (Employee, Sales Manager, Administrator). Inactive users can be exported but the migration scope excludes user provisioning; the customer's Odoo admin provisions active users before production migration.
Smarketing Cloud
Tag
Odoo CRM
crm.tag
1:1Tags applied to Contacts and Companies in Smarketing Cloud migrate to Odoo crm.tag records and are re-applied via the tag_ids many2many relationship on res.partner. Tag names are preserved as-is; Odoo creates tag records on import if they do not already exist. Bulk tag application uses Odoo's write operation on the partner record set.
Smarketing Cloud
List/Segment
Odoo CRM
crm.team + domain filter
lossyStatic Lists from Smarketing Cloud are exported as record sets and become Odoo crm.team membership records (team member assignments) plus a custom team_static_list__c field referencing the list name. Dynamic Segments are documented as domain filter criteria for the customer to recreate as Odoo saved filter views or team assignment rules.
Smarketing Cloud
Email Template
Odoo CRM
mail.template
lossySmarketing Cloud Email Templates with HTML content and variable placeholders export cleanly, but Odoo uses a different template variable syntax ({{field}} vs Odoo's {{object.field}} or {{ctx.get('field')}}). We extract the HTML body and variable names and deliver a template mapping document specifying the Odoo template reconstruction for each source template. The customer's admin rebuilds templates in Odoo Mail Composer using the mapping document as a guide.
Smarketing Cloud
Custom Object
Odoo CRM
Custom model (ir.model)
1:1Smarketing Cloud custom objects and their schemas (field definitions, record data) migrate to Odoo custom models created via ir.model and ir.model.fields before data import. The custom model API name is matched to the Smarketing Cloud custom object name. Custom object relationships (lookups to Contacts or Companies) are preserved as Odoo many2one fields pointing to res.partner or crm.lead. All custom field types are mapped to the closest Odoo field type (char, text, float, integer, date, many2one, selection) during schema design.
| Smarketing Cloud | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (is_company=True)1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Pipeline | crm.team + crm.stagelossy | Fully supported | |
| Campaign | crm.tag + mail.mailing1:1 | Fully supported | |
| Activity | mail.activity1:1 | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| User | res.users1:1 | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| List/Segment | crm.team + domain filterlossy | Fully supported | |
| Email Template | mail.templatelossy | Fully supported | |
| Custom Object | Custom model (ir.model)1: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.
Smarketing Cloud gotchas
No public API documentation or developer portal
Proprietary data format with no bulk export format documented
Performance bottlenecks during high-volume campaign sends
Limited historical data export for record history
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 export availability audit
We audit the source Smarketing Cloud account for exportable objects, custom properties, pipeline and stage configuration, user count, and engagement volume. Because Smarketing Cloud has no public API, we identify which UI-based export tools are available for each object and document any objects or fields that require alternative extraction methods. We pair this with an Odoo edition decision: Community (free, self-hosted) for cost-focused migrations, or Enterprise Cloud (from €44/user/mo) for teams wanting managed hosting and the full Odoo Apps library. The discovery output is a written migration scope with object inventory and any fields flagged as export-incomplete.
Odoo schema design and pipeline configuration
We configure the destination Odoo CRM schema before any data import. This includes creating custom partner fields (via Settings > Technical > Custom Fields) for Smarketing Cloud custom properties, configuring crm.team records (one per Smarketing Cloud pipeline), configuring crm.stage records with names and probability percentages matching the source, and deciding the Lead-Opportunity conversion strategy for each Deal record type. Custom models for any Smarketing Cloud custom objects are created via ir.model before migration. Schema is deployed into the customer's Odoo environment first and validated before production migration.
ETL pipeline build and staging migration
We build a custom ETL pipeline that parses Smarketing Cloud's export format, transforms each field to the target Odoo model and field, and loads records via Odoo's XML-RPC API. The pipeline handles dependency ordering (res.partner first, then crm.lead, then mail.activity) and parent-record lookup resolution. We run a full migration into a staging Odoo environment and reconcile record counts against the source export. The customer spot-checks 25-50 records and approves the staging result before production migration begins.
User and owner reconciliation
We extract every distinct Smarketing Cloud owner email referenced on Deals, Contacts, Companies, and Activities and match against the Odoo res.users table. Any owner without a matching Odoo user is added to a reconciliation queue. The customer's Odoo admin provisions missing users (active or inactive) before production migration continues. OwnerId resolution on crm.lead and res.partner records depends on this step completing successfully.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (Companies and Contacts), crm.lead (Deals with stage_id and team_id resolved), mail.activity (activity history via XML-RPC), crm.tag (tags applied via many2many write), ir.attachment (files downloaded and re-uploaded). Each phase emits a row-count reconciliation report before the next phase begins. We freeze writes in Smarketing Cloud during the production cutover window and run a final delta migration for any records modified during the window.
Cutover, validation, and automation inventory handoff
We enable Odoo as the system of record and run post-migration validation against a sample of 50-100 records across objects. We deliver the Automation and Email Template inventory document listing every Smarketing Cloud workflow and template requiring rebuild in Odoo Studio. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. We do not rebuild Smarketing Cloud Workflows as Odoo automated actions inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Smarketing Cloud
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 Smarketing Cloud 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
Smarketing Cloud: Rate limit documentation not published.
Data volume sensitivity
Smarketing Cloud 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 Smarketing Cloud to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Smarketing Cloud 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 Smarketing Cloud
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.