ERP migration

Migrate from metasfresh to Odoo ERP

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

metasfresh logo

metasfresh

Source

Odoo ERP

Destination

Odoo ERP logo

Compatibility

55%

6 of 11

objects map 1:1 between metasfresh and Odoo ERP.

Complexity

BStandard

Timeline

6-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

metasfresh and Odoo ERP are both open-source ERPs, but they differ fundamentally in how data is accessed and in the breadth of their ecosystems. metasfresh has no well-documented public REST API; migrations require direct PostgreSQL reads against the source database using read-only credentials. Odoo exposes XML-RPC, JSON-RPC, and a REST API for inbound data loading, so the migration pipeline ends in Odoo's API rather than in a flat-file loader. The metasfresh ADempiere-rooted data model (Business Partners, Products, multi-table Orders, BOMs, Pricing Systems) maps to Odoo's res.partner, product.product, sale.order/purchase.order, account.move, mrp.bom, and product.pricelist structures. We preserve partner type (customer versus vendor), BOM component relationships, pricing version effective dates, and project hierarchy throughout. Automations, workflows, and DATEV-specific export configurations do not migrate; we deliver a written inventory of these for the customer's Odoo admin to rebuild.

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

metasfresh logo

metasfresh

What's pushing teams away

  • Steep learning curve when configuring the system for industries outside its default food and beverage workflows, requiring significant consultant time.
  • Installation and build times can be slow, with users reporting the application sometimes hanging during Docker image builds.
  • Not a turnkey solution — companies without technical staff or ERP experience may struggle to configure and maintain metasfresh without external help.
  • Self-hosting responsibility means no vendor-managed updates, backups, or SLA, which some companies prefer to outsource to a SaaS provider.

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 metasfresh objects map to Odoo ERP

Each row shows how a metasfresh 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.

metasfresh

Business Partners

maps to

Odoo ERP

res.partner

1:1
Fully supported

metasfresh Business Partners (C_BPartner table) cover both customers and vendors with roles stored in the PartnerType property. We map vendor records to res.partner with type=supplier, customer records to res.partner with type=contact or type=company depending on whether the record has sub-contact entries. metasfresh contact persons stored in AD_User map to additional res.partner records linked via parent_id to the owning company partner. Bank account references stored in C_BP_BankAccount map to res.partner.bank_ids in Odoo. Address and location data from C_Location transfers to res.partner (street, city, country, zip). The is_customer and is_vendor boolean flags from metasfresh set the corresponding flags on res.partner. We preserve the metasfresh BPartner value (document number) as a reference field for audit traceability.

metasfresh

Products

maps to

Odoo ERP

product.product / product.template

1:1
Fully supported

metasfresh products (M_Product and M_Product_Category) map to Odoo product.template with product.product variants when the metasfresh product has attribute values set. The M_Product_Category hierarchy becomes product.category in Odoo. Product codes (value) map to default_code, SKUs from the XLS export map to barcodes, and product types (item vs service) map to Odoo's type field (product vs service). If metasfresh uses multi-variant products via its attribute system, we split into product.template plus product.product variants in Odoo. Products without variants create a single product.product record with no variants. Stockable, consumable, and service product types all transfer directly.

metasfresh

Bill of Materials

maps to

Odoo ERP

mrp.bom

1:1
Fully supported

metasfresh BOM data lives in pp_product_bom and pp_product_bomline tables, with dependencies on the MRP module that must be confirmed active during discovery. Each pp_product_bom record maps to Odoo mrp.bom with bom_line records for every component. The pp_product_bomline quantities_per_bom and is_active flags transfer to Odoo's product_qty and active fields. Component products are resolved to their Odoo product.product IDs before bom_line insert. We inspect the PP_Product_BOM table during discovery to confirm the MRP module is populated; BOM migration is skipped if the tables are empty. Work center and routing data (pp_order_bomrecord) maps to mrp.routing_workcenter if the metasfresh installation uses routings.

metasfresh

Sales Orders and Purchase Orders

maps to

Odoo ERP

sale.order / purchase.order

1:many
Fully supported

metasfresh orders span the C_Order header and C_OrderLine lines table with a document direction flag determining whether an order is a sales or purchase document. We split on that direction flag: sales orders map to Odoo sale.order with sol lines; purchase orders map to Odoo purchase.order with pol lines. Order document status (draft, in progress, completed, closed, cancelled) maps to Odoo's state field. Header-level financial terms (pricing list, payment rule, incoterms) transfer to the Odoo order header; line-level discount, tax, and quantity fields transfer to each order line. Completed and closed orders migrate as confirmed records; draft orders migrate as draft in Odoo. Order-to-order references (linking a purchase order to a sales order) are preserved as notes or via the Odoo procurement group if the customer activates the supply chain module.

