CRM migration
Field-level mapping, validation, and rollback between Levitate and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Levitate
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Levitate and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Levitate to Odoo CRM is a schema migration as much as a data migration. Levitate is a contact-centric keep-in-touch CRM organized around a single Contact object with Tags for segmentation and Key Dates driving date-triggered outreach. Odoo CRM uses a Lead-to-Opportunity-to-Customer pipeline model where leads qualify into opportunities tracked against a partner or company record. We resolve that schema shift during discovery: Levitate Contacts with no active deal enrollment become Odoo CRM Leads or Partners depending on the customer's lifecycle definition; Contacts with engagement history or renewal dates land in the right Odoo date-customized field before import. Because Levitate publishes no bulk export API, we extract contact records through the UI export and supplement with manual field pulls from Levitate Support for notes and engagement timestamps not available in self-serve. Tag assignments migrate as Odoo CRM Tags linked to the corresponding partner records. Automations, social media posts, and handwritten card records do not migrate; we deliver a written inventory of every active automation with its trigger, conditions, and recommended Odoo Server Action equivalent for the customer's admin to rebuild.
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 Levitate 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.
Levitate
Contact
Odoo CRM
res.partner (as Contact or Company)
1:manyLevitate Contacts map to Odoo res.partner, but the split decision must be made during discovery. Contacts with a company name set and no active email conversation enrollments become Odoo res.partner records of type company. Contacts without a company or with individual-specific data (birthday, personal renewal date) become res.partner records of type individual. The Odoo partner email field is the dedupe key. We resolve any duplicate email entries before import to avoid the Odoo duplicate-partner warning. If the customer uses Odoo Contactarshave or other dedupe modules, we coordinate the import sequence with those rules.
Levitate
Tag
Odoo CRM
crm.tag
1:1Levitate Tags map to Odoo CRM Tags (crm.tag model). Tags are stored as a many-to-many relationship between crm.tag and res.partner in the crm.tag.rel table. We preserve the full tag taxonomy including tag creation date where extractable, and write the tag list to the crm.tag model before any partner import so the foreign key references resolve at insert time. Tags used to drive automation enrollment states (e.g., 'in-birthday-sequence') are flagged separately for the customer to decide whether they become Odoo CRM Tags or notes.
Levitate
Key Date
Odoo CRM
Custom date fields on res.partner
lossyLevitate Key Dates (birthday, policy renewal, anniversary, custom age milestones) are Levitate-specific custom field types. We create custom date fields on the Odoo res.partner model before any contact import: x_birthday_date, x_policy_renewal_date, and x_custom_date_1 through x_custom_date_3 as needed. The Odoo Custom Fields module (apps.odoo.com) enables non-developer field creation from the UI; alternatively we use the Odoo ORM to create fields via XML-RPC before migration. Any Key Date field that cannot be mapped to a typed date field lands as a Char field with a warning flag in the reconciliation report.
Levitate
Campaign
Odoo CRM
crm.lead (as marketing campaign)
1:1Levitate Campaigns map to Odoo CRM crm.lead records with type=lead and a dedicated tag for campaign attribution. Campaign engagement stats (open rate, click rate, reply count) migrate as custom Float fields on the crm.lead record. Individual email performance within a campaign migrates as mail.message records linked to the corresponding crm.lead. Odoo does not have a native Campaign object in the base CRM module; campaign-level reporting requires grouping crm.lead by campaign tag or a custom reporting model.
Levitate
Automation
Odoo CRM
Server Action / Automated Action (documentation only)
1:1Levitate automations cannot be exported as JSON or portable workflow definitions. We extract the automation enrollment state for each contact (which sequences they are currently enrolled in, which steps they have completed) and preserve this as a tag or note on the res.partner record so the customer's Odoo admin can re-enroll contacts in rebuilt Automated Actions. We deliver a written automation inventory document listing every active Levitate automation with its trigger (tag applied, key date reached, email opened), conditions, delay steps, and recommended Odoo Automated Action equivalent using ir.cron triggers and domain filters. Rebuilding the automations is outside standard migration scope.
Levitate
Engagement: Email
Odoo CRM
mail.message (linked to res.partner)
1:1Levitate email engagement history migrates to Odoo mail.message records with model=res.partner and res_id pointing to the migrated partner ID. Email subject, body (HTML), and timestamp migrate directly. Attachments migrate as ir.attachment records linked to the mail.message via the relation_field. We use Odoo's XML-RPC create() call with the partner ID resolved before each message insert so the activity timeline on the partner form reflects the full Levitate history. Odoo's mail.tracking_email model captures delivery and open status if the Odoo email gateway is configured; we note this as a post-migration configuration step.
Levitate
Engagement: SMS
Odoo CRM
mail.message (subtype sms)
1:1Levitate SMS logs migrate as mail.message records with subtype=sms. The Odoo SMS module (iap_sms) or a third-party SMS provider module must be installed for the SMS subtype to render in the UI; otherwise messages appear as plain activity log entries. We extract the SMS thread from Levitate's contact view (UI-based, limited to recent messages) and write each message as a mail.message with model=res.partner and the original timestamp preserved.
Levitate
Engagement: Note
Odoo CRM
note.note (linked to res.partner)
1:1Levitate contact notes migrate to Odoo note.note records linked to the res.partner via the res_model and res_id fields. Rich text formatting in Levitate notes converts to plain text during extraction; any embedded images are saved as ir.attachment records with a reference link in the note body. Levitate profile notes that were requested directly from Levitate Support migrate as note.note records with a source=levitate_support flag for audit.
Levitate
Engagement: Call
Odoo CRM
note.note (subtype call)
1:1Levitate call engagement logs migrate as Odoo note.note records with a subtype field or a custom Char field call_disposition__c storing the call outcome. Call duration, disposition, and recording URL (if stored as a URL reference in Levitate) migrate to custom fields on the note.note record. The Odoo VoIP module (if installed) provides first-class call logging; without it, calls appear as note entries on the partner timeline.
Levitate
User (Levitate Owner)
Odoo CRM
res.users
1:1Levitate user accounts (owner, admin, member roles) map to Odoo res.users by email match. Levitate owner role assignments on Contact, Campaign, and Automation records resolve to the corresponding res.users ID in Odoo. If the customer uses the same email domain for Levitate and Odoo users, we match on email directly. If not, we build a user mapping table during discovery and the customer's Odoo admin provisions any unmatched users before record import begins. Levitate role definitions (admin vs member permission scopes) do not map to Odoo security groups automatically; we document the Levitate role structure for the admin to assign Odoo access rights groups post-migration.
Levitate
Social Media Post
Odoo CRM
Not migrated
1:1Levitate social media posts are stored as template references with scheduling metadata rather than as structured records. There is no documented export endpoint for social content. We do not migrate social media posts. We flag any social post templates that the customer wants to preserve and recommend re-creating them in Odoo's social module (if installed) or in a dedicated social media management tool as a separate implementation task.
Levitate
Handwritten Card Order
Odoo CRM
Not migrated
1:1Handwritten card orders are managed through a third-party fulfillment integration in Levitate and do not store recipient addresses as standalone contact data. Card order history is not accessible via export. We do not migrate handwritten card records. The customer should confirm any open card orders are fulfilled in Levitate before the account is closed, and re-establish the fulfillment integration separately if needed in Odoo.
| Levitate | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (as Contact or Company)1:many | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| Key Date | Custom date fields on res.partnerlossy | Fully supported | |
| Campaign | crm.lead (as marketing campaign)1:1 | Fully supported | |
| Automation | Server Action / Automated Action (documentation only)1:1 | Fully supported | |
| Engagement: Email | mail.message (linked to res.partner)1:1 | Fully supported | |
| Engagement: SMS | mail.message (subtype sms)1:1 | Fully supported | |
| Engagement: Note | note.note (linked to res.partner)1:1 | Fully supported | |
| Engagement: Call | note.note (subtype call)1:1 | Fully supported | |
| User (Levitate Owner) | res.users1:1 | Fully supported | |
| Social Media Post | Not migrated1:1 | Fully supported | |
| Handwritten Card Order | Not migrated1: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.
Levitate gotchas
No public API — automation logic is not exportable
Key Dates are Levitate-specific custom fields
Split billing requires manual credit card management
Flat-rate billing continues until cancelled
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 Levitate data audit
We audit the Levitate account through the UI: contact count, tag taxonomy, active campaign list, automation enrollment state, custom Key Date fields, and engagement history volume. Because there is no bulk API, we export the contact CSV manually, request profile notes from Levitate Support, and capture a screen-capture audit of every active automation. We pair this with an Odoo readiness review: confirming the CRM module is installed, checking the Odoo edition (Community vs Online vs.sh), verifying the Custom Fields app is installed or available, and reviewing any existing Odoo custom modules that could conflict with the import schema. The discovery output is a Migration Scope document and an Odoo custom field provisioning checklist.
Schema design and Lead-Opportunity-Partner split rule
We design the Odoo destination schema. This includes creating custom date fields on res.partner for every Levitate Key Date, creating CRM Tags for every Levitate Tag, defining Record Types and Sales Processes for any pipeline stages that map from Levitate campaign statuses, and defining the Contact-Lead-Partner split rule. The split rule specifies which Levitate contact properties (company name present, engagement score, enrollment in active sequence) determine whether a record lands as an Odoo Partner, Lead, or Opportunity. Schema changes are deployed to a staging Odoo database first for validation. Custom fields are created via the Custom Fields app or XML-RPC ORM call.
Odoo staging migration and reconciliation
We run a full migration into the Odoo staging environment using production data volume. We validate record counts: Levitate contact count vs Odoo imported res.partner count (Partners + Leads + Opportunities), Levitate tag count vs Odoo crm.tag count, and Levitate engagement record count vs Odoo mail.message count. We spot-check 25-50 records for field-level accuracy against Levitate source data. Any mapping corrections (wrong date field, missed tag assignment, missing engagement entry) happen here before production migration begins. The customer reviews and approves the staging results before we schedule the production cutover window.
Custom field provisioning and tag taxonomy creation
Before any contact records move to Odoo, we create the full schema in the production database. Custom date fields on res.partner are created via the Custom Fields app (Community) or directly via XML-RPC ORM create() on ir.model.fields (Online.sh). CRM Tags are bulk-created via XML-RPC write to crm.tag. Record Types and Sales Processes are configured for any pipeline stages. We validate that the migration user has write access to all fields via XML-RPC before proceeding. If the Odoo instance is on a shared Odoo Online environment, we coordinate with the customer's Odoo admin to ensure module installation permissions are in place.
Production migration in dependency order
We run production migration in Odoo dependency order: CRM Tags first (so foreign key references resolve), then res.partner records (Partners as companies, then individual contacts), then crm.lead records (Leads from Levitate contacts with campaign attribution), then Opportunities (from any Levitate contacts with deal enrollment), then mail.message records (engagements linked to the resolved res.partner ID), then ir.attachment records (document references). Each phase emits a row-count reconciliation report before the next phase begins. We use XML-RPC batch writes with Odoo's ormcache disabled during import to ensure field validation runs on every record.
Cutover, validation, and automation inventory handoff
We freeze Levitate data entry during cutover, run a final delta migration of any records modified in the Levitate window, then designate Odoo as the system of record. We deliver the Migration Automation Inventory document listing every Levitate automation with trigger, conditions, and recommended Odoo Automated Action equivalent, and the Migration Tag Taxonomy document mapping each Levitate tag to its Odoo crm.tag counterpart. We support a five-business-day hypercare window for reconciliation issues. We do not rebuild Levitate automations as Odoo Server Actions or Automated Actions; that is a separate engagement requiring an Odoo functional consultant.
Platform deep dives
Levitate
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Levitate and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Levitate and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Levitate and Odoo CRM.
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
Levitate: Not publicly documented.
Data volume sensitivity
Levitate 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 Levitate to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Levitate 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 Levitate
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.