CRM migration
Field-level mapping, validation, and rollback between Kinabase and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Kinabase
Source
Odoo CRM
Destination
Compatibility
10 of 18
objects map 1:1 between Kinabase and Odoo CRM.
Complexity
BStandard
Timeline
6-8 weeks
Overview
Moving from Kinabase to Odoo CRM is a structural migration because Kinabase's flexible Collection-and-Record data model has no direct equivalent in Odoo's opinionated schema. Each Kinabase Collection is a distinct entity type with its own field definitions, and Odoo requires a matching model (res.partner, crm.lead, product.template, or a custom model) before any records can be imported. We audit every Collection during discovery, classify it as a Contact, Company, Lead, Opportunity, or Product, and provision the corresponding Odoo field schema before migration begins. Linked collection fields (cross-collection references) are resolved as many2one lookups or denormalised ID text fields depending on what the target schema supports. Computed Fields are evaluated at migration time and stored as static values. Odoo workflow stages, automation triggers, and integration configurations do not migrate; we deliver a written inventory of these for your admin to rebuild in Odoo Studio or via a Python module.
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 Kinabase 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.
Kinabase
Collection (person-type records)
Odoo CRM
res.partner (address=False, contact_type=contact)
lossyPerson-type Kinabase Collections map to Odoo res.partner records with contact_type set to contact and address=False. We create the partner schema in Odoo (name, email, phone, custom fields) during the schema design phase before any records are loaded. The Kinabase Collection name becomes the Odoo model and field set. Each Collection requires its own field mapping because Kinabase schema is per-Collection rather than global.
Kinabase
Collection (organisation-type records)
Odoo CRM
res.partner (address=True, contact_type=company)
lossyOrganisation-type Kinabase Collections map to Odoo res.partner with contact_type=company, creating the parent record that individual contacts attach to via the child_id one2many relationship. If the original Kinabase Collection held both people and organisations, we split records by a type field or naming convention into company and contact partners during the transform phase.
Kinabase
Collection (deal or pipeline records)
Odoo CRM
crm.lead (type=opportunity)
lossyDeal-type Kinabase Collections map to Odoo crm.lead with type=opportunity. The crm module must be installed in the target Odoo database for crm.lead and crm.stage to exist. Pipeline stage values from Kinabase map to crm.stage records ordered by sequence, with probability percentages preserved as stage_properties. Closed-won and closed-lost outcomes are set via the crm.lead stage.kanban_state field.
Kinabase
Collection (inquiry or unqualified prospect records)
Odoo CRM
crm.lead (type=lead)
lossyCollections representing unqualified prospects, inbound inquiries, or pre-sales records map to Odoo crm.lead with type=lead. If the original Kinabase Collection contains both qualified and unqualified records, we split them by a status or stage field: leads map to type=lead, records with a deal value or signed scope map to type=opportunity. The customer decides the split rule during scoping.
Kinabase
Record
Odoo CRM
res.partner / crm.lead
1:1Individual Kinabase Records map row-by-row to Odoo partners or crm.lead records depending on their parent Collection's classification. We handle null values, empty strings, and multi-select dropdowns by mapping them to Odoo's equivalent field types (char, text, selection, many2many). Multi-select values migrate to Odoo tags (ir.attachment with res_model=res.partner) or many2many fields if the schema is pre-configured.
Kinabase
Field (typed columns)
Odoo CRM
Custom field on res.partner or crm.lead
lossyKinabase field types map to Odoo field definitions: text to char or text, number to float or integer, date to date, datetime to datetime, dropdown to selection, file attachment to binary. Custom fields are created on the Odoo model via XML-RPC before import. All non-standard fields require a field-level mapping because Kinabase has no global field registry — each Collection has its own independent schema.
Kinabase
Linked Collection Field
Odoo CRM
many2one or many2many field
1:1A Kinabase linked collection field (e.g., a Projects Collection with a Client field pointing to a Clients Collection) creates a cross-collection reference that Odoo must represent as a many2one foreign key on the child object. We export linked records in dependency order — parents first — and resolve the foreign key ID during the child load phase. Many-to-many linked fields (e.g., a Contact in multiple Teams) map to Odoo many2many relation tables. Orphaned references (linked record no longer exists) are preserved as a text field storing the original record identifier.
Kinabase
Computed Field
Odoo CRM
Stored char/float field
lossyKinabase computed Fields evaluate a formula at display time. Since Odoo Studio does not expose computed field formulas (computed fields require Python module development), we evaluate the formula at migration time and write the resulting value as a static stored field in Odoo. The formula logic is lost; only the computed result transfers. We flag every computed field in the pre-migration field audit and document the original formula for the customer's developer if they want to rebuild it as an Odoo computed field.
Kinabase
Activity (calls, emails, meetings)
Odoo CRM
mail.activity
1:1Kinabase activity records (engagement history on a record) map to Odoo mail.activity with activity_type_id set from the standard Odoo activity types (Email, Call, Meeting, Todo). Activity dates migrate as date and create_date; assigned user migrates as res.users by email match. The mail.thread mechanism on res.partner and crm.lead surfaces activities in Odoo's chatter UI automatically.
Kinabase
Task
Odoo CRM
project.task (if project module active) or mail.activity
1:1Kinabase standalone Tasks map to Odoo project.task if the project module is active and a project exists to host them. Without the project module, Tasks migrate as mail.activity records with activity_type_id=Todo. We verify whether the project module is installed during discovery and configure the mapping accordingly.
Kinabase
Engagement: Email
Odoo CRM
mail.message
1:1Kinabase email engagements migrate to Odoo mail.message records linked via mail.thread (res.partner, crm.lead, project.task) with message_type=email. Body content and subject line migrate as the message body; sender and recipient are mapped from the Kinabase engagement contact references. Email attachments migrate as ir.attachment records linked via mail.message.attachment.
Kinabase
Engagement: Call
Odoo CRM
mail.activity (activity_type_id=Call)
1:1Kinabase call engagements map to Odoo mail.activity with activity_type_id=Call. Call duration, disposition, and recording URL migrate to custom activity fields if pre-configured on the Odoo model. The activity date reflects the original call timestamp to preserve the chronological timeline in Odoo's chatter.
Kinabase
Engagement: Meeting
Odoo CRM
calendar.event
1:1Kinabase meeting engagements map to Odoo calendar.event with start_datetime, stop_datetime, and location preserved. Attendee links are created as calendar.attendee records pointing to the resolved res.partner and res.users records. The event is linked to the parent record (crm.lead, res.partner, project.task) via the calendar.event.res_id and res_model fields.
Kinabase
Engagement: Note
Odoo CRM
mail.message (message_type=comment)
1:1Kinabase engagement Notes migrate to Odoo mail.message with message_type=comment. The note body becomes the message body; attachments become ir.attachment records linked via mail.message.attachment. Notes are linked to the parent record via mail.thread, making them visible in the Odoo chatter pane for the corresponding partner or lead.
Kinabase
Document
Odoo CRM
ir.attachment
1:1Kinabase documents attached to records migrate as Odoo ir.attachment records. If the source document is a URL reference, we store the URL in the ir.attachment.url field. If the source provides a file blob via API, we download and upload it as binary. Actual file content transfer depends on whether the source export includes binary data; URL references are always migrated regardless of blob availability.
Kinabase
Stage
Odoo CRM
crm.stage
lossyKinabase pipeline stages map to Odoo crm.stage records ordered by sequence. The stage name, probability percentage, and is_won flag transfer. Kinabase automation triggers and approval gates are captured as a written inventory separate from the stage record; they do not migrate as executable code because Odoo automation requires a separate Studio or Python configuration.
Kinabase
Workflow
Odoo CRM
crm.team + crm.stage automation inventory
lossyKinabase workflows (stage progression rules, triggers, role-based permissions, scheduled actions) are captured as a structured written inventory during discovery. We document each workflow's trigger condition, actions, and stage mapping. Odoo CRM automations (server actions, automated actions on stage change) require configuration in Odoo Studio or Python development; the inventory provides the requirements spec for the customer's admin or Odoo partner to rebuild. Workflow execution logic does not migrate as functional code.
Kinabase
Tag (custom property)
Odoo CRM
res.partner.category (or custom tag model)
1:1Kinabase tags stored as multi-checkbox custom properties migrate to Odoo res.partner.category (the built-in partner tag system) via ir.model.data references. If the Kinabase tag vocabulary is large or used across multiple object types, we recommend a custom tag model rather than the standard partner category to avoid scope confusion.
| Kinabase | Odoo CRM | Compatibility | |
|---|---|---|---|
| Collection (person-type records) | res.partner (address=False, contact_type=contact)lossy | Fully supported | |
| Collection (organisation-type records) | res.partner (address=True, contact_type=company)lossy | Fully supported | |
| Collection (deal or pipeline records) | crm.lead (type=opportunity)lossy | Fully supported | |
| Collection (inquiry or unqualified prospect records) | crm.lead (type=lead)lossy | Fully supported | |
| Record | res.partner / crm.lead1:1 | Fully supported | |
| Field (typed columns) | Custom field on res.partner or crm.leadlossy | Fully supported | |
| Linked Collection Field | many2one or many2many field1:1 | Fully supported | |
| Computed Field | Stored char/float fieldlossy | Fully supported | |
| Activity (calls, emails, meetings) | mail.activity1:1 | Fully supported | |
| Task | project.task (if project module active) or mail.activity1:1 | Fully supported | |
| Engagement: Email | mail.message1:1 | Fully supported | |
| Engagement: Call | mail.activity (activity_type_id=Call)1:1 | Fully supported | |
| Engagement: Meeting | calendar.event1:1 | Fully supported | |
| Engagement: Note | mail.message (message_type=comment)1:1 | Fully supported | |
| Document | ir.attachment1:1 | Fully supported | |
| Stage | crm.stagelossy | Fully supported | |
| Workflow | crm.team + crm.stage automation inventorylossy | Fully supported | |
| Tag (custom property) | res.partner.category (or custom tag 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.
Kinabase gotchas
API access gated behind a support request
100 req/min rate limit slows large exports
Computed Field values are not stored data
Linked collection fields require relationship re-establishment
Only administrators can export all data
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 credential procurement
We audit every Kinabase Collection via the admin CSV panel (or API once credentials are provisioned) and document the schema for each: field names, field types, dropdown values, computed field formulas, and linked collection references. We simultaneously request Kinabase API credentials from [email protected] to enable programmatic export. We verify Odoo module availability (crm module installed, Community vs Enterprise edition) and inspect the target Odoo database schema. The discovery output is a written scope document listing every Collection, its Odoo target model, field-level mapping for each, and the relationship dependency graph with any circular references flagged.
Schema provisioning in Odoo
We create the Odoo field schema for every target model before any data loads. This includes custom fields on res.partner and crm.lead (via CSV import into ir.model.fields or direct SQL for complex configurations), crm.stage records with sequence and probability, crm.team records, and product.template records if the source includes product Collections. The schema is deployed into the target Odoo database via XML-RPC. We run a field-level smoke test (write a single record, read it back via API) to verify the field type mapping before beginning bulk import. If any computed field needs Odoo formula reconstruction, we document the requirements spec here for the customer's developer.
Relationship graph sequencing and parent-first export
We build the relationship dependency graph from all Kinabase linked collection fields. Collections with no inbound links are classified as root nodes (parents) and exported first. Child Collections are exported after their parents so that Odoo partner IDs are available for foreign key resolution during the child load. Collections with circular references are flagged; we denormalise the reference as a text field and document the circular pair for manual resolution post-migration. This sequencing step is unique to Kinabase's flat data model and does not apply to platforms with a built-in hierarchical object schema.
Production migration in dependency order
We run the migration into the production Odoo database in the sequenced order: res.partner (organisations first, contacts second with parent_id resolved), crm.lead (leads, then opportunities with partner_id and team_id resolved), product.template, then activity history (mail.activity, mail.message, calendar.event). Each phase emits a row-count reconciliation report comparing Kinabase source record count to Odoo destination record count. Any discrepancy above the expected null-rate threshold triggers a re-export of the affected collection with verbose error logging. We use Odoo's XML-RPC with batch chunking (500 records per call) and handle 404 errors on parent-record lookups by falling back to the denormalised ID text field.
Cutover, validation, and automation rebuild handoff
We freeze Kinabase writes during the cutover window, run a final delta migration of any records modified during the migration run, then confirm Odoo as the system of record. We deliver the Workflow and Stage Automation inventory document to the customer's Odoo admin. We do not configure Odoo Studio automations, server actions, or scheduled actions inside the migration scope; that work is documented as a separate configuration engagement. We support a one-week post-cutover window to resolve any record reconciliation issues reported by the Odoo user team.
Platform deep dives
Kinabase
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Kinabase and Odoo CRM.
Object compatibility
1 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
Kinabase: 100 requests per minute.
Data volume sensitivity
Kinabase 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 Kinabase to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Kinabase 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 Kinabase
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.