ERP migration

Migrate from Ostendo to Odoo ERP

Field-level mapping, validation, and rollback between Ostendo and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.

Ostendo logo

Ostendo

Source

Odoo ERP

Destination

Odoo ERP logo

Compatibility

67%

8 of 12

objects map 1:1 between Ostendo and Odoo ERP.

Complexity

BStandard

Timeline

3-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Ostendo logo

Ostendo

What's pushing teams away

  • Support responsiveness varies by scenario, leaving some users without timely help when configuring complex workflows or custom fields.
  • Inconsistent UI behaviour across modules frustrates power users; some panels allow window resizing and others do not, depending on which screen you are in.
  • The platform lacks a well-documented public REST API, making integrations and automated data pipelines difficult to build and maintain.
  • Interface design lags behind modern SaaS standards, which creates a steeper learning curve for users accustomed to contemporary UX patterns.

Choosing

Odoo ERP logo

Odoo ERP

What's pulling them in

  • Modular pay-as-you-grow model with 80+ apps under one database — teams start with CRM and add Accounting, Inventory, or Manufacturing without switching platforms.
  • Free Community edition lets businesses validate Odoo fit before committing to Enterprise licensing costs that scale with user count.
  • Lowest per-user pricing among mid-market ERPs, with a published free tier for one app and Standard plans starting around $24.90 per user per month.
  • Native integration between modules — a confirmed Sales Order automatically updates inventory, invoicing, and accounting without manual re-entry.
  • Strong Odoo Gold Partner ecosystem provides local implementation support, reducing risk for companies without in-house developers.

Object mapping

How Ostendo objects map to Odoo ERP

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

maps to

Odoo ERP

res.partner

1:1
Fully supported

Ostendo 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

maps to

Odoo ERP

product.template + product.product

1:1
Fully supported

Ostendo 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

maps to

Odoo ERP

purchase.order + purchase.order.line

1:1
Fully supported

Ostendo 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

maps to

Odoo ERP

sale.order + sale.order.line

1:1
Fully supported

Ostendo 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

maps to

Odoo ERP

mrp.production + mrp.workorder

1:many
Fully supported

Ostendo 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

maps to

Odoo ERP

account.analytic.line

1:1
Mapping required

Ostendo 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

maps to

Odoo ERP

stock.quant + stock.location

1:1
Fully supported

Ostendo 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

maps to

Odoo ERP

stock.warehouse + stock.location

1:many
Fully supported

Ostendo 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

maps to

Odoo ERP

account.asset

1:1
Fully supported

Ostendo 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

maps to

Odoo ERP

res.users

lossy
Mapping required

Ostendo 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)

maps to

Odoo ERP

ir.model.fields (custom)

lossy
Fully supported

Ostendo'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

maps to

Odoo ERP

Not migrated

1:1
Not supported

Ostendo'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.

Gotchas + challenges

What specifically takes care here

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 logo

Ostendo gotchas

High

No public REST API for automated data extraction

Medium

Concurrent user licensing creates user-count mapping complexity

Medium

Custom fields from mobile capture layer require manual mapping

Odoo ERP logo

Odoo ERP gotchas

High

No rollback for CSV imports

High

External ID conflicts on re-import

Medium

Many2many field encoding in CSV imports

Medium

Large export timeouts require batching

Medium

Version schema drift between Odoo releases

