ERP migration
Field-level mapping, validation, and rollback between AFAS and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
AFAS
Source
Odoo ERP
Destination
Compatibility
10 of 11
objects map 1:1 between AFAS and Odoo ERP.
Complexity
BStandard
Timeline
3-6 weeks
Overview
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.
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 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
Odoo ERP
Account (Accounting)
1:1AFAS 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
Odoo ERP
Contact + Company
1:1AFAS 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
Odoo ERP
Customer Invoice and Vendor Bill
1:1AFAS 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
Odoo ERP
Product
1:1AFAS 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
Odoo ERP
Project and Timesheet
1:1AFAS 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
Odoo ERP
Employee
1:1AFAS 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
Odoo ERP
Payroll Entry
1:1AFAS 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
Odoo ERP
Bank Account and Cash Journal
1:1We 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
Odoo ERP
Attachment (linked to record)
1:1AFAS 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
Odoo ERP
Custom Fields (Studio)
1:1AFAS 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
Odoo ERP
Automated Action and Server Action (documentation)
lossyAFAS 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.
| AFAS | Odoo ERP | Compatibility | |
|---|---|---|---|
| Chart of Accounts | Account (Accounting)1:1 | Fully supported | |
| Customer and Supplier | Contact + Company1:1 | Fully supported | |
| Sales Invoice and Purchase Invoice | Customer Invoice and Vendor Bill1:1 | Fully supported | |
| Inventory Item | Product1:1 | Fully supported | |
| Project and Time Entry | Project and Timesheet1:1 | Fully supported | |
| Employee | Employee1:1 | Fully supported | |
| Payroll Run and Salary History | Payroll Entry1:1 | Fully supported | |
| Bank Account and Cash | Bank Account and Cash Journal1:1 | Fully supported | |
| Document and Attachment | Attachment (linked to record)1:1 | Fully supported | |
| Custom Fields and User-Defined Tables | Custom Fields (Studio)1:1 | Mapping required | |
| Workflow and Approval Chain | Automated Action and Server Action (documentation)lossy | 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.
AFAS gotchas
Custom fields and user-defined tables vary per installation
API access requires AFAS partner enrollment
Workflow logic does not migrate as data
Dutch fiscal and tax data must be preserved accurately
Historical payroll data volumes can be large
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
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.
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.
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.
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.
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.
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
AFAS
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 AFAS 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
AFAS: Not publicly documented in AFAS public materials.
Data volume sensitivity
AFAS 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 AFAS to Odoo ERP migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave AFAS
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.