ERP migration

Migrate from AFAS to Odoo ERP

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

AFAS logo

AFAS

Source

Odoo ERP

Destination

Odoo ERP logo

Compatibility

91%

10 of 11

objects map 1:1 between AFAS and Odoo ERP.

Complexity

BStandard

Timeline

3-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from AFAS to Odoo ERP is a platform migration with significant schema divergence. AFAS stores financial, HR, and operational data in Dutch-localized tables with per-installation custom fields that cannot be inventoried without direct environment access. Odoo uses a modular app model where accounting, inventory, HR, and projects each ship as separate applications that must be installed and sequenced before data import. We open by cataloging every AFAS custom field and user-defined table in the specific source environment, then design the Odoo module activation sequence to match. Dutch BTW tax codes migrate as Odoo tax templates with the same rate and account mapping. Payroll history and HR records move as employee and contract records in Odoo HR; AFAS payroll journal entries are migrated as accounting entries against the correct BTW account. AFAS workflows, approval chains, and custom AFAS tables are documented but not migrated as code; Odoo Studio automated actions and server actions rebuild them post-cutover. Historical transaction volume, custom field count, and the number of AFAS modules in use at the source are the primary variables that determine migration scope and duration.

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

AFAS logo

AFAS

What's pushing teams away

  • Pricing is opaque and requires direct sales engagement with AFAS or a partner, making it difficult for organizations to compare cost against competing ERP platforms during evaluation.
  • Smaller organizations or those with international operations find AFAS less suitable as it was designed primarily for Dutch and Belgian business practices and regulatory environments.
  • The platform's deep customization capabilities mean that every AFAS installation is effectively unique, making it costly and time-consuming to change systems later, which traps some customers despite frustration.
  • Users on G2 note that the UI and reporting tools lag behind modern SaaS ERP alternatives, with dashboards that require significant manual configuration to feel useful.
  • Integration with non-Dutch third-party applications can be limited, forcing organizations to build and maintain custom middleware for ecosystem tools that more globally-oriented ERPs offer natively.

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

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

AFAS

Chart of Accounts

maps to

Odoo ERP

Account (Accounting)

1:1
Fully supported

AFAS Profit stores the Dutch chart of accounts in its financial ledger tables including cost-center mappings and statutory account codes (grootboekrekeningen). We extract the full account structure and map to Odoo Accounting Accounts with the correct account_type (asset, liability, equity, revenue, expense) and code preserved. Dutch BTW account mappings migrate to Odoo tax accounts so that BTW reconciliation reports function correctly post-migration.

AFAS

Customer and Supplier

maps to

Odoo ERP

Contact + Company

1:1
Fully supported

AFAS CRM and procurement modules hold Customer and Supplier records with contact details, addresses, payment terms, and Dutch BTW/VAT registration numbers (BTW-identificatienummer). We split AFAS customers and suppliers into Odoo Contact records (for persons) and Company records (for organizations), preserving VAT numbers, KVK numbers, and payment terms. Odoo's commercial entity model means the Company is the billing party and Contacts under it are the individuals.

AFAS

Sales Invoice and Purchase Invoice

maps to

Odoo ERP

Customer Invoice and Vendor Bill

1:1
Fully supported

AFAS generates sales invoices, purchase invoices, and credit notes within its financial modules. We extract open and historical invoices with line items, BTW tax codes, and payment references. Each invoice migrates as an Odoo account.move record with the correct journal (Sales Journal for customer invoices, Purchase Journal for vendor bills), preserving invoice dates, due dates, and the original AFAS invoice number in the reference field. BTW codes are mapped to the nearest Odoo tax template; accounting team sign-off is required for any BTW remapping.

AFAS

Inventory Item

maps to

Odoo ERP

Product

1:1
Fully supported

AFAS inventory stores Items with stock levels, warehouse locations, pricing tiers, and BOM structures. We extract full item records including active/inactive status, reorder thresholds, and unit of measure. Items migrate to Odoo Product records with the appropriate product_type (storable, consumable, service). BOM structures map to Odoo Bills of Materials if the manufacturing module is activated at the destination. Warehouse locations map to Odoo Inventory Locations.

AFAS

Project and Time Entry

maps to

Odoo ERP

Project and Timesheet

1:1
Fully supported

AFAS project management module holds Project records and associated time entries. We extract projects with their cost-center assignments and time entries linked to the correct employee. Projects migrate to Odoo Project with timesheets enabled. AFAS custom fields on projects and non-standard rate structures require field-level mapping during extraction and are documented in the field inventory deliverable.

AFAS

Employee

maps to

Odoo ERP

Employee

1:1
Fully supported

AFAS maintains employee records with contract details, department assignments, and employment status. We extract employees and their HR registry entries and map them to Odoo HR Employee records. Dutch-specific fields (BSN, contract type, CAO affiliation, pension provider) migrate to Odoo HR custom fields or contract fields as available. Employees must be migrated before payroll records because Odoo HR uses employee as the parent record for contracts.

AFAS

Payroll Run and Salary History

maps to

Odoo ERP