Pair-specific challenges

  • Ostendo has no REST API — extraction requires manual and scripted steps

    Ostendo does not publish a public REST API. All data extraction runs through the built-in Data Exporting function (producing CSV or Excel), custom scripting using GetTableNames and GetValueFromStore functions, or direct SQL table access against the Ostendo database. This means migration scheduling cannot be fully automated and must account for manual export steps unless the customer has a third-party integration layer already configured. We handle this by building a scripted extraction harness scoped to each object type, but any real-time delta captures after the initial migration require a manual or scheduled export run from the Ostendo side.

  • Odoo external API rate limits at 1 request per second

    Odoo's external API enforces a rate limit of approximately 1 request per second for standard authenticated sessions. Community posts and Odoo forum threads (Odoo 17 community, API batch import discussions) confirm this limit and note that it applies per session. For migrations involving thousands of product variants, line items, or manufacturing orders, we chunk records into batches and use Odoo's ORM.create() with lists of dicts to create multiple records per API call, reducing round-trips. Without this chunking strategy, large imports time out or are throttled before completion.

  • Multi-level BOMs in Ostendo require flattening before Odoo load

    Ostendo supports nested Bills of Materials with multi-level product structures (sub-assemblies containing their own sub-assemblies). Odoo's BoM model is single-level: a product has one BoM with line items referencing component products, and sub-assemblies are separate products with their own BoMs. We decompose Ostendo's nested BOM hierarchy into a flat Odoo BoM structure during transformation, creating intermediate product records for sub-assemblies where they do not already exist in ITEMMASTER. This is the most transformation-intensive step for manufacturing-heavy migrations and requires BOM depth analysis during discovery before scope finalisation.

  • Custom fields from Freeway Mobile have no standard export format

    Ostendo's Freeway Mobile platform allows user-defined templates for field data capture including checklists, compliance forms, and QA inspections. These custom field definitions are stored per-object and do not have a standard export format through the Data Exporting function. We flag all custom template fields during discovery, enumerate the destination schema for each, and create explicit Odoo custom field definitions (via Studio or metadata) before data loads. Any Freeway-specific data types (GPS coordinates, photo blobs, signature images) are flagged as requiring manual recreation or a third-party Odoo module to replicate.

  • Ostendo concurrent-user licensing maps to named-user equivalents in Odoo

    Ostendo's concurrent-user licensing means the actual user count in the system (25-40% of headcount) differs from the total staff count. When migrating to Odoo's named-user model, the named-user count may be higher than the Ostendo concurrent count. We capture the actual Ostendo user record count and the concurrent-seat license count during discovery, compute the named-user equivalent, and present the comparison before finalising migration scope. If the named-user count exceeds the concurrent license, we flag the under-licensing gap for the customer's finance team.

Migration approach

Six steps for a successful Ostendo to Odoo ERP data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Ostendo logo

Ostendo

Source

Strengths

  • Full operations suite covering inventory, manufacturing, job costing, field service, and POS under one licence.
  • Serial number tracking and multi-site stock location support for businesses with complex warehousing needs.
  • Preventive maintenance and service scheduling automation for field service operations.
  • SQL-based Report Writer with access to all database tables and export to Excel or Word.
  • Concurrent user licensing model reduces seat costs for organisations with lower simultaneous usage.

Weaknesses

  • No publicly documented REST API; integrations require scripting or third-party tools.
  • Limited review presence and thin public community data makes independent evaluation difficult.
  • Interface inconsistency between screens can cause usability friction for power users.
  • Mobile app and custom template layer introduces custom fields that require manual mapping during data migration.
Odoo ERP logo

Odoo ERP

Destination

Strengths

  • Modular architecture with 80+ apps sharing one database — add Sales, Accounting, Inventory, and Manufacturing incrementally.
  • Free Community edition for self-hosting with no per-user license cost, backed by an active open-source community.
  • Per-user pricing starting around $24.90/month on Standard, significantly lower than comparable ERPs like NetSuite or SAP.
  • Automatic workflow propagation across modules — a confirmed sales order updates inventory, triggers invoicing, and posts accounting entries without manual steps.
  • Odoo.sh provides a managed cloud hosting environment with CI/CD for custom module deployment and staging databases.

Weaknesses

  • Performance suffers under heavy customization — large implementations with many active modules require dedicated optimization.
  • No single-click migration between Odoo major versions; each release introduces ORM changes, deprecated API calls, and schema revisions requiring manual adaptation.
  • Per-user and per-module licensing costs can escalate unpredictably for growing teams adding multiple apps.
  • Steep learning curve with hundreds of configuration options across dozens of modules creates adoption friction and training requirements.
  • Support tiers on Enterprise have inconsistent response times, pushing some customers toward alternatives with more reliable SLAs.

Complexity grading

How hard is this migration?

Standard ERP migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Ostendo and Odoo ERP.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Ostendo: Not publicly documented.

  • Data volume sensitivity

    B

    Ostendo doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Ostendo to Odoo ERP migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Ostendo to Odoo ERP data migrations

Answers to the questions buyers ask most during Ostendo to Odoo ERP migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Basic migrations under 8,000 Items, 3,000 Customers, and 2,000 Orders with no multi-level BOMs typically complete in three to six weeks. Migrations with multi-level BOMs, large asset registers (500+ assets), extensive Freeway Mobile custom field templates, or full timesheet history move to eight to fourteen weeks because of BOM decomposition work, custom field reconciliation, and the additional staging validation cycles required for complex manufacturing data.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Ostendo.
Land in Odoo ERP, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day