ERP migration
Field-level mapping, validation, and rollback between Ostendo and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Ostendo
Source
Odoo ERP
Destination
Compatibility
8 of 12
objects map 1:1 between Ostendo and Odoo ERP.
Complexity
BStandard
Timeline
3-6 weeks
Overview
Moving from Ostendo to Odoo ERP is a cross-platform data restructuring that requires extraction through Ostendo's built-in CSV and Excel export tools or custom scripting rather than a REST API, since Ostendo does not expose a public API endpoint. We map Ostendo's ITEMMASTER, CUSTOMER MASTER, Purchase Orders, Sales Orders, Work Orders, Timesheets, Stock Locations, and Asset records to their Odoo equivalents, applying transformation where schema differs. Multi-level Bills of Materials in Ostendo require flattening before loading into Odoo's single-level BoM structure. The concurrent-user licensing model in Ostendo translates to Odoo's named-user model, which typically reveals either cost savings or an under-licensed Ostendo environment. We do not migrate Ostendo Reports, Saved Queries, or custom Workflows and Automations; we deliver a written inventory of these for the customer's admin to rebuild in Odoo Studio or via the Odoo Workflow Engine 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 Ostendo 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.
Ostendo
CUSTOMER MASTER
Odoo ERP
res.partner
1:1Ostendo Customer records map to Odoo res.partner with partner_type set to 'contact' for billing contacts and 'delivery' for shipping addresses. The Ostendo CUSTOMERMASTER holds customer code, name, billing address, delivery address, contact details, and payment terms — all of which translate to standard Odoo partner fields. We preserve the Ostendo customer code as the partner's ref field for cross-system audit trails. Multi-address delivery points from Ostendo become child partner records linked via parent_id.
Ostendo
ITEMMASTER
Odoo ERP
product.template + product.product
1:1Ostendo ITEMMASTER records map to Odoo product.product (the stock-keeping unit variant) and product.template (the product definition). Item code maps to Odoo's default_code; item description to name; unit cost to standard_price; and Primary Supplier linkage to the product's seller_ids. Ostendo's stock levels per location map to Odoo's quant records against the corresponding warehouse location. We extract all ITEMMASTER fields including the supplier association that becomes the vendor price list entry.
Ostendo
Purchase Orders
Odoo ERP
purchase.order + purchase.order.line
1:1Ostendo Purchase Orders map to Odoo purchase.order (header) and purchase.order.line (lines). Supplier linkage resolves to res.partner (vendor) via the contact name match. PO number, order date, expected delivery date, and line-level quantity, unit price, and taxes migrate as-is. Header-level freight and handling charges migrate to Odoo's order-level amount_total reconciliation. Line-level status (pending, confirmed, received) maps to Odoo's state field (draft, sent, purchase, done).
Ostendo
Sales Orders
Odoo ERP
sale.order + sale.order.line
1:1Ostendo Sales Orders (covering Order Styles for various sales activities including POS) map to Odoo sale.order and sale.order.line. The customer reference resolves to res.partner. Order date, requested delivery date, and pricing migrate. Line-level product, quantity, and unit price transfer; Odoo's sol_service_policy and invoice_policy fields are set to defaults during configuration. POS orders from Ostendo migrate with the POS flag cleared and the order type set to standard sale order.
Ostendo
Work Orders / Manufacturing Orders
Odoo ERP
mrp.production + mrp.workorder
1:manyOstendo Work Orders map to Odoo mrp.production (the manufacturing order header) and mrp.workorder (per-operation routing steps). The work order job costing fields (labour hours, material consumption) migrate to the MO's move_raw_ids and workorder duration tracking. Multi-level BOMs from Ostendo require flattening before loading into Odoo's single-level BoM structure — we decompose nested BOMs into parent BoM records with child BoM line items referencing the sub-assembly products, creating a flat BoM structure that Odoo's MRP module consumes. Work order status (scheduled, in-progress, completed) maps to Odoo's state field (planned, progress, done).
Ostendo
Timesheets / Time Entries
Odoo ERP
account.analytic.line
1:1Ostendo timesheets linked to Work Orders and Jobs map to Odoo account.analytic.line. We extract the Ostendo time entry records (employee, date, hours, job reference, activity type) and resolve the Odoo employee user via email match. The work order reference becomes the analytic line's so_line or production_id linking. GPS data and material-issued flags from Freeway Mobile entries are stored in custom analytic line fields for audit. Timesheets with incomplete job linkages are flagged for reconciliation before loading.
Ostendo
Stock / Inventory
Odoo ERP
stock.quant + stock.location
1:1Ostendo stock levels (quantity per location, serial numbers, bin references) map to Odoo stock.quant records linked to stock.location entries. Serial number tracking migrates to Odoo's stock.production.lot with lot_name and product_id. Multi-site Ostendo records (different physical locations) create corresponding Odoo warehouse records and child location hierarchy. Quant records are loaded after product templates and locations are established to satisfy foreign-key constraints.
Ostendo
Stock Locations / Service Zones
Odoo ERP
stock.warehouse + stock.location
1:manyOstendo Stock Locations and Service Zones map to Odoo stock.warehouse (physical site) and stock.location (logical hierarchy within each warehouse: area, aisle, bin). Freeform Ostendo location names become Odoo location complete_name strings. Service Zones used for field service dispatch map to Odoo stock.location records tagged with a custom location_type field, linked to the field service scheduling module if Odoo Field Service is in scope.
Ostendo
Assets
Odoo ERP
account.asset
1:1Ostendo Asset records (linked to Service Zones with meter readings and equipment checks) map to Odoo account.asset. Asset name, acquisition date, original value, and depreciation method migrate as standard asset fields. Maintenance history from Ostendo migrates to Odoo maintenance records if Odoo Maintenance app is licensed; otherwise it is preserved in custom asset description fields for manual recreation.
Ostendo
Users
Odoo ERP
res.users
lossyOstendo User records (managed through User Security and Options) migrate to Odoo res.users. The key transformation is the concurrent-to-named-user conversion: Ostendo concurrent-user count (typically 25-40% of total staff) becomes the Odoo named-user count. We flag any gap where the Ostendo concurrent license count is lower than the named-user count required, which may reveal the customer under-licensed their Ostendo environment. Inactive Ostendo users are created as Odoo portal users or inactive records for historical record ownership continuity.
Ostendo
Custom Fields (Freeway Mobile)
Odoo ERP
ir.model.fields (custom)
lossyOstendo's Freeway Mobile user-defined templates create custom fields per object without a standard export format. During discovery we enumerate all custom template fields per Ostendo screen and map each to an equivalent Odoo custom field created via Odoo Studio or in the migration schema. We alert the customer to any destination fields that cannot hold equivalent data (e.g., mobile-specific GPS, photo, signature capture) without manual configuration or third-party module installation in Odoo.
Ostendo
Reports / Saved Queries
Odoo ERP
Not migrated
1:1Ostendo's SQL-based Report Writer produces saved reports, inquiries, and pivot tables that reference Ostendo-specific table structures and SQL queries. These have no direct equivalent in Odoo's reporting layer. We do not migrate reports or saved queries. We deliver a written inventory of all Ostendo reports with their table dependencies, query logic, and recommended Odoo equivalent (in-app report, Odoo Studio custom report, or BI tool query) for the customer's admin to rebuild post-migration.
| Ostendo | Odoo ERP | Compatibility | |
|---|---|---|---|
| CUSTOMER MASTER | res.partner1:1 | Fully supported | |
| ITEMMASTER | product.template + product.product1:1 | Fully supported | |
| Purchase Orders | purchase.order + purchase.order.line1:1 | Fully supported | |
| Sales Orders | sale.order + sale.order.line1:1 | Fully supported | |
| Work Orders / Manufacturing Orders | mrp.production + mrp.workorder1:many | Fully supported | |
| Timesheets / Time Entries | account.analytic.line1:1 | Mapping required | |
| Stock / Inventory | stock.quant + stock.location1:1 | Fully supported | |
| Stock Locations / Service Zones | stock.warehouse + stock.location1:many | Fully supported | |
| Assets | account.asset1:1 | Fully supported | |
| Users | res.userslossy | Mapping required | |
| Custom Fields (Freeway Mobile) | ir.model.fields (custom)lossy | Fully supported | |
| Reports / Saved Queries | Not migrated1:1 | Not 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.
Ostendo gotchas
No public REST API for automated data extraction
Concurrent user licensing creates user-count mapping complexity
Custom fields from mobile capture layer require manual mapping
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
Discovery and Odoo edition scoping
We audit the source Ostendo environment across all active modules: CUSTOMER MASTER, ITEMMASTER, Purchase Orders, Sales Orders, Work Orders, Timesheets, Stock Locations, Service Zones, Assets, and User records. We inventory any Freeway Mobile custom templates and their field definitions per screen. We assess BOM depth (single-level vs multi-level) for each ITEMMASTER entry with a manufacturing BoM. In parallel we confirm the target Odoo edition and hosted tier (Community self-hosted, Odoo Online, or Odoo.sh), which determines the available apps and API access method (XML-RPC for self-hosted, REST for Odoo Online). The discovery output is a written migration scope with object-level record counts and BOM complexity classification.
Odoo schema design and BoM strategy
We design the destination Odoo schema based on the migration scope. This includes provisioning warehouse records (one per Ostendo site), configuring product templates with units of measure, setting up vendors and vendor price lists from Ostendo supplier linkage, defining BoM types (kit, manufacture this product, or phantom) based on the flattened Ostendo BOM analysis, and configuring account.analytic.account records for timesheet cost centres. If custom fields from Freeway Mobile exist, we create them via Odoo Studio or CSV metadata before any data load. The schema is deployed to a staging Odoo database (sandbox or development environment) for validation before production migration begins.
Ostendo data extraction via Data Exporting and scripting
We extract Ostendo data using the platform's built-in Data Exporting function for standard objects (CSV and Excel output) and custom scripting using GetTableNames and GetValueFromStore to pull any tables not exposed through the standard export interface. For direct SQL access (where the customer grants read-only database access), we run targeted SELECT queries against the Ostendo SQL tables to produce structured extracts for each migration object. All extracts are validated against the discovery record counts before transformation begins. We flag any records with broken foreign-key references (e.g., orders referencing deleted customers) for customer-side cleanup before loading.
Data transformation and BOM flattening
We transform the extracted Ostendo records into Odoo-compatible record formats. The primary transformation work is BOM flattening: for each multi-level Ostendo BOM, we decompose the hierarchy into parent-product BoM records and child-product BoM records, creating any missing intermediate ITEMMASTER entries as separate product records. Custom field values from Freeway Mobile are mapped to Odoo custom fields created in schema design. Timesheet entries with unresolved job references are held in a reconciliation queue for the customer to clarify. Stock levels are normalised against the Odoo warehouse and location hierarchy established during schema design.
Staging migration and reconciliation
We run a full migration into a staging Odoo environment using the transformed records. We validate record counts per object against the Ostendo source extracts, spot-check 25-50 records per object type for field-level accuracy, and confirm that foreign-key lookups (partner_id on sale orders, product_id on purchase lines, warehouse_id on stock quants) resolved correctly. Any transformation errors are corrected in the mapping logic and the staging run is repeated. The customer's operations lead reviews the staging output and signs off before production migration begins.
Production migration in dependency order and cutover
We execute the production migration in dependency order: product templates and BoMs first, then warehouse and location hierarchy, then partners (vendors and customers), then stock quants, then purchase orders, sales orders, manufacturing orders, timesheet entries, and assets. Each phase emits a row-count reconciliation report before the next phase begins. We freeze write access to Ostendo during the cutover window, run a final delta migration for any records modified during the window, then mark Odoo as the system of record. We deliver the automation and report inventory document for the customer's admin to rebuild in Odoo Studio or via the Odoo Workflow Engine. We offer a one-week hypercare window for reconciliation issues; workflow rebuild and post-migration admin configuration are outside standard scope and can be scoped as a separate engagement.
Platform deep dives
Ostendo
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 Ostendo 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
Ostendo: Not publicly documented.
Data volume sensitivity
Ostendo 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 Ostendo to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Ostendo 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 Ostendo
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.