CRM migration
Field-level mapping, validation, and rollback between Onsite CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Onsite CRM
Source
Odoo CRM
Destination
Compatibility
9 of 13
objects map 1:1 between Onsite CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Onsite CRM to Odoo CRM is a migration from a limited Weebly-hosted platform with no public API to a full open-source ERP suite with a mature XML-RPC and JSON-RPC interface. Onsite CRM exports data only through in-app CSV, which constrains extraction to whatever fields the UI exposes and limits record volume. Odoo CRM uses a partner-centric data model where res.partner serves as both Contact and Company depending on the is_company flag, and crm.lead serves as the lead and opportunity record with stage management through crm.stage. We extract Onsite CRM records as CSV, normalize them against the UI-exposed schema, resolve the Contact-Company relationship before import, and load into Odoo through the XML-RPC API with batch chunking. Workflows, automations, and sequence tools do not migrate; we deliver a written inventory of any configured automations for the customer's Odoo admin to rebuild in Odoo's Studio or automated actions framework.
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 Onsite 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.
Onsite CRM
Contact
Odoo CRM
res.partner (Contact)
1:1Onsite CRM Contact records map to Odoo res.partner with is_company=False. The email field maps to email, phone maps to phone, and the contact name maps to name. We use email as the deduplication key during import. If Onsite CRM stores a contact's associated Company as a lookup field, we resolve that reference after the Company phase completes and backfill partner_id on each Contact record.
Onsite CRM
Company
Odoo CRM
res.partner (Company)
1:1Onsite CRM Company records map to Odoo res.partner with is_company=True and commercial_partner_id pointing to itself. Company name maps to name, domain maps to website, and address fields map to street, city, state, zip, country using Odoo's partner address fields. Company records import first because Contact records reference them via partner_id or commercial_partner_id.
Onsite CRM
Deal
Odoo CRM
crm.lead
1:1Onsite CRM Deal records map to Odoo crm.lead. The deal name maps to name, deal value maps to planned_revenue, close date maps to date_deadline, and stage maps to stage_id via a stage lookup resolved against Odoo's crm.stage table. We preserve the original Onsite CRM deal ID in a custom field x_onsite_deal_id__c on the Odoo lead for audit and cross-reference.
Onsite CRM
Pipeline Stage
Odoo CRM
crm.stage
lossyOnsite CRM pipeline stages are extracted during scoping by requesting screenshots of the pipeline configuration from the customer. Each stage name maps to a crm.stage record within the appropriate crm.team. Probability percentages from Onsite CRM map to Odoo stage probability values. We create the stage records in Odoo before Deal import begins.
Onsite CRM
Activity (Call)
Odoo CRM
crm.phone.call
1:1Onsite CRM call logs migrate to Odoo's crm.phone.call model if the Odoo CRM instance has the phone module active. The call direction (inbound/outbound) maps to direction, duration maps to duration, and the call notes map to description. If crm.phone.call is not available in the customer's Odoo edition, call logs migrate as mail.message records on the related crm.lead.
Onsite CRM
Activity (Email)
Odoo CRM
mail.message
1:1Onsite CRM email records migrate as mail.message entries attached to the relevant res.partner or crm.lead via model and res_id. The email subject becomes message_subject, body becomes body_html, and the email date becomes date. We reconstruct the email thread by matching message_id headers if available, otherwise import as standalone entries.
Onsite CRM
Activity (SMS)
Odoo CRM
mail.message
1:1Onsite CRM SMS records migrate as mail.message with a note subtype and a custom x_onsite_sms__c flag to distinguish them from internal notes. SMS content and timestamp map to body and date respectively. We attach each message to the related partner or lead record using the same model-res_id pattern as email.
Onsite CRM
Activity (Meeting/Note)
Odoo CRM
mail.message or project.task
1:1Onsite CRM meeting records and general notes map to mail.message entries with a note subtype and meeting subtype respectively. Meeting location and scheduled time migrate as body content if available. If the customer uses Odoo Project to track follow-up tasks derived from meetings, we create project.task records linked to the crm.lead with the meeting context preserved in the task description.
Onsite CRM
Task
Odoo CRM
project.task
1:1Onsite CRM task records map to Odoo project.task. Task name maps to name, due date maps to date_deadline, assignee maps to user_id via email resolution against res.users, and status maps to stage_id within the Odoo project. We import tasks into a dedicated CRM project or the default Odoo Tasks project depending on the customer's configuration.
Onsite CRM
User
Odoo CRM
res.users
1:1Onsite CRM user records map to Odoo res.users via email match. The customer's Odoo admin provisions the destination users before migration begins. We reconcile Onsite CRM owner references against the provisioned user list and flag any owner without a matching Odoo user for admin provisioning. Active/inactive status maps from Onsite CRM to the Odoo active flag.
Onsite CRM
Tag
Odoo CRM
crm.tag
lossyOnsite CRM tags applied to Contacts or Deals migrate as crm.tag records. Each tag name maps to a tag in Odoo's crm.tag table, and the tag-lead relationship migrates via crm.lead.tag_ids. If the customer's Onsite CRM uses a tagging taxonomy with hierarchical categories, we normalize it to flat tags in Odoo and document the taxonomy mapping for the admin.
Onsite CRM
Custom Field (Contact)
Odoo CRM
ir.model.fields (Custom)
lossyOnsite CRM custom fields on Contact require manual scoping during discovery. We request screenshots of the Contact record layout to identify all visible custom fields. Each custom field is mapped to a corresponding custom field in Odoo created via Odoo Studio or ir.model.fields before Contact import. Field types (text, number, date, picklist) map to equivalent Odoo field types with appropriate column_index adjustments.
Onsite CRM
Custom Field (Deal)
Odoo CRM
ir.model.fields (Custom)
lossyCustom fields on Onsite CRM Deals migrate to custom fields on crm.lead in Odoo. The same scoping process applies: we request screenshots of the Deal record layout, create the corresponding custom fields in Odoo before migration, and map values during the Deal import phase. Any custom field that has no Odoo equivalent is flagged for manual review and documented in the migration inventory.
| Onsite CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (Contact)1:1 | Fully supported | |
| Company | res.partner (Company)1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Activity (Call) | crm.phone.call1:1 | Fully supported | |
| Activity (Email) | mail.message1:1 | Fully supported | |
| Activity (SMS) | mail.message1:1 | Fully supported | |
| Activity (Meeting/Note) | mail.message or project.task1:1 | Fully supported | |
| Task | project.task1:1 | Fully supported | |
| User | res.users1:1 | Fully supported | |
| Tag | crm.taglossy | Fully supported | |
| Custom Field (Contact) | ir.model.fields (Custom)lossy | Fully supported | |
| Custom Field (Deal) | ir.model.fields (Custom)lossy | 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.
Onsite CRM gotchas
No public API documentation found
Weebly-hosted infrastructure limits data access
Limited historical activity export
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 CSV extraction design
We audit Onsite CRM by requesting screenshots of every record type (Contacts, Companies, Deals, Activities) and pipeline configuration. We map the UI-exposed fields to a migration schema and design the CSV extraction sequence. Because Onsite CRM has no API, we guide the customer through the in-app export process and specify the export format (CSV column headers, delimiter, encoding) required for our ingestion pipeline. We confirm the record counts for each object and identify any custom fields that require Odoo Studio configuration before import.
Odoo schema preparation and stage configuration
We provision the Odoo destination environment: creating crm.stage records for each Onsite CRM pipeline stage, configuring crm.team assignments, creating any required custom fields on crm.lead and res.partner via Odoo Studio, and setting up res.users matching the Onsite CRM owner list. The Odoo admin confirms the stage probabilities and team assignments before we begin data loading. Schema is validated in an Odoo test database before production loading.
CSV extraction and data normalization
The customer exports data from Onsite CRM using our extraction specification. We receive the CSV files and run a normalization step that includes dedupe on email (for Contacts), company name normalization (for Companies), date format standardization, and null field handling. We generate a data quality report flagging incomplete records, missing required fields, and duplicate entries for the customer's review before import begins.
Sandbox migration and reconciliation
We run a full migration into an Odoo test environment using production-like data volume. The customer reconciles record counts (Contacts in, Companies in, Deals in, Activities in), spot-checks 20-30 records against the source CSV, and confirms the stage configuration and custom field mappings before production migration begins. Any mapping corrections or schema adjustments happen in this phase.
Production migration in dependency order
We run production migration in record-dependency order: Companies (res.partner with is_company=True), Contacts (res.partner with is_company=False and commercial_partner_id resolved), crm.stage records, Deals (crm.lead with stage_id and partner_id resolved), Users (validated against res.users provisioning), Tags (crm.tag), then Activities (mail.message attached to the correct res.partner or crm.lead). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation inventory delivery
We freeze Onsite CRM writes during cutover and run a final delta migration of any records modified during the migration window. We deliver the written automation inventory: a document listing any Onsite CRM automations, outreach sequences, or configured rules with a recommended Odoo automated action or Studio workflow equivalent for the customer's admin to rebuild. We support a 48-hour hypercare window for reconciliation issues. We do not rebuild automations in Odoo inside the migration scope.
Platform deep dives
Onsite CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 Onsite CRM and Odoo CRM.
Object compatibility
3 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
Onsite CRM: Not publicly documented.
Data volume sensitivity
Onsite 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 Onsite CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Onsite 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 Onsite 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.