metasfresh

Invoices

maps to

Odoo ERP

account.move (Customer Invoice / Vendor Bill)

1:many
Mapping required

metasfresh invoices are stored in C_Invoice (header) and C_InvoiceLine (lines) with a DocStatus flag that determines whether the record is a Customer Invoice (AR) or Vendor Bill (AP). We split on document type: AR invoices map to Odoo account.move with move_type=out_invoice, AP invoices map to move_type=in_invoice. Payment terms stored in C_PaymentTerm resolve to account.payment.term lines in Odoo. Tax lines in C_Tax are resolved to account.tax records in Odoo before invoice import so that tax_id lookups succeed. The invoice-to-order reference (C_Invoice.C_Order_ID) is preserved as a link to the corresponding Odoo sale.order or purchase.order. Historical invoices with DocStatus=CO (completed) and payment records in C_Payment are migrated together so that Odoo shows open or paid state accurately.

metasfresh

Pricing Systems and Price Lists

maps to

Odoo ERP

product.pricelist / product.pricelist.version

1:many
Mapping required

metasfresh pricing organizes into M_PricingSystem containing multiple M_PriceList versions with effective-from dates. Each M_PriceList maps to Odoo product.pricelist, and each M_PriceList_Version becomes a product.pricelist.version record linked to its parent pricelist. Price list item records (M_PriceListItem) map to product.pricelist.item with the original metasfresh price, surcharge, and discount percentage fields transferred to Odoo's base_price, price_surcharge, and percent_price. We order version inserts by effective date so that the correct price is active on the correct date in Odoo. Currency data from C_Currency maps to res.currency; the customer country pricing rules in metasfresh become Odoo country_id rules on the pricelist item.

metasfresh

Projects and Project Lines

maps to

Odoo ERP

project.project / project.task

1:1
Mapping required

metasfresh projects (C_Project header plus project lines tracking time, costs, and deliverables) map to Odoo project.project with project.task records for each project line. Project phases stored as C_ProjectPhase map to Odoo task records with the parent project reference. Milestones map to Odoo milestones if the Odoo project module version supports them. The owning Business Partner reference on the metasfresh project transfers as partner_id on the Odoo project. Project status, dates, and budget information migrate to project.project fields. Deliverables and costs stored in project line columns map to task description and task-level planned/actual hour fields.

metasfresh

Bank Accounts and Payment Terms

maps to

Odoo ERP

res.partner.bank / account.payment.term

1:1
Fully supported

metasfresh bank accounts stored per organization in C_BP_BankAccount map to res.partner.bank records in Odoo with the IBAN, SWIFT/BIC, and bank name fields transferred. Payment terms (net 30, net 60, 2/10 net 30) stored in C_PaymentTerm map to Odoo account.payment.term with line definitions matching the metasfresh discount days, discount percentage, and net days. These reference records must migrate before Orders and Invoices so that the payment term lookups are satisfied at insert time.

metasfresh

Tax Categories and Tax Codes

maps to

Odoo ERP

account.tax / account.tax.group

1:1
Fully supported

metasfresh tax configuration in C_Tax with country and effective date ranges maps to Odoo account.tax with the rate, tax_scope (sale vs purchase vs none), and applicable countries transferred. Tax groups from C_TaxCategory map to account.tax.group in Odoo. metasfresh uses taxIncludedInPrice flags that we translate to Odoo's price_include field on account.tax. Tax jurisdictions per geographic zone become Odoo tax.repartition.line records for the customer tax accounts if the Odoo country localization module supports it. We preserve effective-from dates so that the correct tax rate is active in Odoo on the correct date.

metasfresh

Complaints and Service Repairs

maps to

Odoo ERP

helpdesk.ticket or project.project

lossy
Mapping required

metasfresh customer complaints and repair workflows create service project records linked to returned products (C_Project with project category = service/repair). These migrate to Odoo helpdesk.ticket if the customer activates the Odoo Helpdesk module, or to project.project with a service task type if Helpdesk is not in scope. The link back to the originating sales order is preserved as a note on the ticket or project record. We flag this object as configuration-dependent and confirm the customer's Odoo app set during scoping.

metasfresh

Custom Fields (AD_Column extensions)

maps to

Odoo ERP

ir.model.fields

lossy
Mapping required

