CRM migration
Field-level mapping, validation, and rollback between DinamikCRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
DinamikCRM
Source
Odoo CRM
Destination
Compatibility
12 of 14
objects map 1:1 between DinamikCRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from DinamikCRM to Odoo CRM is a migration from a Turkish-market SME CRM with a per-account custom module architecture to a globally-used all-in-one ERP+CRM platform. The primary technical challenge is that DinamikCRM's schema is not shared across accounts; each subscription has a unique set of active modules and fields that we must discover at the start of every project. We enumerate the live module list via the API, extract field definitions per module, then design the Odoo destination schema before any data moves. Objects like Contacts, Companies, and Leads map to Odoo's crm.lead and res.partner models. Activities migrate as mail.message records. Custom DinamikCRM modules map to Odoo custom models or res.partner custom fields depending on their cardinality. We do not migrate module-level automation rules, notification triggers, or field-level validations; these require rebuilding in Odoo Studio or via custom Python modules 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 DinamikCRM 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.
DinamikCRM
Contact
Odoo CRM
crm.lead
1:1DinamikCRM Contact records map to Odoo crm.lead. Standard fields (name, email, phone, address) map directly. We set type='lead' on import for unqualified prospects and type='opportunity' for sales-qualified records. The res.partner.id is resolved for records that have a linked Company in DinamikCRM and is stored as partner_id on the Odoo lead. Contact tags from DinamikCRM migrate as crm.tag records attached via crm.tag.rel.
DinamikCRM
Company
Odoo CRM
res.partner
1:1DinamikCRM Company records map to Odoo res.partner with is_company=True. Company domain becomes the Website field and is used as a dedupe key during import. If the DinamikCRM Company has related Contacts, those Contacts import after the Company record so that partner_id is available as a foreign key. Multi-company support in Odoo requires the contacts to be assigned to the correct company_id field if the destination Odoo instance runs multi-company.
DinamikCRM
Lead
Odoo CRM
crm.lead
1:1DinamikCRM Lead records map directly to Odoo crm.lead. Lead status and source information map to Odoo's stage_id and source_id fields using the stage mapping table built during scoping. Any DinamikCRM lead scoring or priority fields map to Odoo priority (stars) or a custom integer field on crm.lead. If DinamikCRM records a lead-to-contact conversion history, we preserve the original lead record as a crm.lead with type='lead' and add a note referencing the converted Contact ID.
DinamikCRM
Activity
Odoo CRM
mail.activity
1:1DinamikCRM Activity entries map to Odoo mail.activity records linked to the parent crm.lead or res.partner via res_id and res_model. Activity type (call, email, meeting, task) maps to activity_type_id using Odoo's standard activity types. Note that Odoo mail.activity does not store the full email body or call transcript; we extract the activity summary as note and flag the full body as requiring migration to mail.message for records that need complete conversation history.
DinamikCRM
Appointment
Odoo CRM
calendar.event
1:1DinamikCRM Appointment records map to Odoo calendar.event. Date, time, duration, attendee, and status fields map to event fields directly. We link attendees via calendar.attendee records pointing to res.partner or res.users. If the destination Odoo instance does not have the calendar module installed, appointments map as mail.activity records with activity_type_id=meeting instead. Any appointment-specific fields (location, conference link, reminder settings) are flagged as requiring Odoo calendar module activation or manual configuration.
DinamikCRM
Invoice
Odoo CRM
account.move
1:1DinamikCRM Invoice records map to Odoo account.move with move_type='out_invoice' for customer invoices. Line items, totals, tax amounts, and payment status map to their Odoo equivalents. Financial fields require validation against the destination Odoo instance's chart of accounts before import because account codes vary per company configuration. We flag any DinamikCRM invoice fields (discount tiers, payment terms, aging buckets) that do not map directly to Odoo's standard invoice structure.
DinamikCRM
Feedback
Odoo CRM
rating.rating or mail.message
1:1DinamikCRM Feedback entries map to Odoo rating.rating records if the helpdesk module is active, or to mail.message with internal note flags if not. Feedback rating scores map to rating.rating's rating float field (1-5 scale). Free-text feedback content migrates as mail.message body. We flag whether the Odoo instance has rating enabled and note the module activation requirement during scoping.
DinamikCRM
Custom Module
Odoo CRM
Custom Model (ir.model) or res.partner custom field
lossyDinamikCRM custom modules vary per account, requiring a discovery phase before mapping. We enumerate active custom modules via API, extract their field definitions, and determine the migration strategy: high-cardinality custom records (n:1 relationships, one record per entity) become new Odoo models built as Python modules inheriting crm.lead or res.partner; low-cardinality fields (single value per Contact or Company) become custom fields on the target model via Odoo Studio. Custom module naming conventions are preserved in the Odoo model name with an x_ prefix per Odoo's custom field API. This step extends the migration timeline by one to three weeks depending on module complexity.
DinamikCRM
Pipeline
Odoo CRM
crm.stage
lossyDinamikCRM pipeline stages map to Odoo crm.stage records within the relevant crm.team. Stage name, sequence order, and probability percentage migrate to stage_id. We configure the stage legend (colors) and is_won flag per stage. If DinamikCRM pipelines use custom stage logic (auto-assignment, automated actions on entry), we document the behavior as a crm.team configuration note for the Odoo admin to implement via Odoo Studio or Python override.
DinamikCRM
Deal
Odoo CRM
crm.lead (type=opportunity)
1:1DinamikCRM Deal records map to Odoo crm.lead with type='opportunity'. Deal value, expected close date, and probability migrate to planned_revenue, date_deadline, and probability respectively. Owner assignment maps via email-matched res.users lookup. If a DinamikCRM Deal is linked to a Contact and a Company, we set partner_id (from the Company mapping) and contact_id (from the Contact mapping) on the Odoo opportunity. Lost deal reasons map to crm.lead lost_reason if that field is enabled in the destination Odoo instance.
DinamikCRM
Customer Support Ticket (DESK)
Odoo CRM
helpdesk.ticket
1:1DinamikCRM DESK tickets map to Odoo helpdesk.ticket if the helpdesk module is active. Ticket status, priority, and assignee map directly. Conversation threads migrate to mail.message records linked to the ticket. If the destination Odoo instance does not have the helpdesk module installed, tickets map as crm.lead records with a custom ticket reference field and conversation history as mail.message. Module activation is flagged during scoping as a prerequisite for full ticket migration.
DinamikCRM
User/Owner
Odoo CRM
res.users
1:1DinamikCRM Owner records map to Odoo res.users by email match. Active status, name, and login email migrate. We resolve owners by email before record import begins so that OwnerId (create_uid, write_uid) and assignment fields are satisfied on all migrating records. Owners without a matching Odoo user go to a reconciliation queue for the customer admin to provision before import resumes. Inactive DinamikCRM owners map to inactive Odoo users if historical record attribution is required.
DinamikCRM
Attachment
Odoo CRM
ir.attachment
1:1DinamikCRM file attachments linked to records export as binary content alongside record data. We map them to Odoo ir.attachment records with res_model and res_id pointing to the target Odoo model and record. Attachment metadata (filename, MIME type, file size) is preserved. Note that Odoo stores ir.attachment in the database filestore by default; large attachment volumes may require Odoo's external storage filestore configuration. We flag file storage planning during scoping for accounts with more than 10,000 attachments.
DinamikCRM
Tag/Label
Odoo CRM
crm.tag
1:1DinamikCRM tag assignments on records map to Odoo crm.tag. Tags stored as multi-checkbox custom properties on Contacts or Companies become crm.tag records with a many2many relationship via crm.tag.rel. Tag names and colors migrate directly. If DinamikCRM uses hierarchical tags or tag categories, we map them to crm.tag records with parent_id hierarchy or document them as multiple tag assignments per record.
| DinamikCRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | crm.lead1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Activity | mail.activity1:1 | Fully supported | |
| Appointment | calendar.event1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Feedback | rating.rating or mail.message1:1 | Fully supported | |
| Custom Module | Custom Model (ir.model) or res.partner custom fieldlossy | Fully supported | |
| Pipeline | crm.stagelossy | Fully supported | |
| Deal | crm.lead (type=opportunity)1:1 | Fully supported | |
| Customer Support Ticket (DESK) | helpdesk.ticket1:1 | Fully supported | |
| User/Owner | res.users1:1 | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Tag/Label | crm.tag1: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.
DinamikCRM gotchas
Custom module schema varies per account
API documentation does not disclose rate limits
No documented bulk export endpoint
Module-level business logic may not transfer
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
Module schema discovery and account audit
We enumerate all active DinamikCRM modules via the API discovery endpoint, extract field definitions for each module, and document custom fields, relationships, and module-specific business logic. We also audit record volumes per object, active pipeline configurations, and any module-level automation rules. This phase produces a written schema map unique to the customer account. Any pre-existing Odoo instance is audited for installed apps, active custom fields, and existing crm.stage configurations. The output is a migration scope document with a module-by-module mapping table and a timeline estimate.
Destination Odoo schema design and stage mapping
We design the Odoo destination schema based on the discovered DinamikCRM modules. This includes designing crm.tag records for tag migration, configuring crm.stage records with names, sequences, probabilities, and team assignments, and building custom Odoo models via Python module if the DinamikCRM account has high-cardinality custom modules that cannot map to standard Odoo fields. If the Odoo instance is empty, we install the CRM app and configure the base pipeline before migration. Schema design is validated against the customer's Odoo instance before data work begins.
User and owner reconciliation
We extract every distinct DinamikCRM owner referenced across Contacts, Companies, Deals, and Activities and match them by email against the destination Odoo instance's res.users table. Owners without a matching Odoo user are added to a reconciliation queue. The customer provisions any missing Odoo users (active or inactive based on whether the original owner is still active in the organization). Owner resolution is a prerequisite for all record imports because OwnerId, create_uid, and write_uid references must be satisfied at import time.
Staging migration and record reconciliation
We run a full migration into the customer's Odoo staging environment (or a test database if the live instance is not ready) using production record volumes. The customer's Odoo administrator reconciles record counts against the DinamikCRM source: Contacts in, Leads in, Companies in, Deals in, Activities in. We spot-check 25-50 random records for field-level accuracy against the source. Any mapping corrections are made in this phase before the production migration. This step is essential for accounts with custom modules because the mapping table is unique per account.
Production migration in dependency order
We run the production migration in record-dependency sequence: res.users and res.partner (Companies) first, followed by crm.lead (Contacts and Leads with type assignment), then pipeline stages and crm.tag records, followed by crm.lead with type=opportunity (Deals) with partner_id and contact_id resolved, then Activities and Appointments, then Invoice records and custom module records last. Each phase emits a row-count reconciliation report. Any records modified in DinamikCRM during the migration window are caught in a final delta pass before cutover.
Cutover, validation, and automation rebuild handoff
We freeze DinamikCRM writes during the cutover window, run a final delta migration of records modified during migration, then enable Odoo as the system of record. We deliver a written automation inventory documenting every DinamikCRM workflow rule, notification trigger, and field-level validation with a recommended Odoo equivalent (Studio automation, Python override, or manual configuration). We support a one-week post-cutover reconciliation window to address data quality issues surfaced by the sales team. We do not rebuild DinamikCRM automations as Odoo automations inside the migration scope; that is documented separately for the customer's Odoo admin or implementation partner.
Platform deep dives
DinamikCRM
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 DinamikCRM 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
DinamikCRM: Not publicly documented.
Data volume sensitivity
DinamikCRM 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 DinamikCRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your DinamikCRM 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 DinamikCRM
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.