Payroll Entry

1:1
Fully supported

AFAS stores payroll runs, salary history, and payroll journal entries for each pay period. We extract effective-dated compensation records and journal entries. Dutch-specific payroll components (bruto/netto calculation, loonheffing, werknemersverzekeringen, pensioenpremie) migrate as Odoo Payroll line entries against the employee's contract. Historical payroll migrates as closed periods; current-year open payroll is migrated as open entries for the customer's accounting team to close in Odoo.

AFAS

Bank Account and Cash

maps to

Odoo ERP

Bank Account and Cash Journal

1:1
Fully supported

We extract bank account configurations and current balances from AFAS cash management. Each AFAS bank account becomes an Odoo Bank journal with the account number preserved and an opening balance entry posted on the migration date. Reconciliation data from AFAS does not migrate as reconciled transactions in Odoo; we deliver an opening-balance report so the customer's accountant can reconcile manually in Odoo post-go-live.

AFAS

Document and Attachment

maps to

Odoo ERP

Attachment (linked to record)

1:1
Fully supported

AFAS links documents to records across modules. We extract attachments associated with transactional records (invoices, projects, employees) as binary files. Odoo stores attachments on the ir.attachment model linked to the target record via res_model and res_id. The AFAS internal document storage format may require format conversion for some file types; we flag any non-standard formats during discovery.

AFAS

Custom Fields and User-Defined Tables

maps to

Odoo ERP

Custom Fields (Studio)

1:1
Mapping required

AFAS allows extensive custom fields on standard objects and user-defined tables unique to each installation. Every AFAS deployment we have migrated has between 10 and 80 custom fields and 2-15 user-defined tables that have no standard Odoo equivalent. We inventory every custom field during discovery, classify each as a 1:1 map, a transform required, or a custom field to create in Odoo Studio, and deliver a written custom-field migration plan. User-defined tables with complex relationships may require a custom Odoo module to reproduce the data model.

AFAS

Workflow and Approval Chain

maps to

Odoo ERP

Automated Action and Server Action (documentation)

lossy
Fully supported

AFAS workflows define approval chains, conditional routing, and automated actions across HR, finance, and operations. We extract workflow configurations as process maps and deliver a written inventory identifying each AFAS workflow, its trigger, conditions, and actions with a recommended Odoo Automated Action or Server Action equivalent. Workflows are not migrated as executable code. The customer's Odoo partner or admin rebuilds them in Odoo Studio 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.

AFAS logo

AFAS gotchas

High

Custom fields and user-defined tables vary per installation

High

API access requires AFAS partner enrollment

Medium

Workflow logic does not migrate as data

Medium

Dutch fiscal and tax data must be preserved accurately

Low

Historical payroll data volumes can be large

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

  • Dutch BTW codes require manual configuration in Odoo

    AFAS ships with Dutch BTW tax codes preconfigured for the Netherlands and Belgium including reduced rates, BTW-identificatienummer validation, and BTW return reporting mappings. Odoo provides a generic tax engine but Dutch-specific BTW codes must be created manually or imported from an Odoo localization pack. We extract the exact BTW rate and account assignments from AFAS for every invoice line and present them as a BTW remapping table. Any change to BTW treatment requires sign-off from the customer's accounting team and their Dutch tax advisor before migration proceeds because incorrect BTW coding on historical invoices can create compliance exposure with the Belastingdienst.

  • Custom fields and user-defined tables are per-installation

    AFAS Profit allows administrators to extend standard objects with custom fields and create entirely new tables. No two AFAS installations share the same schema; established AFAS customers often have 20-80+ custom fields that have accumulated over years of configuration. We cannot scope a migration accurately without a live inventory of every custom field and user-defined table in the specific source environment. We request schema access during discovery to extract the field catalog before designing the Odoo field mapping. Any custom field omitted from the inventory is lost at cutover.

  • AFAS workflows do not migrate to Odoo automated actions

    AFAS workflows use a proprietary rule engine to define approval chains, conditional routing, and automated field updates. Odoo Studio automated actions and server actions serve a similar purpose but are a different implementation model. We extract AFAS workflow configurations as written process documentation and deliver a workflow rebuild guide mapping each AFAS trigger and action to its Odoo Studio equivalent. The customer's admin or Odoo partner rebuilds the automations post-migration. We do not write Odoo Python code for custom workflow logic inside the standard migration scope.

  • Odoo requires module activation in dependency order

    Odoo's modular architecture means that accounting, inventory, HR, and projects each ship as separate applications that must be installed and configured before their data can be imported. For example, product variants require the Inventory app; employees require the HR app; payroll requires the HR app and Accounting app. We design the Odoo module activation sequence during discovery so that the target environment is ready before extraction begins. Migrations that extract data before the destination Odoo apps are installed cause import failures and require re-extraction.

  • Historical payroll data volumes require scoping

    AFAS retains payroll history across all employment periods for Dutch compliance (avgiftswetgeving). Organizations with long-tenured employees may have 10-20 years of earning records, deductions, and journal entries. Migrating all historical payroll can multiply migration volume significantly. We scope historical payroll extraction with the customer before extraction, typically limiting to the current year plus two prior closed years plus all year-end closing records. Prior-year detail that is not migrated is preserved in the AFAS backup and can be retrieved if needed for tax audits.