metasfresh custom fields added via the Table and Column system are stored as rows in AD_Column with a custom flag. They are not surfaced in metasfresh's standard export format. We query AD_Column during the discovery phase to identify all custom fields per table and add them as additional columns to the export. In Odoo, we pre-create each custom field as ir.model.fields with the correct type (Char, Integer, Many2one, Selection, etc.) before the relevant object migration begins. The custom field identification and Odoo schema extension step adds approximately one to two days to the discovery phase.

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.

metasfresh logo

metasfresh gotchas

High

No well-documented public REST API for data migration

High

Attachment and archived document extraction is unreliable

Medium

BOM and manufacturing data requires deep schema knowledge

Medium

Custom fields discovered at runtime, not import time

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

  • metasfresh has no public REST API; migrations require PostgreSQL direct reads

    metasfresh does not publish a consumer-facing REST API with documented endpoints for data extraction. All migration data comes from flat-file exports, custom SQL views, or direct PostgreSQL queries using read-only credentials against the source database. We connect to the metasfresh PostgreSQL instance during the discovery phase, inspect the table structure for the C_BPartner, M_Product, M_Order, C_Invoice, and PP tables, and construct a migration pipeline from those reads. The customer must provide database credentials and confirm that read-only access to the metasfresh PostgreSQL instance is permitted by their infrastructure team. If the database is not accessible (e.g., hosted on an air-gapped network), the migration scope changes significantly and a separate scoping engagement is required.

  • Attachments and archived documents cannot be reliably extracted from metasfresh

    metasfresh stores archived invoice PDFs and file attachments as byte arrays in the database or as file system references whose paths are not tracked consistently in metadata tables. There is no supported export path for these objects. We flag this explicitly during scoping and exclude attachments and archived document blobs from the migration deliverable. If the customer requires these files, they need direct database access to retrieve the byte arrays manually and a separate file reimport plan for Odoo's ir.attachment model. This is a metasfresh architectural limitation, not a migration tooling issue, and must be disclosed before migration sign-off.

  • BOM and manufacturing data requires MRP module to be confirmed active

    metasfresh stores bill of materials data across pp_product_bom, pp_product_bomline, and pp_order_bomrecord tables. These tables depend on the MRP module being active in the metasfresh installation. If the MRP module is not enabled or the PP tables are empty, BOM migration is skipped. We inspect the PP_Product_BOM table structure during discovery and include BOM lines only when the PP tables are populated. Odoo's mrp.bom and mrp.routing_workcenter models require the Odoo Manufacturing app to be activated in the destination; if it is not, BOM data is delivered as a structured CSV with Odoo field mapping for manual import or partner-led configuration.

  • metasfresh food and beverage defaults require Odoo module scoping

    metasfresh ships with preconfigured workflows, data structures, and default configurations that reflect food and beverage industry requirements (lot and serial number tracking, shelf-life dates, catch weight, EDI for distributors). These metasfresh defaults do not map directly to Odoo equivalents and may require Odoo apps (Quality, Lot/Serial, or EDI modules) to be activated in the destination. We identify any metasfresh configuration fields that reference food and beverage-specific concepts during discovery and flag them as requiring Odoo partner configuration if the customer's industry is not food and beverage. The migration deliverable includes a written list of these non-transferable configurations.

  • Master data quality issues surface during PostgreSQL extraction, not during Odoo import

    metasfresh environments that have been in production for several years often contain duplicate BPartner records (same company created multiple times), products without a defined product category, orders with missing partner references, and inactive pricing version records with future effective dates that will not apply in Odoo. These data quality issues are invisible in metasfresh's UI but become blocking errors during the PostgreSQL-to-Odoo API pipeline because Odoo enforces required field constraints and foreign key lookups. We identify and report duplicate partners, orphaned orders, and unresolved pricing versions during the discovery phase so that the customer can clean the data before production migration rather than during cutover when time pressure is highest.

Migration approach

