ERP migration
Field-level mapping, validation, and rollback between Intact iQ and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Intact iQ
Source
Odoo ERP
Destination
Compatibility
12 of 12
objects map 1:1 between Intact iQ and Odoo ERP.
Complexity
BStandard
Timeline
48–72 hours
Overview
Intact iQ is an on-premise and cloud ERP built for merchants, wholesalers, and distributors in Ireland and the UK, with modules for financials, supply chain, trade counter/EPOS, CRM, and business intelligence. It exposes data via a REST API that supports read/write access to defined endpoints, allowing FlitStack AI to extract customers, suppliers, products, orders, invoices, and stock records in structured batches. Odoo ERP uses a modular object model: res.partner for contacts and companies, product.product for product variants, sale.order and purchase.order for transactions, account.move for invoices, and stock.picking for inventory movements. Odoo's external-ID system enables precise cross-referencing during import, while its ir.model.fields API allows FlitStack to create custom fields on the fly to capture Intact iQ-specific data that has no native Odoo equivalent. We map every standard object and preserve original create_date, write_date, and user_id values as custom fields so reporting continuity is maintained. Workflows, automations, and scheduled tasks in Intact iQ do not migrate — they must be rebuilt as Odoo Studio workflows or server actions post-implementation. Our migration engine uses Odoo's XML-RPC API with batch sizes of 500–1000 records per call, respecting rate limits while maximizing throughput during the delta-pickup window.
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 Intact iQ object lands in Odoo ERP, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Intact iQ
Customer
Odoo ERP
res.partner (customer)
1:1Intact iQ customers map directly to Odoo res.partner records with customer=True. The supplier counterpart is a separate Intact iQ entity; both land in the same Odoo table with type differentiation via customer_rank or the is_company flag. Primary address, email, phone, and website transfer directly; parent/child company hierarchies map via parent_id in Odoo.
Intact iQ
Supplier
Odoo ERP
res.partner (supplier)
1:1Intact iQ suppliers map to Odoo res.partner with supplier=True. Odoo does not distinguish supplier from customer at the table level — both use the same model — so FlitStack sets the appropriate flag during import. Supplier-specific fields like payment terms and supplier rank are set via the x_studio_ prefixed custom fields or the standard property fields.
Intact iQ
Contact / Account Contact
Odoo ERP
res.partner (contact)
1:1Intact iQ contacts associated with companies map to Odoo res.partner records with parent_id pointing to the company partner. Function (job title) maps to function field in Odoo. Multiple contacts per company are supported natively in Odoo's partner model, unlike some ERPs that restrict N:1 relationships. Phone and email fields map directly.
Intact iQ
Product / Stock Item
Odoo ERP
product.product + product.template
1:1Intact iQ products with variants decompose into Odoo's two-tier product model: product.template holds the shared product definition (name, categ_id, type, uom_id), while product.product holds the sellable/purchasable variants. Intact iQ product attributes map to Odoo attribute lines on the template. Products without variants create a single product.product with a one-to-one template relationship.
Intact iQ
Sales Order
Odoo ERP
sale.order + sale.order.line
1:1Intact iQ sales orders map to Odoo sale.order with partner_id resolved from the customer, date_order set to the original order date, and order lines containing product_id, product_uom_qty, price_unit, and discount. Odoo's onchange mechanism (now deprecated in newer versions) is handled by setting price_unit and taxes directly rather than relying on list_price lookup.
Intact iQ
Purchase Order
Odoo ERP
purchase.order + purchase.order.line
1:1Intact iQ purchase orders map to Odoo purchase.order with partner_id resolved from the supplier, date_order from the source document, and order lines with product_id, product_qty, price_unit, and date_planned. Odoo purchase orders require a price_unit to be set explicitly — unlike sales orders, the default is not auto-filled from product standard_price.
Intact iQ
Customer Invoice
Odoo ERP
account.move (type='out_invoice')
1:1Intact iQ customer invoices map to Odoo account.move with type='out_invoice'. The invoice number becomes the 'ref' field; the invoice date maps to invoice_date; line items use account_id resolved from the product's income account or the default sale account. Odoo requires journal_id on every move — FlitStack resolves this from the company's default sale journal based on the destination Odoo company.
Intact iQ
Supplier Invoice / Credit Note
Odoo ERP
account.move (type='in_invoice', 'in_refund')
1:1Supplier invoices from Intact iQ become Odoo account.move with type='in_invoice'. Credit notes use type='in_refund'. Odoo's vendor bills require invoice_date, partner_id, and line entries with account_id pointing to expense accounts — FlitStack resolves these from the product's cost account or a fallback expense account configured in the migration plan.
Intact iQ
Stock Movement / Warehouse Transfer
Odoo ERP
stock.picking + stock.move
1:1Intact iQ stock movements map to Odoo stock.picking records with picking_type_id set to the appropriate warehouse operation (internal transfer, delivery, receipt). stock.move records within each picking carry product_id, product_uom_qty, location_id, and location_dest_id. Odoo's unit of measure must be resolved — FlitStack maps Intact iQ UoM names to Odoo uom.uom records using the product's uom_id and uom_po_id.
Intact iQ
Lead / Opportunity (CRM)
Odoo ERP
crm.lead
1:1Intact iQ CRM leads map to Odoo crm.lead. name becomes the lead subject; partner_id is resolved by email match to res.partner; email_from and phone map directly; stage_id is resolved by matching Intact iQ status labels to Odoo stage names within the target pipeline. Odoo stage IDs are integer references — FlitStack creates a stage mapping table during the planning phase before any records are written.
Intact iQ
Custom Fields / Extended Properties
Odoo ERP
ir.model.fields (custom)
1:1Intact iQ extended properties that have no direct Odoo equivalent (e.g., customer credit rating, supplier tier classification, product tariff codes) are created as custom fields via Odoo's ir.model.fields API. FlitStack pre-creates these fields before data load, using field_description for the human-readable label and name matching the snake_case convention (x_intact_credit_rating, x_intact_supplier_tier). Existing custom fields in Odoo are detected and reused to avoid duplicates.
Intact iQ
Document Attachments
Odoo ERP
ir.attachment
1:1Intact iQ file attachments associated with customers, orders, or invoices are downloaded and re-uploaded to Odoo as ir.attachment records linked to the corresponding res.partner, sale.order, or account.move via res_model and res_id. FlitStack preserves the original filename, mimetype, and create_date. Large files (>25MB per Odoo default limit) are flagged for manual handling or chunked upload.
| Intact iQ | Odoo ERP | Compatibility | |
|---|---|---|---|
| Customer | res.partner (customer)1:1 | Fully supported | |
| Supplier | res.partner (supplier)1:1 | Fully supported | |
| Contact / Account Contact | res.partner (contact)1:1 | Fully supported | |
| Product / Stock Item | product.product + product.template1:1 | Fully supported | |
| Sales Order | sale.order + sale.order.line1:1 | Fully supported | |
| Purchase Order | purchase.order + purchase.order.line1:1 | Fully supported | |
| Customer Invoice | account.move (type='out_invoice')1:1 | Fully supported | |
| Supplier Invoice / Credit Note | account.move (type='in_invoice', 'in_refund')1:1 | Fully supported | |
| Stock Movement / Warehouse Transfer | stock.picking + stock.move1:1 | Fully supported | |
| Lead / Opportunity (CRM) | crm.lead1:1 | Fully supported | |
| Custom Fields / Extended Properties | ir.model.fields (custom)1:1 | Fully supported | |
| Document Attachments | ir.attachment1: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.
Intact iQ gotchas
REST API requires custom definition setup per object
No public pricing or trial means scoping requires discovery calls
Performance collapses on large record sets
Document attachments are not accessible via REST API
Workflow automation rules are not API-exportable
Odoo ERP gotchas
No rollback for CSV imports
External ID conflicts on re-import
Many2many field encoding in CSV imports
Large export timeouts require batching
Version schema drift between Odoo releases
Pair-specific challenges
Migration approach
Audit Intact iQ API endpoints and extract data schema
FlitStack AI connects to your Intact iQ instance via the REST API defined in Company > Setup > API Definition. We enumerate all available API services — Customers, Suppliers, Products, Sales Orders, Purchase Orders, Invoices, Stock Movements, CRM Leads — and extract the field schema for each. We also pull any extended properties defined via Intact iQ's custom field framework. This schema becomes the source-of-truth mapping document that drives all subsequent steps. If your Intact iQ version uses a legacy API format or has rate-limited endpoints, we flag this in the planning report and adjust batch sizes accordingly.
Pre-create Odoo custom fields and resolve external IDs
Before any data is written to Odoo, FlitStack creates any custom fields required for Intact iQ extended properties (x_intact_credit_limit, x_intact_supplier_tier, x_intact_create_date, etc.) via Odoo's ir.model.fields API. We also pre-resolve external IDs for country records, UoM records, stage records, and journal records so that foreign-key lookups during import do not create duplicate records. This step ensures that the XML-RPC load phase encounters no validation errors from missing reference data.
Migrate master data: partners, products, templates
We sequence the migration to respect Odoo's referential integrity: res.partner records (customers and suppliers) load first, followed by product.template records, then product.product variants. Each record receives an external ID (e.g., int_partner_001) that is stored on the record as x_intact_external_id for traceability. This allows downstream records (sales orders, invoices) to reference their related partners and products by external ID rather than by Odoo database ID, which is unknown until after write.
Migrate transactional data: orders, invoices, stock movements
With master data in place, FlitStack loads sales orders, purchase orders, customer invoices, supplier invoices, and stock movements using Odoo's XML-RPC create() calls in batches of 500–1000 records. Each batch is retried with exponential backoff if Odoo returns a 429 rate-limit response. We resolve partner_id, product_id, account_id, location_id, and stage_id by querying Odoo with the external IDs stored on the source records. Original create_date and user_id values are written to custom fields to preserve audit continuity.
Run sample migration with field-level diff before full commit
A representative slice of 100–500 records spanning all object types migrates first. FlitStack generates a field-level diff report comparing source values from Intact iQ against the loaded values in Odoo, flagging any transformation discrepancies above a configurable threshold (default 0.01% difference for numeric fields, exact match for dates and strings). You review the diff report and approve before the full migration run commits. This gate prevents a bulk load of mis-mapped data.
Cut over with delta-pickup and post-migration validation
The full migration runs against your Odoo instance. A delta-pickup window (typically 24–48 hours) captures any records created or modified in Intact iQ during the cutover — we re-query the Intact iQ REST API for records with write_date after the initial extraction timestamp and insert any new or changed records. FlitStack generates a reconciliation report counting records by object type in both systems. One-click rollback reverts all migration-created records if the report reveals discrepancies above your defined tolerance.
Platform deep dives
Intact iQ
Source
Strengths
Weaknesses
Odoo ERP
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP 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 Intact iQ and Odoo ERP.
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
Intact iQ: Not publicly documented.
Data volume sensitivity
Intact iQ 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 Intact iQ to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Intact iQ to Odoo ERP migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Intact iQ
Other ways to arrive at Odoo ERP
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.