Migration approach

Six steps for a successful AFAS to Odoo ERP data migration

  1. AFAS environment discovery and schema inventory

    We audit the source AFAS environment to identify every active module (financial, HR, payroll, inventory, project), every custom field on every standard object, and every user-defined table. We request read access to the AFAS Profit administration panel and work with the customer's AFAS account manager to obtain API credentials if not already held. The discovery output is a written schema delta: a complete list of fields that exist in the source but have no standard Odoo equivalent, which become Odoo Studio custom fields, and user-defined tables that require a custom Odoo module to reproduce. This step is the gating item for accurate scoping and cannot be shortened.

  2. Odoo edition selection and module activation

    We work with the customer to select the appropriate Odoo edition and apps. Odoo Community is free and self-hosted; Odoo Online is SaaS with per-app pricing; Odoo Enterprise adds a premium support tier and exclusive apps. We identify which Odoo apps are required based on the AFAS modules in use: Accounting (always), Inventory (if inventory module active), HR and Payroll (if HR module active), Project (if project management active). We activate the minimum required apps to keep the destination schema lean. Odoo.sh or a local Docker instance is provisioned for the migration environment before extraction begins.

  3. BTW configuration and account mapping in Odoo

    We configure Dutch BTW tax templates in Odoo using the exact rates and account assignments from AFAS. This includes the standard 21% BTW rate, reduced rates (9%, 0%), BTW-aangifte account mappings, and intracommunity VAT codes if the customer has EU transactions. The AFAS BTW account codes are mapped to Odoo tax accounts. We present a BTW remapping table to the customer's accounting team for sign-off before any invoice records are imported. This step cannot be deferred because every invoice line in Odoo references a tax record.

  4. Sandbox migration and reconciliation

    We run a full migration into a non-production Odoo environment using production-equivalent data volume extracted from AFAS. The customer's accounting lead and HR lead reconcile record counts, spot-check 20-40 records against the AFAS source, and validate BTW coding on a sample of 10-15 invoices. Custom field mapping is validated in the sandbox. Any schema corrections (missing fields, incorrect field types, wrong tax mappings) are applied before the production migration begins. Sandbox reconciliation is the last chance to catch mapping errors without affecting the live system.

  5. Production migration in dependency order

    We execute the production migration in record-dependency sequence: chart of accounts and BTW configuration (already complete), then bank accounts, then companies and contacts, then products and inventory, then open and historical invoices, then employees and contracts, then payroll entries, then projects and time entries, then attachments, then custom fields last because they often reference the standard records above. Each phase emits a row-count reconciliation report before the next phase begins. We pause between phases to allow the customer's team to spot-check in the live Odoo environment.

  6. Cutover, delta sync, and workflow rebuild handoff

    We freeze AFAS writes during the cutover window and run a final delta migration of any records created or modified since the initial extraction. We then enable Odoo as the system of record. We deliver the AFAS workflow inventory with Odoo Studio rebuild recommendations to the customer's admin team. We do not rebuild AFAS workflows as Odoo automated actions inside the migration scope; that is a separate engagement. We support a five-business-day hypercare window where we resolve any data reconciliation issues reported by the customer's team.

Platform deep dives

Context on both ends of the pair

AFAS logo

AFAS

Source

Strengths

  • Integrated ERP, HR, and payroll under one vendor eliminates synchronization between separate finance and HR systems.
  • Built-in Dutch and Belgian regulatory compliance for payroll tax, fiscal reporting, and statutory filings.
  • Customizable workflow engine lets functional staff create approval processes without code.
  • Established Benelux partner ecosystem provides local implementation and support options.
  • AFAS Profit is available as on-premises, hosted, or SaaS deployment to suit different data-residency requirements.

Weaknesses

  • Pricing is not publicly published, requiring a sales conversation before any cost evaluation can begin.
  • The platform is heavily localized to Dutch business practices, creating friction for international or multilingual organizations.
  • Custom field and table extensibility means every AFAS installation diverges from the standard data model, increasing migration complexity.
  • Modern UX and self-service reporting lag behind newer cloud-native ERP competitors.
  • Limited self-service API access requires partner enrollment, restricting independent integration development.
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 AFAS 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

    AFAS: Not publicly documented in AFAS public materials.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Small migrations covering accounting, inventory, and up to 2,000 employee records with minimal custom fields complete in three to six weeks. Mid-size migrations including HR, payroll, multi-entity consolidation, and 15-30 custom AFAS fields require eight to twelve weeks. Large migrations with extensive historical financial data, complex Dutch payroll across multiple CAOs, and 40+ custom fields exceed twelve weeks. The discovery and schema inventory phase alone typically takes two to three weeks because we cannot scope custom field volume without direct AFAS environment access.

Adjacent paths

Related migrations to explore

Ready when you are

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