ERP migration
Field-level mapping, validation, and rollback between WP ERP and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
WP ERP
Source
Odoo ERP
Destination
Compatibility
10 of 12
objects map 1:1 between WP ERP and Odoo ERP.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from WP ERP to Odoo ERP is a cross-platform migration that must extract data from WordPress custom tables (erp_hr_*, erp_crm_*, erp_ac_*) because WP ERP stores its core records outside standard WordPress posts and user meta. We perform direct MySQL extraction, cross-reference WordPress user IDs for HR employee linkage, resolve WooCommerce CRM integration duplicate contacts, and map the WP ERP Chart of Accounts to Odoo's COA structure before import. Odoo runs on its own application server separate from WordPress, which resolves the PHP memory limits and database bottlenecks that WP ERP users report at scale. Workflow rules stored as serialized PHP in wp_options do not migrate as code; we deliver a written inventory of every active workflow for the customer's admin to rebuild in Odoo Studio or through Python-based server actions. The migration runs through Odoo's XML-RPC API with rate-limit handling and batch chunking, targeting the correct Odoo model (hr.employee, res.partner, crm.lead, account.move) in dependency order.
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 WP ERP 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.
WP ERP
erp_hr_employees
Odoo ERP
hr.employee
1:1WP ERP employee records in erp_hr_employees map to Odoo hr.employee. We resolve the wp_user_id foreign key to pull the WordPress user display name, email, and role, then create the hr.employee record with name, work email, department_id (mapped from erp_hr_departments), job_title, hire_date, and employment status (employment_status field). Compensation data from the HRM module (salary, pay frequency) maps to hr.contract records linked to the employee. Department tree is migrated first so that employee.department_id references are satisfied during employee import.
WP ERP
erp_hr_departments
Odoo ERP
hr.department
1:1WP ERP department records in erp_hr_departments use a simple parent_id hierarchy. We migrate the department tree top-down, preserving the parent-child structure in Odoo's hr.department model where each department has a manager_id (resolved from the migrated hr.employee record) and a parent_id pointing to the parent department. Departments must migrate before employees so that department_id foreign keys are valid at employee insert time.
WP ERP
erp_crm_contacts
Odoo ERP
res.partner
1:manyWP ERP CRM contacts map to Odoo res.partner. WP ERP stores individuals (contacts) and organizations (companies) as separate tables (erp_crm_contacts and erp_crm_companies), while Odoo uses a single res.partner model with an is_company toggle. We map WP ERP contacts where is_crm_company=0 to res.partner with is_company=False, and WP ERP companies to res.partner with is_company=True. The lifecycle_stage and source attribution from WP ERP migrate as custom Char fields on res.partner. When WooCommerce CRM integration is active, we detect duplicate contact candidates (same email in both manual CRM contacts and WooCommerce order records) and give the customer the choice to merge before export.
WP ERP
erp_crm_companies
Odoo ERP
res.partner (is_company=True)
1:1WP ERP company records map to Odoo res.partner with is_company=True. The company name, billing address, phone, website (domain field), and industry classification migrate directly. Company-to-contact relationships stored in erp_crm_contact_relations are preserved as child res.partner records linked to the parent company partner. Company IDs are remapped during migration to match Odoo's sequential partner ID generation, and the mapping table is maintained so that any deal associations reference the correct partner.
WP ERP
erp_crm_deals (Deals extension)
Odoo ERP
crm.lead
1:1WP ERP Deals ($9.49/mo extension) map to Odoo crm.lead. Deal title, value, currency, stage, owner (hubspot_owner_id resolved to Odoo res_users), and pipeline association migrate to crm.lead fields (name, planned_revenue, currency_id, stage_id, user_id, team_id). WP ERP pipeline stages are mapped to Odoo stage names within the crm.lead stage pipeline configuration. The deal_currency field from WP ERP maps to Odoo's currency_id using ISO 4217 currency codes. Deals without a linked contact or company are migrated as unassigned leads for the customer admin to route.
WP ERP
erp_crm_activities
Odoo ERP
mail.message + mail.activity
1:1WP ERP CRM activities (calls, meetings, emails, tasks, notes) stored in erp_crm_activities with polymorphic type fields map to Odoo mail.message records linked to the parent res.partner or crm.lead. Each activity type maps to a different Odoo model: calls and tasks become mail.message with subtype indicating call or task; emails become mail.message with email=True; meetings create calendar.event records linked via mail.message. Notes migrate as mail.message with note=True. We preserve the original activity timestamp and the owner (resolved via wp_user_id to Odoo res_users) for audit continuity.
WP ERP
erp_ac_chart_of_accounts
Odoo ERP
account.account
lossyWP ERP Chart of Accounts in erp_ac_chart_of_accounts maps to Odoo account.account records. The primary challenge is translating WP ERP's flat COA with type and subtype fields into Odoo's structured account type hierarchy (view, receivable, payable, liquidity, revenue, expense, etc.). We map WP ERP account types (Asset, Liability, Equity, Income, Expense) to Odoo account.account.account_type values, and preserve the parent-child account grouping in Odoo's account.group model for financial statement structuring. Account codes are mapped directly; the customer configures Odoo's account_digits setting to match WP ERP's code length before import.
WP ERP
erp_ac_customers
Odoo ERP
res.partner (customer=True)
1:1WP ERP accounting customers in erp_ac_customers link to CRM contacts via erp_crm_contacts.id. We resolve this cross-reference during migration so that the accounting customer lands as the same res.partner record as the CRM contact, with customer_rank elevated and the account_receivable account assigned from the mapped COA. Any open receivable balance from WP ERP's accounting ledger migrates as a start_balance on the res.partner record.
WP ERP
erp_ac_vendors
Odoo ERP
res.partner (supplier=True)
1:1WP ERP vendor records in erp_ac_vendors map to Odoo res.partner with supplier=True. We migrate the vendor name, billing address, contact email, and phone. Vendor-ledger entries in the accounting module link via the vendor_id foreign key to the partner record. The account_payable account from the mapped COA is assigned to the vendor partner record in Odoo.
WP ERP
erp_ac_invoices
Odoo ERP
account.move
1:1WP ERP invoices in erp_ac_invoices map to Odoo account.move records with move_type set to out_invoice (customer) or in_invoice (vendor). We extract line items, tax codes (mapped to Odoo account.tax records using the tax name as the dedupe key), payment status, and due date. WP ERP invoice status (open, paid, voided) maps to Odoo's state field (draft, posted, cancel). Open invoices migrate as posted journal items against the correct receivable or payable account. Closed invoices migrate with state=posted and the payment reconciliation recorded against the bank journal. We flag any partially paid invoices for manual reconciliation in Odoo after import.
WP ERP
erp_ac_journal_entries
Odoo ERP
account.move (entry)
1:1WP ERP journal entries in erp_ac_journal_entries (both manual entries and those generated by the Payroll module) map to Odoo account.move records with move_type=entry. Each journal entry's debit and credit line items are mapped to Odoo account.move.line records with the correct account_id resolved from the COA mapping, partner_id for receivable/payable lines, and analytic_account_id if analytic dimensions exist in the WP ERP entry. Payroll-generated journal entries are imported as entry moves with a payroll reference in the narration field for audit trail purposes.
WP ERP
erp_hr_payroll_historical (Payroll extension)
Odoo ERP
hr.payslip
1:1WP ERP Payroll extension ($9.49/mo) historical payslip records in erp_hr_payroll* tables map to Odoo hr.payslip records linked to the corresponding hr.employee. We extract payslip date, worked days, inputs (allowances, deductions), and the computed net pay. Payslip PDFs are not regenerated by Odoo; if the customer requires payslip documents for compliance, they must either regenerate them in Odoo using the payslip data or retain the original WP ERP PDFs as an archive. We document this as a post-migration action item.
| WP ERP | Odoo ERP | Compatibility | |
|---|---|---|---|
| erp_hr_employees | hr.employee1:1 | Fully supported | |
| erp_hr_departments | hr.department1:1 | Fully supported | |
| erp_crm_contacts | res.partner1:many | Fully supported | |
| erp_crm_companies | res.partner (is_company=True)1:1 | Fully supported | |
| erp_crm_deals (Deals extension) | crm.lead1:1 | Fully supported | |
| erp_crm_activities | mail.message + mail.activity1:1 | Fully supported | |
| erp_ac_chart_of_accounts | account.accountlossy | Fully supported | |
| erp_ac_customers | res.partner (customer=True)1:1 | Fully supported | |
| erp_ac_vendors | res.partner (supplier=True)1:1 | Fully supported | |
| erp_ac_invoices | account.move1:1 | Fully supported | |
| erp_ac_journal_entries | account.move (entry)1:1 | Fully supported | |
| erp_hr_payroll_historical (Payroll extension) | hr.payslip1:1 | 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.
WP ERP gotchas
Custom database tables require direct SQL extraction
PHP version and WordPress version mismatches block migration tooling
WooCommerce CRM integration creates duplicate contact records
Payroll historical data is module-gated and extension-specific
Workflow automation rules are serialized PHP in wp_options
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 scope definition
We audit the source WP ERP installation across all active modules (HRM, CRM, Accounting, and any paid extensions: Deals, Payroll, Document Manager, Inventory, Workflow). We count record volumes per table (erp_hr_employees, erp_crm_contacts, erp_crm_companies, erp_ac_chart_of_accounts, erp_ac_invoices, erp_ac_journal_entries), identify any WooCommerce CRM integration tables, and flag the payroll extension presence. We pair this with an Odoo edition recommendation: Odoo Community (free, self-hosted) covers most migrations; Odoo Enterprise is recommended if the customer needs the Studio builder, automated actions, or Odoo.sh hosted deployment with built-in CI/CD. The discovery output is a written migration scope and data volume summary.
Source data extraction from MySQL
We connect directly to the WP ERP MySQL database and extract each relevant table using SELECT queries ordered by foreign key dependencies. We extract Departments first (no dependencies), then Employees (with wp_user cross-reference), then CRM Contacts and Companies (with deduplication against WooCommerce customer records), then Deals, then Activities. The accounting extraction runs in parallel and includes Chart of Accounts, Customers, Vendors, Invoices, and Journal Entries. Each extraction produces a CSV with header row mapping to the Odoo XML-RPC field names. We flag any records with missing required foreign keys and surface them in a pre-migration data quality report.
Odoo schema provisioning and COA design
Before any data import, we configure the destination Odoo database. This includes activating the required apps (HR, CRM, Accounting, Inventory as needed), creating the COA structure by mapping WP ERP account records to Odoo account.account entries with correct account_type values, configuring taxes (mapping WP ERP tax codes to Odoo account.tax records using name and amount as the dedupe key), setting up Odoo chart of accounts digits to match WP ERP account code length, and creating any required Odoo journal records (sale journal, purchase journal, general journal) that invoice and journal entry imports target. We deploy this configuration into a test database first.
Sandbox migration and data reconciliation
We run a full migration into an Odoo test database (a clean Odoo install or a restored backup) using the extracted CSV data. We validate record counts per object, spot-check 20-30 records against the WP ERP source for field-level accuracy, confirm that partner records are correctly linked to accounting accounts, and verify that journal entries balance (debits equal credits for each entry). The customer reviews the sandbox and approves the mapping before production migration begins. Any COA corrections, duplicate merge decisions, or account type adjustments happen here.
Production migration in dependency order
We run production migration in strict record-dependency order: Departments (no dependencies), Employees (with wp_user resolution), Companies/Partners, Customers, Vendors, Products (if inventory is in scope), Chart of Accounts, Invoices, Journal Entries, Deals/Leads, Activities. Each phase emits a reconciliation report (record count in, record count created, record count failed). Partner reconciliation links accounting customers and vendors to the same res.partner record that CRM contacts created, preventing duplicate partner records. We use Odoo's XML-RPC API with batch writes of 100 records per request and exponential backoff on rate-limit responses.
Cutover, validation, and workflow handoff
We freeze WP ERP writes during the cutover window, run a final delta migration of any records modified since the initial extraction, verify invoice and journal entry totals match WP ERP's accounting trial balance, then set Odoo as the system of record. We deliver the workflow inventory document to the customer's Odoo admin. We support a three-day hypercare window to resolve any post-import reconciliation issues. We do not rebuild WP ERP Workflow extension rules as Odoo automated actions inside the migration scope; that is a separate engagement requiring a business requirements workshop to map trigger-action logic to Odoo's Python-based automation model.
Platform deep dives
WP ERP
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 WP ERP 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
WP ERP: WordPress REST API with no publicly documented rate limit; XML-RPC is capped at 10 requests per 30 seconds per IP on VIP environments.
Data volume sensitivity
WP ERP 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 WP ERP to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your WP ERP 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 WP ERP
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.