---
title: "SYSPRO to Odoo Migration: A Technical Guide"
slug: syspro-to-odoo-migration-technical-guide
date: 2026-10-26
author: Nachi Raman
categories: [Migration Guide, SYSPRO, Odoo]
excerpt: "A technical guide to migrating data from SYSPRO to Odoo, covering SQL extraction, object mapping, Odoo's external API, and a step-by-step migration plan."
tldr: "SYSPRO keeps data in module-prefixed SQL Server tables. Odoo uses its own models, such as res.partner for contacts. Take a one-off, read-only SQL extract from a restored copy of the SYSPRO company database, map it to Odoo, and load it in dependency order through Odoo's import tool or external API."
canonical: https://clonepartner.com/blog/syspro-to-odoo-migration-technical-guide
---

# SYSPRO to Odoo Migration: A Technical Guide


# SYSPRO to Odoo Migration: A Technical Guide

Migrating from SYSPRO to Odoo is a structural data translation. SYSPRO is a SQL Server manufacturing ERP with module-prefixed tables. Odoo is a Python application whose data lives in models such as `res.partner` ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)). You cannot lift SYSPRO's tables and drop them into Odoo. Get the extraction wrong and you lose history that SYSPRO may have already archived to XML. Get the mapping wrong and invoices and orders link to the wrong records. And after your SYSPRO licence expiry date, "you will no longer be able to access Syspro" ([syspro.com](https://www.syspro.com/formal-notice-change-to-syspro-licensing/)).

This guide covers SYSPRO 8 extraction methods, entity-by-entity mapping to Odoo, the Odoo external API, migration approaches and validation. The Odoo documentation cited is for Odoo 18 and 19. For the pair overview, see [SYSPRO to Odoo migration](https://clonepartner.com/blog/migrate/syspro-to-odoo).

## Why are companies migrating from SYSPRO to Odoo?

SYSPRO is ending its Initial and Annual Licence Fee model. From now on SYSPRO is available only as a named-user subscription. SYSPRO's formal notice gives two expiry dates: **31 October 2026** for customers outside the US, and **31 December 2026** for US customers ([syspro.com](https://www.syspro.com/formal-notice-change-to-syspro-licensing/)). To keep using SYSPRO after that, "you will need to enter a new subscription agreement". Customers who do not subscribe must move before their expiry date. If your date has passed, raise the data export with SYSPRO now. For the full breakdown, see [SYSPRO Licence Change 2026: Deadlines Explained](https://clonepartner.com/blog/blog/syspro-licence-change-2026-deadlines-explained).

The notice also says: "On cessation of your current licence, you have the right to export your data." It asks you to raise the export "with your account manager ahead of" the expiry date ([syspro.com](https://www.syspro.com/formal-notice-change-to-syspro-licensing/)). If your Odoo project is not ready, take a full extract first and load it later.

Odoo appeals to SYSPRO shops because manufacturing, inventory and accounting sit in one system. Its Manufacturing app has bills of materials with operations and work centers ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.html)), and its Inventory app tracks products by lots or serial numbers ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.html)).

## How SYSPRO and Odoo structure data differently

SYSPRO 8 stores data in Microsoft SQL Server. "SYSPRO supports multiple companies where each company's data is contained within a single database. In addition, a single system-wide database is used to store information that is not specific to any individual company." SYSPRO's database guide says "Each SYSPRO 8 company database contains approximately 1000 tables" ([help.syspro.com](https://help.syspro.com/syspro-8-2024/resources/pdfs/syspro-8-database-architecture-technical-guide.pdf)). Tables are module-prefixed: `ArCustomer` for customers, `ApSupplier` for suppliers, `InvMaster` for stock codes, `SorMaster` and `SorDetail` for sales orders. Custom form fields live in plus tables. For example, custom customer data is stored in `[ArCustomer+]` ([help.syspro.com](https://help.syspro.com/syspro-8-2024/resources/pdfs/syspro-8-database-architecture-technical-guide.pdf)).