Six steps for a successful metasfresh to Odoo ERP data migration

  1. Discovery and PostgreSQL schema inspection

    We connect to the metasfresh PostgreSQL instance using read-only credentials provided by the customer. We run discovery queries against the core tables (C_BPartner, M_Product, M_Product_Category, M_Product_BOM, C_Order, C_Invoice, M_PricingSystem, M_PriceList, C_Project, C_PaymentTerm, C_Tax, AD_Column) to assess record counts, data freshness, and the presence of custom fields. We confirm whether the MRP module is active (pp_product_bom tables populated) and whether the metasfresh installation uses multi-company configuration or custom table extensions. The discovery output is a written migration scope covering object counts, identified data quality issues, and a confirmed object-to-object mapping plan.

  2. Odoo destination schema design

    We design the Odoo destination schema based on the discovery output. This includes provisioning product categories, product templates and variants, price lists with versioned entries, the Manufacturing app (mrp.bom, mrp.routing_workcenter) if BOM data is in scope, account.tax and account.tax.group records matched to metasfresh tax rates and effective dates, account.payment.term records, res.partner.bank records for bank account reference data, and custom fields on each target model identified from AD_Column. Schema is deployed into an Odoo test database or sandbox instance first. We coordinate with the customer's Odoo partner or admin to confirm the correct country localization module (l10n_de, l10n_fr, etc.) is activated so that chart of accounts and tax defaults are pre-populated.

  3. Pilot migration and data quality resolution

    We run a full migration into the Odoo test instance using representative data volumes (a sample of each object type, not a full extract) to validate the PostgreSQL-to-Odoo pipeline end to end. This pilot surfaces blocking issues: missing required Odoo fields on metasfresh records, foreign key lookup failures (e.g., a metasfresh order with a null partner_id), and duplicate BPartner records that violate Odoo's uniqueness constraints. We deliver a data quality report listing every record that requires resolution, categorized by severity. The customer cleans or approves each batch before we proceed to production migration. No production migration begins until the pilot migration achieves greater than 99% record acceptance.

  4. Production migration in dependency order

    We run production migration in strict dependency order so that foreign key lookups succeed at each phase: reference data first (payment terms, tax codes, product categories, bank accounts), then master data (partners, products, price lists and versions, BOMs), then transactional data (sales orders, purchase orders, invoices). Each phase emits a row-count reconciliation report comparing records inserted in Odoo against the PostgreSQL source count. Custom fields are included in each phase insert as additional columns, not as a separate post-migration step. Discrepancies are investigated and corrected before the next phase begins.

  5. Cutover, delta migration, and validation

    We freeze writes to metasfresh at a defined cutover moment, extract any records modified during the migration window as a delta load, and insert them into Odoo. We run a final reconciliation comparing Odoo totals (partner count, product count, order count, invoice count, BOM line count) against metasfresh totals for each object type. The customer's operations lead spot-checks a sample of migrated records against the metasfresh source for accuracy of field values and preservation of document relationships. Any remaining mapping corrections are applied in Odoo directly. The metasfresh instance is left in read-only archive mode. We do not decommission the source system; that decision is the customer's.

  6. Automation and workflow rebuild handoff

    We deliver a written inventory of metasfresh workflow configurations, automation rules, and any DATEV-specific export setups that cannot migrate to Odoo as code. The inventory documents each metasfresh workflow trigger, conditions, and actions with a recommended Odoo counterpart (automated actions, server actions, or Odoo Workflow configuration). DATEV export configurations are documented for the customer's tax advisor and Odoo localization partner to rebuild using Odoo's l10n_de module or a certified DATEV-compatible accounting module from the Odoo Apps store. We do not rebuild metasfresh automations or DATEV configurations inside the migration scope.

Platform deep dives

Context on both ends of the pair

metasfresh logo

metasfresh

Source

Strengths

  • Completely free and open-source under GPLv2/GPLv3 with no per-user or per-company license fees.
  • Docker and Kubernetes deployment flexibility gives full infrastructure control and data sovereignty.
  • DATEV accounting export built in serves the DACH region's tax advisor workflow natively.
  • 60,000+ commits and active development since 2004 indicate long-term project stability.
  • Source code access enables deep customization that commercial ERPs charge premium tiers for.

Weaknesses

  • No vendor-managed cloud hosting option with SLA — self-hosting and maintenance are entirely the customer's responsibility.
  • Public REST API is not well-documented; migrations rely on flat-file exports, SQL access, or metasfresh's internal migration tooling.
  • Installation and build processes can be slow and unreliable, especially in Docker environments without pre-configured resources.
  • Default workflows favor food and beverage industry, requiring significant reconfiguration for other verticals.
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 metasfresh 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

    metasfresh: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your metasfresh 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 metasfresh to Odoo ERP data migrations

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

Can't find your answer?

Walk through your metasfresh to Odoo ERP migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most metasfresh to Odoo migrations land between six and eight weeks for instances under 10,000 partners, 5,000 products, and no active MRP module with populated BOM tables. Migrations with pp_product_bom tables containing hundreds of BOM lines, multiple pricing system versions, multi-company metasfresh setups, or large order histories (over 50,000 transactional records) move to fourteen to twenty weeks. The primary time driver is the discovery and PostgreSQL schema inspection phase, which establishes the data quality baseline, followed by BOM line resolution if the MRP module is active.

Adjacent paths

Related migrations to explore

Ready when you are

Move from metasfresh.
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