CRM migration
Field-level mapping, validation, and rollback between EXACT and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
EXACT
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between EXACT and Odoo CRM.
Complexity
BStandard
Timeline
48-72 hours
Overview
Exact is a Netherlands-based ERP and CRM platform targeting small and medium enterprises in Europe, with core strengths in accounting integration, project tracking, and workflow automation. Its data model centers on Accounts (customers and suppliers), Contacts, Projects, Documents, and a structured workflow engine. Exact exposes data through REST APIs with CSV/Excel export capabilities for migration purposes. Odoo CRM uses the crm.lead model for both leads and opportunities, with contacts stored as res.partner records linked to companies. Odoo's modular architecture means sales, accounting, inventory, and project management are separate apps sharing a common partner database. The migration carries Exact accounts to Odoo partners, contacts to partner contacts, opportunities to Odoo leads, and financial metadata as custom fields. Exact workflows and approval chains do not migrate — FlitStack exports workflow definitions as a reference document for Odoo automation rebuilding. The migration runs via Odoo's XML-RPC API with field-level validation before commit and a 24-48 hour delta-pickup window capturing in-flight records during cutover.
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 EXACT 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.
EXACT
Account
Odoo CRM
res.partner
1:1Exact accounts (customers and suppliers) map to Odoo res.partner records. The AccountType field in Exact determines customer_rank vs supplier_rank in Odoo. Parent-account hierarchies map to Odoo's parent_id on res.partner for corporate group structures. Inactive Exact accounts are set to active=False in Odoo unless explicitly merged with an active counterpart, and any duplicate account names receive a unique suffix to avoid constraint violations.
EXACT
Contact
Odoo CRM
res.partner (contact type)
1:1Exact contacts migrate as Odoo partner contacts with type='contact', linked to the parent company partner via child_ids. The primary-contact flag in Exact determines which contact record receives the main address and communication preferences in Odoo. Additional phone numbers, secondary emails, and social media links from Exact are stored in Odoo's dedicated contact fields (phone, mobile, email, website) and in the contact's partner fields as appropriate.
EXACT
Deal / Opportunity
Odoo CRM
crm.lead
1:1Exact deal pipeline stages map to Odoo crm.lead stage_id values through a value-mapping table. Deal probability, expected close date, and description fields map directly to Odoo's probability, date_deadline, and description fields. When Exact stage names lack a direct Odoo counterpart, we create custom stages in Odoo and link them in the mapping table to preserve the original pipeline flow and maintain reporting continuity.
EXACT
Project
Odoo CRM
project.project
1:1Exact projects with billable hours and task breakdowns migrate to Odoo project.project and project.task. Non-billable projects map to Odoo internal projects. Task status and assignees transfer with user resolution by email. If Exact includes project templates or recurring tasks, these are recreated as Odoo project templates and recurring task rules, preserving the original allocation percentages and planned hours.
EXACT
Document / Attachment
Odoo CRM
ir.attachment
1:1Exact document attachments (PDFs, images, office files) re-upload to Odoo's ir.attachment model linked to the corresponding res.partner, crm.lead, or project.task record. File size limits and binary storage follow Odoo's attachment configuration. During migration, attachment file names are sanitized to avoid special characters, and duplicate files are identified by checksum to prevent redundant storage in Odoo.
EXACT
Workflow / Automation
Odoo CRM
No equivalent
1:1Exact workflow definitions, approval chains, and automated routing rules have no Odoo equivalent in the migration scope. FlitStack exports the workflow definitions as a structured PDF reference document so your Odoo admin can rebuild automations using Odoo's automated actions and server actions.
EXACT
Invoice / Financial Record
Odoo CRM
account.move
1:1Exact invoice and payment records require separate accounting-module scope. If included, each Exact invoice maps to Odoo account.move with journal_id determined by invoice type (customer invoice vs vendor bill). Chart of accounts mapping is required before financial data loads. Additional mappings include tax codes to Odoo tax groups, payment terms to Odoo property_account_payment_term, and Exact currency codes to Odoo res.currency records to ensure accurate monetary values.
EXACT
Custom Field (Account-level)
Odoo CRM
ir.model.fields + custom column
1:1Exact custom fields on Account require pre-creation in Odoo as ir.model.fields before data migration. Each custom field's type (text, number, date, selection) is translated to the corresponding Odoo field definition. Field values are stored in the custom column on res.partner.
EXACT
Custom Field (Contact-level)
Odoo CRM
ir.model.fields + custom column
1:1Exact contact-level custom fields are created as Odoo ir.model.fields on res.partner before migration. Multi-value custom fields (Exact allows multi-select) map to Odoo char fields storing comma-separated values or to dedicated many2many tags depending on the use case. For high-cardinality selections, a many2many relation to a dedicated selection object is preferred to keep the UI clean and avoid long text strings in the database.
EXACT
User / Owner
Odoo CRM
res.users
1:1Exact users are matched to Odoo res.users by email address. Unmatched Exact owners are flagged pre-migration — either invited to Odoo first or assigned to a fallback sales team. User active status and access rights require Odoo-side configuration post-migration. After matching, we set the Odoo user’s groups according to the Exact role (salesperson, manager) and enable the user only when the migration run confirms all required data are present.
EXACT
Activity Log (calls, emails, notes)
Odoo CRM
mail.message
1:1Exact activity history (logged calls, emails, notes with timestamps and owners) migrates to Odoo mail.message records linked to the parent record. Original timestamps and body content are preserved. Email subject lines map to mail.message.subject. Attachments embedded in Exact emails are extracted and reattached to the corresponding mail.message in Odoo, and HTML bodies are cleaned to Odoo's plain-text format for consistent display.
EXACT
Exact UUID / Internal ID
Odoo CRM
source_system_id (custom char field)
1:1Exact's internal record IDs and UUIDs are stored in a custom source_system_id char field on each Odoo record. This field is required for delta-run de-duplication, cross-referencing, and rollback traceability across subsequent migration runs. It also enables Odoo reports to reference the original Exact identifier for audit purposes and supports reconciliation scripts that compare migrated data against Exact exports.
| EXACT | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account | res.partner1:1 | Fully supported | |
| Contact | res.partner (contact type)1:1 | Fully supported | |
| Deal / Opportunity | crm.lead1:1 | Fully supported | |
| Project | project.project1:1 | Fully supported | |
| Document / Attachment | ir.attachment1:1 | Fully supported | |
| Workflow / Automation | No equivalent1:1 | Fully supported | |
| Invoice / Financial Record | account.move1:1 | Fully supported | |
| Custom Field (Account-level) | ir.model.fields + custom column1:1 | Fully supported | |
| Custom Field (Contact-level) | ir.model.fields + custom column1:1 | Fully supported | |
| User / Owner | res.users1:1 | Fully supported | |
| Activity Log (calls, emails, notes) | mail.message1:1 | Fully supported | |
| Exact UUID / Internal ID | source_system_id (custom char field)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.
EXACT gotchas
Strict API rate limits gate bulk extraction
Exact Globe vs Exact Online feature drift
Workflow and signalling rules are not exportable
OAuth token lifecycle requires careful handling
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
Extract and inventory Exact data via API and CSV export
FlitStack connects to your Exact instance using your API credentials and exports all standard objects — accounts, contacts, deals, projects, attachments, and activity logs — as structured datasets. We also extract any custom field definitions from Exact's metadata tables. The inventory phase produces a record-count summary, identifies NULL-rate fields, flags duplicate records, and surfaces the presence of multi-entity structures. A data quality report is delivered to your team before field mapping begins.
Map Exact objects and fields to Odoo models with foreign key resolution
We build a field-mapping specification covering every Exact-to-Odoo field pair. Foreign keys — particularly Account.uuid to Contact.accountid and Account.uuid to Deal.accountid — are resolved using the UUID-bridge approach. Exact custom fields are mapped to ir.model.fields that need pre-creation in Odoo. The mapping spec is reviewed by your Odoo admin before the migration run to confirm stage names, owner assignments, and custom field readiness.
Resolve users and owners by email match against Odoo res.users
Before records are loaded, Exact users and deal owners are matched to Odoo res.users by email address. Records whose owners have no matching Odoo user are flagged in a pre-flight report. Your team either creates the missing Odoo users or assigns those records to a fallback sales team before the migration run. No record lands in Odoo without a resolved owner assignment.
Run a sample migration with field-level diff across 100-500 representative records
A test migration runs against a staging copy of your Odoo database, migrating a stratified sample of accounts, contacts, deals, and activities. We generate a field-level diff report comparing source Exact values to destination Odoo values for every mapped field. Your team reviews the diff to verify stage mappings, custom field values, owner assignments, and activity log preservation before the full run is scheduled.
Execute full migration with delta-pickup window and audit log
The full migration runs against your production Odoo instance using Odoo's XML-RPC API, migrating all records in the correct sequence: accounts first (res.partner), then contacts (res.partner with parent_id), then deals (crm.lead), then activities (mail.message), and finally attachments (ir.attachment). A delta-pickup window of 24-48 hours captures records modified in Exact during the cutover period. Every operation is logged in an audit trail, and one-click rollback is available if reconciliation reveals data integrity issues.
Platform deep dives
EXACT
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between EXACT and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across EXACT and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between EXACT 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
EXACT: 60 API calls per minute AND 5,000 API calls per day, per app per company. Signalled via X-RateLimit-Minutely-Remaining/Reset and X-RateLimit-Daily-Remaining/Reset headers. HTTP 429 returned on overrun..
Data volume sensitivity
EXACT exposes a bulk API — large-volume migrations stream efficiently.
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 EXACT to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your EXACT 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 EXACT
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.