CRM migration
Field-level mapping, validation, and rollback between Prophet CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Prophet CRM
Source
Odoo CRM
Destination
Compatibility
11 of 15
objects map 1:1 between Prophet CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from Prophet CRM to Odoo CRM is a structural migration driven by teams outgrowing the Outlook-only dependency and seeking a modular ERP backbone. Prophet CRM stores all data embedded inside Microsoft Outlook with an OData API that has no bulk export endpoint, so we paginate through records in batches of 500 to 1,000 using OData skip and top parameters. We audit the Prophet department template schema before export because custom fields are scoped per department and may not appear in the default view. We sequence the export in dependency order (Companies first, then Contacts, then Opportunities, then Activities) to preserve relational links in Odoo. Custom fields, pipeline stages, and department assignments map to their Odoo equivalents through a pre-built Studio schema. We do not migrate Prophet Workflows or email templates as code; we deliver a written inventory for the customer's admin to rebuild in Odoo Server Actions and Automated Actions.
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 Prophet CRM 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.
Prophet CRM
Company
Odoo CRM
res.partner (company type)
1:1Prophet Company records map to Odoo res.partner records with is_company=True. Standard fields (name, street, city, state, country, phone, website, industry, employee_count, annual_revenue) map to their Odoo partner equivalents. The industry classification from Prophet maps to partner.category_id as tags if the customer's Prophet industry list is a picklist; otherwise it maps to a custom field x_prophet_industry. Company records are inserted first in the migration sequence so that Contact imports can resolve the parent company_id lookup.
Prophet CRM
Contact
Odoo CRM
res.partner (contact type)
1:1Prophet Contact records map to Odoo res.partner with is_company=False and parent_id pointing to the mapped Company partner. We freeze the Outlook bidirectional contact sync before extraction and re-enable it post-import to prevent duplicates. The Prophet contact email address is used as the Odoo partner dedupe key. Prophet contact title, phone, mobile, function (job title), and address fields map to their Odoo equivalents. Owner (assigned rep) maps to Odoo user_id via email match against Odoo res.users.
Prophet CRM
Opportunity
Odoo CRM
crm.lead (type=opportunity)
1:1Prophet Opportunity records map to Odoo crm.lead with type='opportunity'. The opportunity name maps to Odoo name, expected_revenue maps to planned_revenue, close_date maps to date_deadline, probability maps to probability, and description maps to description. Stage assignments migrate as stage_id by resolving the Prophet stage name against the Odoo stage sequence. Prophet owner maps to Odoo user_id via email match. Pipeline stage values are captured during scoping and pre-created in Odoo as stage records within the relevant team before migration begins.
Prophet CRM
Pipeline Stage
Odoo CRM
crm.stage
lossyProphet pipeline stages are configurable per department, meaning stage names vary across organizations and across Prophet departments. We capture the full stage list during the scoping audit (including per-department stage variations), create each stage as an Odoo crm.stage record within the customer's pipeline, and map the stage probabilities to Odoo probability percentages. Stage ordering is preserved by setting the Odoo sequence field. If Prophet stages are department-scoped, we assign the relevant Odoo crm.team to each stage record.
Prophet CRM
Department
Odoo CRM
crm.team
lossyProphet departments are a first-class concept with custom field templates and configurable cross-department read/write access. We map each Prophet department to an Odoo crm.team record. Department assignments on records (Contact.owner_department, Opportunity.department) migrate as the Odoo team_id reference. Team members (users in the Prophet department) map to crm.team.member_ids via Odoo user_id email match. Custom field schema variations per department require the custom field audit step before migration to ensure all department-specific fields are represented in Odoo.
Prophet CRM
Activity: Email
Odoo CRM
mail.message
1:1Prophet email tracking engagements (sent emails, tracked opens and clicks) map to Odoo mail.message records with message_type='email'. The message is linked to the parent crm.lead (Opportunity) and/or the related partner record via res_model='crm.lead' and res_id pointing to the migrated opportunity ID. Email body and subject transfer to body and subject fields. We do not migrate the full email thread chain as separate messages unless the customer specifically requests thread reconstruction; Prophet's OData export provides individual engagement records per email.
Prophet CRM
Activity: Call
Odoo CRM
crm.phone.call
1:1Prophet call log engagements map to Odoo crm.phone.call records if the Odoo instance has the crm_phone module installed; otherwise they map to mail.activity records with activity_type='call'. Call duration, disposition (outcome), and direction (inbound/outbound) transfer to call_duration, disposition, and direction fields on crm.phone.call, or to custom fields on mail.activity. The related partner and opportunity are linked via res_model and res_id on the record.
Prophet CRM
Activity: Meeting / Appointment
Odoo CRM
calendar.event
1:1Prophet appointment engagements map to Odoo calendar.event records. Start and end datetime preserve from Prophet, location transfers to location, and meeting title transfers to name. Attendees resolve by email match to Odoo res.partner records for contacts and crm.lead records for opportunities. If the Odoo instance has the calendar_sms or calendar module installed, the meeting links to the CRM record via calendar.event.res_id and res_model.
Prophet CRM
Activity: Task
Odoo CRM
mail.activity
1:1Prophet task engagements (follow-up tasks) map to Odoo mail.activity records. Task subject maps to activity_type_id (or a custom activity type if the customer has configured one), due date maps to date_deadline, priority maps to priority, and outcome maps to a custom result field or note. Assignment (owner) resolves via email match to Odoo user_id. Activities are inserted after their parent Contact, Company, and Opportunity records to satisfy the res_model and res_id foreign key.
Prophet CRM
Custom Fields
Odoo CRM
ir.model.fields (custom)
lossyProphet custom fields on Companies, Contacts, and Opportunities (plus department-template-scoped fields) require a mandatory pre-migration audit. We enumerate every custom field name, data type, and which departments use which templates. In Odoo, custom fields are created via Odoo Studio or as Python-defined fields in a custom module. Field types map: Prophet text to Odoo char or text, Prophet number to Odoo float or integer, Prophet date to Odoo date, Prophet picklist to Odoo selection or many2one, and Prophet boolean to Odoo boolean. Department-scoped fields that do not appear in the default view are explicitly included in the export and created as custom fields in Odoo before import.
Prophet CRM
Attachment
Odoo CRM
ir.attachment
1:1Prophet file attachments on Companies, Contacts, and Opportunities are extracted from the OData export as attachment metadata (filename, URL, mime_type, size) and stored in Odoo ir.attachment records linked via res_model and res_id to the migrated partner or crm.lead record. The actual file content is downloaded from Prophet's attachment URLs and uploaded to Odoo via xmlrpc/2/object using base64 encoding. If the attachment URL is inaccessible (expired token or deleted file), we record the attachment name and URL in a custom migration_notes field on the record for manual retrieval.
Prophet CRM
Owner / Assigned User
Odoo CRM
res.users
1:1Prophet Owner (assigned rep) on Contact, Company, and Opportunity records resolves by email match against the Odoo res.users table. We extract every distinct Prophet owner referenced on records during scoping, match each by email, and provision any missing Odoo users into a reconciliation queue for the customer to resolve before migration. Active owners must have a matching Odoo user before record import proceeds because user_id is a required foreign key on crm.lead in Odoo.
Prophet CRM
Note
Odoo CRM
note.note
1:1Prophet notes (free-text entries not tied to an engagement type) map to Odoo note.note records. The note body migrates as the Odoo note's content field. Notes linked to specific Contact, Company, or Opportunity records in Prophet migrate as note.note records with res_model and res_id linking to the corresponding Odoo partner or crm.lead. If the customer uses Prophet's internal messaging thread, those messages migrate as mail.message records.
Prophet CRM
Tag / Category
Odoo CRM
res.partner.category
lossyProphet tags on Contacts and Companies (industry tags, segment tags, custom labels) map to Odoo res.partner.category records as partner tags. Tags are created as category records in Odoo before the partner migration phase, and partner.category links are created via the Odoo partner category many2many field during partner import. Prophet tags that do not have an Odoo equivalent are flagged in the scoping report for the customer to confirm before creation.
Prophet CRM
Prophet Product (if used)
Odoo CRM
product.template
1:1If the customer uses Prophet's product catalog for Opportunity line items, we map product records to Odoo product.template. Prophet product name, SKU, unit price, and description map to Odoo name, default_code (sku), list_price, and description. Product categories map to Odoo product.category. The migrated products are linked to Opportunity line items via the Odoo sale.order or crm.lead.line_ids mechanism depending on whether the customer uses Odoo CRM quoting.
| Prophet CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Company | res.partner (company type)1:1 | Fully supported | |
| Contact | res.partner (contact type)1:1 | Fully supported | |
| Opportunity | crm.lead (type=opportunity)1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Department | crm.teamlossy | Fully supported | |
| Activity: Email | mail.message1:1 | Fully supported | |
| Activity: Call | crm.phone.call1:1 | Fully supported | |
| Activity: Meeting / Appointment | calendar.event1:1 | Fully supported | |
| Activity: Task | mail.activity1:1 | Fully supported | |
| Custom Fields | ir.model.fields (custom)lossy | Mapping required | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Owner / Assigned User | res.users1:1 | Fully supported | |
| Note | note.note1:1 | Fully supported | |
| Tag / Category | res.partner.categorylossy | Fully supported | |
| Prophet Product (if used) | product.template1: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.
Prophet CRM gotchas
Prophet CRM renamed to Avid CRM mid-lifecycle
No bulk export API in Prophet CRM
Custom field audit required before export scoping
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 custom field audit
We audit the source Prophet CRM portal across tiers (Standard, Professional, Enterprise), all department templates, custom field schemas per object per department, pipeline and stage configurations, active owner list, engagement volume (email, call, meeting, task record counts), and any attachment storage volume. We pair this with Odoo edition confirmation: Odoo CRM Online (from ~$25/user/mo) for cloud-hosted; Odoo On-Premise for self-hosted. The discovery output is a written migration scope document including the custom field schema, stage mapping table, owner reconciliation list, and a go/no-go on the migration timeline based on data volume.
Odoo Studio schema design and custom field creation
We design the destination schema in Odoo using Studio or a custom module. This includes creating all custom fields discovered in the Prophet audit as typed Odoo fields on the relevant models (res.partner, crm.lead). We pre-create Odoo crm.team records for each Prophet department, crm.stage records for each Prophet pipeline stage (with correct sequence and probability), and res.partner.category tags for Prophet tag lists. Stage probabilities are set on each stage record. Schema is deployed into the destination Odoo environment before any data import begins.
Outlook sync freeze and Prophet OData extraction
We instruct the customer's admin to freeze the Outlook bidirectional contact sync before extraction begins to prevent the live sync from creating duplicate contact records during the export window. We then extract Prophet data via paginated OData requests in dependency order: Companies first (no foreign key dependencies), then Contacts (resolving parent_id against Companies), then Opportunities (resolving partner_id, user_id, and stage_id), then Activities (resolving res_model and res_id against the migrated records). Each object batch is validated for record count against the Prophet UI before proceeding.
Odoo XML-RPC import in dependency order
We import records into Odoo using xmlrpc/2/object with batch chunking of up to 100 records per request, applying rate-limit backoff on 403 responses. The sequence is: (1) res.partner.company records, (2) res.partner.contact records with parent_id resolved, (3) crm.team records for departments, (4) crm.stage records for stages, (5) crm.lead.opportunity records with user_id and partner_id resolved, (6) mail.message and mail.activity records with res_model and res_id pointing to the migrated records, (7) calendar.event records, (8) ir.attachment records with base64-encoded file content, (9) note.note records. Owner resolution (user_id) is validated before step 5.
Reconciliation and validation
We produce a row-count reconciliation report for each object, comparing the Prophet source count against the Odoo destination count. We flag any records rejected during import (due to validation rule failures, missing required fields, or type mismatches) and surface them to the customer for correction in Prophet before a correction run. We spot-check 25-50 migrated records manually against the Prophet source for field-level accuracy. Any attachment that could not be downloaded is flagged in the migration notes with the original URL for manual retrieval.
Cutover, delta migration, and Workflow rebuild handoff
We freeze Prophet writes during cutover, run a final delta migration of any records modified during the migration window, then re-enable the Outlook sync (if applicable) and designate Odoo as the system of record. We deliver a written inventory of all Prophet Workflows, automations, and email templates that do not migrate to Odoo, with a mapping to Odoo Server Actions and Automated Actions for the customer's admin or Odoo partner to rebuild. We support a one-week hypercare window for reconciliation issues. We do not rebuild Prophet Workflows as Odoo Server Actions inside the migration scope; that is a separate engagement.
Platform deep dives
Prophet CRM
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 Prophet CRM 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
Prophet CRM: Not publicly documented.
Data volume sensitivity
Prophet CRM 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 Prophet CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Prophet CRM 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 Prophet CRM
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.