Odoo is organised differently. Customers and suppliers are both contacts. A contact can be a company or an individual linked to a company, and its Sales & Purchase tab covers both sides of the relationship ([odoo.com](https://www.odoo.com/documentation/18.0/applications/essentials/contacts.html)). Odoo's external API documentation reads company contacts from the `res.partner` model ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)). SYSPRO's two tables therefore collapse into one set of records. The chart of accounts comes from the fiscal localization package that matches your company's country ([odoo.com](https://www.odoo.com/documentation/18.0/applications/finance/accounting/get_started/chart_of_accounts.html)), so SYSPRO GL codes need a mapping table. Products can carry variants, such as size or colour, under one product template ([odoo.com](https://www.odoo.com/documentation/18.0/applications/sales/sales/products_prices/products/variants.html)).

Routings work differently too. In Odoo, operations are defined on the bill of materials once the Work Orders setting is enabled ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.html)). "Specifying a work center is required when a work order is defined in the Operations tab of a bill of materials" ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.html)). For SYSPRO-side detail, see [Migrating SYSPRO BOMs and Routings](https://clonepartner.com/blog/blog/migrating-syspro-boms-and-routings).

## How to get data out of SYSPRO

**Direct SQL Server access** reaches every table, including the plus tables. SYSPRO's own best-practice guide warns: "Connecting to the SYSPRO databases directly using SQL drivers is not advised" ([help.syspro.com](https://help.syspro.com/syspro-8-2023/resources/pdfs/2023-release/technical/syspro-8-best-practices-for-connecting-to-syspro.pdf)). That warning is about live integrations. For a migration, run a one-off, read-only extract with a read-only SQL login, ideally against a restored copy of the company database, not the live production database.

Other extraction methods:

- **Business Activity Queries (BAQs)** "are SQL views that are created in the relevant company databases". "Any SQL user with db_datareader permissions can retrieve data using the views" ([help.syspro.com](https://help.syspro.com/syspro-8-2024/resources/pdfs/2022-release/topics/syspro-8-business-activity-queries-reference-guide.pdf)). They are useful for prepared views but less flexible than raw SQL for a full extract.
- **Syspro OData Service** is read-only. SYSPRO says it "is the only mechanism available when applications need access to SYSPRO data in the Syspro Cloud ERP environment" ([help.syspro.com](https://help.syspro.com/syspro-8-2025/topics/insights-and-reporting/syspro-odata/syspro-odata.htm)). SYSPRO's 2021 R2 help limits it to 5,000 rows, with paging by `$top` and `$skip` ([help.syspro.com](https://help.syspro.com/syspro-8-2021-r2/topics/insights-and-reporting/syspro-odata/syspro-odata.htm)). Use it where SQL is not possible, and page through each table.
- **e.net business objects** such as `ARSQRY` (Customer Query), `INVQRY` (Inventory Query) and `SORQRY` (Sales Order Query) return XML for one record or a filtered set. They suit integration, not bulk extraction. SYSPRO notes that archived sales orders cannot be queried with `SORQRY` ([help.syspro.com](https://help.syspro.com/business-object-library/G_Objects/sor/sorqry/sorqry.htm)).

For a detailed comparison of the routes, see [How to Export Data from SYSPRO](https://clonepartner.com/blog/blog/how-to-export-data-from-syspro-methods-api-limits-portability).

## SYSPRO to Odoo object mapping

Every SYSPRO table below is named in SYSPRO's documentation. The Odoo column uses the record names from Odoo's user documentation. It gives a technical model name only where Odoo's documentation shows it.

| SYSPRO table | What it holds | Odoo target | Mapping notes |
|---|---|---|---|
| `ArCustomer` | Customers | Contacts (`res.partner`) | Customer groups from `ArCustomerGroup` can become contact tags ([odoo.com](https://www.odoo.com/documentation/18.0/applications/essentials/contacts.html)). |
| `ApSupplier` | Suppliers | Contacts (`res.partner`) | Match against `ArCustomer` first. A company that is both customer and supplier should load once. |
| `[ArCustomer+]` | Custom customer fields | Custom fields on contacts | Custom field names need an `x_` prefix ([odoo.com](https://www.odoo.com/documentation/18.0/applications/studio/fields.html)). |
| `InvMaster` | Stock codes | Products | Carry the SYSPRO stock code onto the product. Decide which codes become variants of one product. |
| `InvWarehouse` | Stock per warehouse | Warehouses, locations and on-hand quantities | Load opening stock as an inventory adjustment (see below). |
| `SorMaster` / `SorDetail` | Sales order headers and lines | Sales orders (`sale.order`, [odoo.com](https://www.odoo.com/documentation/19.0/developer/reference/external_api.html)) | Move open orders. Keep closed orders in an archive. |
| `PorMasterHdr` / `PorMasterDetail` | Purchase order headers and lines | Purchase orders | Move open orders and link them to the supplier contact. |
| `ArInvoice` | Customer invoices | Customer invoices | Usually open items only, with history in an archive. |
| `ApInvoice` | Supplier invoices | Vendor bills | Usually open items only, with history in an archive. |
| `GenMaster` | GL accounts | Chart of accounts (`account.account`, [odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/standard_modules/account/account_account.html)) | Map each SYSPRO GL code to an account in the localization chart. An accountant must sign this off. |
| `GenTransaction` | GL transactions | Journal entries | Load opening balances or summarised periods. Debits and credits must balance. |
| `BomOperations` | Routing steps | Operations on a bill of materials | Each operation needs a work center. |
| `BomWorkCentre` | Work centres | Work centers | Load before the bills of materials that use them. |
| `WipMaster` | Jobs | Manufacturing orders | Move open jobs. Archive closed jobs. |
| `WipJobAllMat` / `WipJobAllLab` | Materials and labour allocated to a job | Components and operations on a manufacturing order | Closed-job cost history has no one-to-one Odoo target. |
| `LotDetail` | Lot detail for lot traceable items | Lots | Check for purged lot history first. |
| `InvSerialHead` | Serial numbers | Serial numbers | Set each product to track by lots or by serial numbers ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.html)). |
| `TblCurrency` / `TblCurrDatedRates` | Currencies and dated exchange rates | Currencies and rates | Enable each foreign currency in Odoo first ([odoo.com](https://www.odoo.com/documentation/18.0/applications/finance/accounting/get_started/multi_currency.html)). |

SYSPRO's table sources: [help.syspro.com](https://help.syspro.com/syspro-8-2024/resources/pdfs/syspro-8-database-architecture-technical-guide.pdf) and [help.syspro.com](https://help.syspro.com/syspro-8-2026-r1/i-installation/sys-8-sql-updates-by-release/sys-8-sql-updates-by-release.htm).

> [!WARNING]
> SYSPRO archived sales orders cannot be queried with the `SORQRY` business object. SYSPRO's archiving copies purged sales orders, jobs and bills of materials to XML files named `Xyynnnnn.XML`, where X is the company id, yy the archive type (SO, JB or BO) and nnnnn the archive number. "No 'additional' attached information (such as custom forms, multimedia, notes, etc) is archived" ([help.syspro.com](https://help.syspro.com/syspro-7-update-1/ovr-archiving.htm), [help.syspro.com](https://help.syspro.com/syspro-7-update-1/impbam.htm), SYSPRO 7 Update 1 help). Check for archived data before you assume the SQL tables are complete.

## Migration approaches compared

| Approach | When to use | Complexity | Risk |
|---|---|---|---|
| **Odoo import tool (CSV or Excel)** | Flat master data such as contacts and products | Low | Relations need External IDs to link correctly |
| **SQL extract, Python ETL, Odoo external API** | Relational data, custom fields, larger volumes | Medium to high | Needs a Custom Odoo pricing plan, plus error handling and retry logic |
| **Middleware (Make, Flowgear, n8n)** | Ongoing sync, not bulk historical loads | Medium | Added dependency and licensing cost. SYSPRO OData's 5,000-row limit applies |
| **Managed migration service** | Complex schema, manufacturing data, deadline pressure | Low for your team | Dependency on the service provider |

For a one-time migration of a manufacturing dataset, the **SQL extract, Python ETL, Odoo external API** path gives you the most control. Odoo's import tool works for simple master data. It can also link related records if each row carries an External ID from the old system (see below).

## Odoo's external API and what it means for the load

Odoo exposes its models over XML-RPC, with methods such as `search`, `read`, `search_read` and `create` called through `execute_kw` on the `xmlrpc/2/object` endpoint ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)). Plan constraints matter: "Access to data via the external API is only available on Custom Odoo pricing plans. Access to the external API is not available on One App Free or Standard plans" ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)).

**Deprecation.** Odoo 19 deprecates the old RPC APIs. "Both the XML-RPC and JSON-RPC APIs at endpoints /xmlrpc, /xmlrpc/2 and /jsonrpc are scheduled for removal in Odoo 22 (fall 2028) and Online 21.1 (winter 2027)." The External JSON-2 API at `/json/2` replaces them ([odoo.com](https://www.odoo.com/documentation/19.0/developer/reference/external_rpc_api.html)). A one-off migration finishes long before then, but scripts you plan to reuse should target JSON-2.

**Transactions.** "All calls to the JSON-2 endpoint run in their own SQL transaction." "Using the JSON-2 API, it is not possible to chain multiple calls inside a single transaction" ([odoo.com](https://www.odoo.com/documentation/19.0/developer/reference/external_api.html)). A failed call part-way through a multi-step load leaves the earlier steps committed. Design every step so that you can safely re-run it.

Practical loading strategy:

- Use `search_read` instead of separate `search` and `read` calls. Odoo says it "avoids having to perform two requests" ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)).
- Pass a `fields` list. If you leave it out, Odoo fetches all fields of the matched records ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)).
- On a server you run yourself, each request is capped by `--limit-time-cpu`, which "Defaults to 60" CPU seconds ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/cli.html)). Keep each call small enough to finish well inside it.
- Custom fields can be created over the API through `ir.model.fields`, which "allows adding custom fields without using Python code" ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)). Studio is the alternative. Installing Studio on the Standard plan "automatically triggers an upsell to the Custom pricing plan" ([odoo.com](https://www.odoo.com/documentation/18.0/applications/studio.html)).

**Set up Odoo before loading data.** The chart of accounts, taxes, journals, currencies, warehouses and company settings must exist before any transaction loads. Invoices and journal entries need accounts and journals to post against.

## Keep the SYSPRO key on every Odoo record

Odoo identifies every record by an integer id. `create()` "creates a single record and returns its database identifier" ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)). You need a way to find each record again by its SYSPRO code, both to link related records and to re-run a load without duplicates.

Odoo's import tool solves this with the External ID column. "It is possible to use an External ID (ID) from previous software to facilitate the transition to Odoo." It lets you import the same file several times without creating duplicates, and it lets related records point at each other by the original identifier ([odoo.com](https://www.odoo.com/documentation/18.0/applications/essentials/export_import_data.html)).

If you load through the API, keep the same discipline in your ETL. Store a map from each SYSPRO key (customer code, supplier code, stock code) to the Odoo id that `create()` returned. Check the map before each create, so a re-run updates rather than duplicates.

## Step-by-step migration process

### 1. Audit and scope

Count records per SYSPRO table and identify the tables you need. Check for archived sales orders, jobs and bills of materials, for purged lot history, and for plus-table custom fields. Decide whether you move master data only, or master data plus open transactions. Closed history usually goes to an archive. Confirm the SYSPRO version and the target Odoo version.

### 2. Extract from SYSPRO

Restore a backup of the company database to an isolated SQL Server instance. Run one-off extraction queries against the restored copy with a read-only SQL login. Export to JSON (good for nested structures) or CSV. Make sure you query the company database, not the system-wide database. In a multi-company SYSPRO site, each company has its own database. Extract each one separately and add a company identifier to every record. Odoo can hold several companies in one database ([odoo.com](https://www.odoo.com/documentation/18.0/applications/general/companies/multi_company.html)).

Extract in this order: currencies and exchange rates, GL accounts, customers and suppliers, stock codes, warehouses, work centres and bills of materials, open sales and purchase orders, open invoices, open jobs, then lots and serial numbers.

### 3. Transform and map

Cleanse the data in a staging environment. Match `ArCustomer` and `ApSupplier` records and decide how each becomes an Odoo contact. Convert SYSPRO date formats and currency codes from `TblCurrency`. Deduplicate companies that appear in both tables, using the name and tax number as the matching key.

Build a GL mapping table: each SYSPRO `GenMaster` code to an account in Odoo's localization chart. This cannot be automated. An accountant must check it account by account.

### 4. Load in dependency order

Create Odoo records in this order:

1. Currencies and exchange rates
2. Chart of accounts
3. Journals
4. Taxes
5. Contacts (companies before the people and addresses under them)
6. Products and variants
7. Warehouses and storage locations
8. Work centers, then bills of materials with their operations
9. Open sales orders and purchase orders
10. Open invoices, vendor bills and opening journal entries
11. Open manufacturing orders
12. Lots and serial numbers, then opening stock

Load opening stock as an inventory adjustment. Odoo records a "Counted Quantity" against the "On Hand Quantity", and the adjustment updates stock once you apply it ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.html)). Storage locations must exist first. Enable the Storage Locations feature to create them ([odoo.com](https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.html)).

### 5. Validate

Check that contacts sit under the right companies, that invoice lines reference the right products and contacts, and that every bill of materials component is a valid product. Check that every operation has the right work center.

Run record-count parity checks between SYSPRO tables and Odoo. Pull a random sample (5 to 10 percent) and compare field values side by side. Reconcile trial balance totals between SYSPRO's `GenTransaction` and Odoo by account and period. Compare on-hand quantities against SYSPRO's `InvWarehouse`.

### Example: creating a contact over XML-RPC

This follows the pattern in Odoo's external API documentation ([odoo.com](https://www.odoo.com/documentation/18.0/developer/reference/external_api.html)). Odoo makes the external API available only on Custom pricing plans.

```python
import xmlrpc.client

url = "https://your-odoo-instance.com"
db = "your_database"
username = "admin@example.com"
password = "your_api_key"

# Authenticate
common = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/common")
uid = common.authenticate(db, username, password, {})
models = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/object")

# Map of SYSPRO customer code -> Odoo id, kept in your staging database
id_map = {}

syspro_code = "CUST001"
if syspro_code not in id_map:
    # create() makes one record and returns its database id
    partner_id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{
        'name': 'Acme Manufacturing',
        'is_company': True,
    }])
    id_map[syspro_code] = partner_id

print(f"SYSPRO {syspro_code} -> Odoo res.partner {id_map[syspro_code]}")
```

## Edge cases that break migrations

- **Dual-role companies.** A company in both `ArCustomer` and `ApSupplier` should become one Odoo contact. Deduplicate before loading, using the name and tax number as the matching key.
- **GL structure mismatch.** Odoo installs a chart of accounts from the localization package for your country ([odoo.com](https://www.odoo.com/documentation/18.0/applications/finance/accounting/get_started/chart_of_accounts.html)). SYSPRO's `GenMaster` codes will not match it. Build the mapping table during scoping, with an accountant.
- **Multi-level BOMs.** Every component, including each sub-assembly, must exist as an Odoo product before a bill of materials can use it. Load products first, then bills of materials from the lowest level up.
- **Archived and purged data.** SYSPRO archive XML files hold purged sales orders, jobs and bills of materials, without custom forms or notes ([help.syspro.com](https://help.syspro.com/syspro-7-update-1/ovr-archiving.htm), SYSPRO 7 Update 1 help). If you need this history, parse the XML files separately from your SQL extract, or keep them in your archive.
- **Lot traceability.** SYSPRO's lot Purge and Archive program copies "lot transactions and inspection records to an archive file". "The header record is never deleted from the lot master table; only the lot transactions are deleted and archived" ([help.syspro.com](https://help.syspro.com/syspro-8-2024/g_programs/lot/lotp01/lotp01.htm)). Purged lots can exist in Odoo without their full history, so keep that history in the archive.
- **Job costing.** SYSPRO records the materials and labour allocated to each job in `WipJobAllMat` and `WipJobAllLab`. Odoo's manufacturing orders have components and operations, but closed-job cost history has no one-to-one target. See [SYSPRO WIP and Job History: Migrate or Archive](https://clonepartner.com/blog/blog/syspro-wip-and-job-history-migrate-or-archive).
- **Multi-company databases.** A multi-company SYSPRO site has one SQL database per company. In Odoo, "multiple companies can be configured under one database" ([odoo.com](https://www.odoo.com/documentation/18.0/applications/general/companies/multi_company.html)). Tag every extracted record with its company and map it to the right Odoo company.
- **Plus-table custom fields.** SYSPRO keeps custom form data in plus tables such as `[ArCustomer+]`. Each field becomes an Odoo custom field. Odoo's documentation says the `x_` prefix is "required for any custom field" ([odoo.com](https://www.odoo.com/documentation/18.0/applications/studio/fields.html)). Create the fields before the load and check each value type.

## Two clocks: data migration vs. Odoo implementation

Keep these apart. The data migration (extracting from SYSPRO, transforming and loading into Odoo) takes **days**. Most data migrations complete within 1 to 5 business days, depending on data volume, complexity and API rate limits. Small datasets under 10,000 records can finish in under 24 hours.

The Odoo implementation (choosing apps, configuring the chart of accounts, setting up bills of materials, tax rules and training users) is a separate project measured in **months**. Your Odoo implementation partner runs it. ClonePartner does not implement ERPs. The chart of accounts, journals, taxes, warehouses and company settings must exist before transactional data can load.

If your SYSPRO expiry date is 31 October 2026 (outside the US) or 31 December 2026 (US), do not wait for the implementation. Raise the data export with your SYSPRO account manager and take a full extract before your expiry date. The Odoo load can follow when Odoo is ready.

## Best practices for the transition

- **Never test in production.** Run test migrations in an Odoo staging or test database that mirrors the production setup.
- **Extract from a restored backup.** Do not run migration queries against SYSPRO's live production database.
- **Resolve links by code, never by hard-coded id.** Odoo ids differ between databases. Look up countries, companies, journals and similar records in the target database at load time.
- **Plan the cutover for a Monday.** Never go live on a Friday. Run the bulk load in the days before go-live while SYSPRO stays live. Freeze SYSPRO before Monday's working day starts. The final delta covers changed records only and takes about 30 minutes. Then users start work in Odoo.
- **Keep the SYSPRO key on every record.** Use External IDs in the import tool, or an id map in your ETL. This makes linking reliable, lets you re-run loads without duplicates, and gives an audit trail back to SYSPRO.
- **Validate accounting before go-live.** Reconcile trial balances, aged receivables and aged payables between SYSPRO and Odoo before you cut over.

> Migrating from SYSPRO to Odoo? Book a free 30-minute scoping call. We'll review your SYSPRO schema, map the target Odoo records, and give you a fixed-price proposal.
>
> [Talk to us](https://clonepartner.com/talk-to-us?duration=30&utm_source=blog&utm_medium=button&utm_campaign=demo_bookings&utm_content=cta_click&utm_term=demo_button_click)

## Frequently asked questions

### How long does a SYSPRO to Odoo data migration take?

The data migration itself usually completes within 1 to 5 business days, depending on data volume, complexity and API rate limits. Small datasets under 10,000 records can finish in under 24 hours. The Odoo implementation is a separate project that takes months, and your implementation partner runs it.

### My SYSPRO licence expires soon. What should I do about the data first?

SYSPRO's formal notice gives an expiry date of 31 October 2026 for customers outside the US and 31 December 2026 for US customers. After that date you can no longer access SYSPRO without a new subscription. The notice gives you the right to export your data and asks you to raise it with your account manager ahead of the expiry date. Take a full extract of the company database before your expiry date, even if the Odoo project is not ready.

### What happens to SYSPRO custom form fields (plus tables) in Odoo?

SYSPRO stores custom form data in plus tables such as [ArCustomer+]. In Odoo, each custom field needs a technical name that starts with x_, according to Odoo's Studio documentation. You can create the fields in Studio or through the ir.model.fields model over Odoo's external API, and then load the values.

### Can I use SYSPRO's OData service for a full migration?

Yes, where direct SQL is not possible. It is the only route in the Syspro Cloud ERP environment. SYSPRO's help limits OData to 5,000 rows per call, so you page through each table. On premises, a one-off read-only SQL extract from a restored copy of the company database is faster and reaches every table, including the plus tables.

### What Odoo plan do I need for an API-based migration?

Odoo's external API documentation says access to data via the external API is only available on Custom Odoo pricing plans, and not on One App Free or Standard plans. Check your plan before you design an API load. Odoo's own import tool is the alternative for simpler data.

### Does Odoo cover SYSPRO's manufacturing data?

Odoo's Manufacturing app has bills of materials with operations, work centers and manufacturing orders, and its Inventory app tracks products by lots or by serial numbers. SYSPRO job history does not map one-to-one, so many companies move open jobs and keep closed job history in an archive.
