ERP migration
Field-level mapping, validation, and rollback between Opto and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Opto
Source
Odoo ERP
Destination
Compatibility
6 of 10
objects map 1:1 between Opto and Odoo ERP.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Opto to Odoo ERP is a lateral data move with a significant API gap on the source side. Opto does not publish a public REST API, which means all migration extraction relies on the platform's native CSV export function. We structure that export into Odoo's CSV import format, resolve the Item-to-Vendor lookup chain, and flatten multi-location hierarchies into Odoo's warehouse model. Reorder Rules from Opto are configuration data rather than transactional records and are delivered as a structured reference table for manual re-entry in Odoo's procurement rules. We do not migrate Odoo workflows, manufacturing routes, or automation rules as code; we provide a written inventory of these for your Odoo implementation partner to rebuild post-migration. The migration scope covers Items, Vendors, Customers, Purchase Orders, Stock Locations, and open or historical invoices.
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 Opto 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.
Opto
Item
Odoo ERP
Product (product.template + product.product)
1:1Opto Items map to Odoo Product records. The Item SKU becomes product.default_code; Item name becomes product.name; unit cost becomes product.standard_price; reorder point becomes Odoo product.rule_min_qty if the destination uses Odoo's procurement rules. We extract any barcode associated with the Item and write it to product.barcode. Custom fields on Item are mapped to Odoo custom fields created via Odoo Studio before migration.
Opto
Vendor
Odoo ERP
Contact (contact_type = delivery
1:1Opto Vendors map to Odoo Contact records with the delivery address role. Vendor name becomes res.partner.name; payment terms stored in Odoo property_payment_term_id on the partner. We preserve any configured lead time from the Opto Vendor as vendor_lead_days on the Odoo Contact for use in Odoo procurement rules.
Opto
Customer
Odoo ERP
Contact (contact_type = contact
1:1Opto Customers map to Odoo Contact records with the contact type. Name, email, phone, and billing address transfer directly. Customer-specific pricing tiers from Opto map to Odoo pricelist records attached to the Customer contact. We handle one-to-many addresses per customer by creating a primary billing address on the Contact record and any secondary delivery addresses as separate Contact records linked via type.
Opto
Purchase Order
Odoo ERP
Purchase Order (purchase.order)
1:1Open Purchase Orders from Opto migrate to Odoo purchase.order records in draft state. Vendor lookup resolves via the Contact mapping; line items resolve via the Product mapping. Expected delivery date from Opto becomes date_planned on the Odoo purchase.order.line. Closed or historical Purchase Orders migrate as read-only records in Odoo for audit trail purposes. We separate open from closed POs during extraction so that open POs can be re-entered as live Odoo POs while historical ones are imported as locked records.
Opto
Stock Location
Odoo ERP
Stock Location (stock.location)
lossyOpto multi-location inventory maps to Odoo's warehouse and location hierarchy. Each Opto named location or bin becomes an Odoo stock.location record under the configured warehouse's view locations. If Opto uses a flat location model, we preserve the location name as location.complete_name in Odoo. Location-specific quantity balances transfer as Odoo stock.quant records that set initial inventory levels at go-live. Odoo requires locations to be configured before quant import so we sequence location creation before stock.quant migration.
Opto
Reorder Rule
Odoo ERP
Procurement Rule (stock.rule) + Product Reordering Rule
lossyOpto Reorder Rules are account-level configuration data per Item, not transactional records. We export them as a structured CSV with Item SKU, minimum quantity, reorder quantity, and preferred vendor. In Odoo, these map to product.template route rules (procurement rule with Buy or Manufacture route) and to product.template.rule_min_qty for the reorder threshold. Manual reconfiguration in Odoo is required because the Opto reorder logic involves account-level thresholds that do not map automatically to Odoo's rule engine. We deliver the full reorder rule table in the mapping worksheet to guide manual Odoo configuration.
Opto
Invoice (Accounts Receivable)
Odoo ERP
Customer Invoice (account.move)
1:1Open and historical Opto customer invoices map to Odoo account.move records with move_type = out_invoice. Line items with Item references resolve to Odoo Product. Paid invoices migrate with state = posted and payment_state = paid; open invoices migrate as draft or posted with a matching open amount on the Odoo partner account. Historical invoice PDFs do not migrate as Odoo attachments; we deliver them as a zipped document archive for manual attachment post-migration.
Opto
Invoice (Accounts Payable)
Odoo ERP
Vendor Bill (account.move)
1:1Opto vendor invoices map to Odoo account.move records with move_type = in_invoice. Vendor lookup resolves via the Contact mapping. Open AP invoices are migrated as posted or draft records matching the open balance; closed AP invoices are migrated as posted with payment_state = paid. Odoo's account.move requires a journal and an account.code for each line item, so we map Opto expense categories to Odoo account codes during the chart of accounts discovery phase.
Opto
Custom Field (Item)
Odoo ERP
Custom Field (product.template)
lossyOpto Items may carry custom fields specific to the account. We extract the full custom-field schema during discovery, create matching custom fields on Odoo product.template via Odoo Studio, and map values during the product import phase. Fields with no Odoo equivalent are flagged in the mapping worksheet for the customer to evaluate whether they remain relevant in Odoo's data model. Custom fields are never silently dropped.
Opto
Custom Field (Customer)
Odoo ERP
Custom Field (res.partner)
lossyOpto Customer records may include custom fields such as customer tier, tax exemption flag, or internal account codes. We extract these during discovery, create matching custom fields on Odoo res.partner via Odoo Studio, and map values during the contact import phase. Any customer-specific pricing tier from Opto maps to an Odoo pricelist attached to the partner record rather than a custom field.
| Opto | Odoo ERP | Compatibility | |
|---|---|---|---|
| Item | Product (product.template + product.product)1:1 | Fully supported | |
| Vendor | Contact (contact_type = delivery1:1 | Fully supported | |
| Customer | Contact (contact_type = contact1:1 | Fully supported | |
| Purchase Order | Purchase Order (purchase.order)1:1 | Fully supported | |
| Stock Location | Stock Location (stock.location)lossy | Fully supported | |
| Reorder Rule | Procurement Rule (stock.rule) + Product Reordering Rulelossy | Fully supported | |
| Invoice (Accounts Receivable) | Customer Invoice (account.move)1:1 | Fully supported | |
| Invoice (Accounts Payable) | Vendor Bill (account.move)1:1 | Fully supported | |
| Custom Field (Item) | Custom Field (product.template)lossy | Fully supported | |
| Custom Field (Customer) | Custom Field (res.partner)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.
Opto gotchas
No documented export API for programmatic data pull
Reorder Rules are configuration data, not records
Custom field schema varies per account
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 export scope validation
We audit the Opto account for record counts across Items, Vendors, Customers, Purchase Orders, Stock Locations, Reorder Rules, and invoices. We run a test CSV export to validate export completeness and to identify any truncated custom field columns or row limits. We document the Opto chart of accounts structure (if any accounting data exists), the location and warehouse hierarchy, and any custom field definitions on Items and Customers. The discovery output is a written scope confirmation, an Opto export checklist, and a preliminary mapping worksheet.
Odoo destination environment setup
We create the Odoo custom fields on product.template and res.partner via Odoo Studio to match the Opto custom field schema. We configure the stock.location hierarchy by mapping each Opto named location to an Odoo stock.location under the configured warehouse. We work with the customer's Odoo administrator or implementation partner to configure the chart of accounts and tax mapping for invoice migration. The environment setup phase validates that Odoo's destination schema is ready to receive data before any import begins.
Transform and import: Items and Stock Locations
We parse the Opto CSV export and transform Items into Odoo product.template records. We extract barcode associations, unit costs, reorder points, and custom field values. We create stock.quant records to set initial inventory levels per location and per product. Location-specific quantities in Opto require careful reconciliation against the Odoo stock.location hierarchy to ensure that On Hand quantities match between systems on go-live day. This phase emits a quantity reconciliation report comparing Opto on-hand totals against Odoo computed stock.
Transform and import: Vendors, Customers, and Purchase Orders
We transform Opto Vendors to Odoo Contact records with delivery address role, preserving payment terms and lead time. We transform Opto Customers to Odoo Contact records with contact role, mapping customer-specific pricing to Odoo pricelist records. Open Purchase Orders migrate to Odoo purchase.order in draft state with vendor and line-item lookups resolved. We separate open from closed POs so that open orders can be progressed in Odoo while historical orders are preserved as read-only records.
Transform and import: Invoices and Reorder Rule documentation
We migrate open and historical customer invoices to Odoo account.move with move_type = out_invoice. Open AP invoices migrate as vendor bills. Historical paid invoices migrate as posted records. The chart of accounts mapping worksheet guides account.code assignment for each line. Reorder Rules are exported as a structured CSV reference table delivered alongside the migration rather than imported as live Odoo procurement rules. We document the Item SKU, minimum quantity, reorder quantity, and preferred vendor for manual Odoo configuration.
Cutover, validation, and automation inventory handoff
We freeze Opto writes during cutover, run a final delta migration of any records modified during the migration window, then deliver the completed Odoo environment. We run a post-migration reconciliation comparing record counts and on-hand quantities between Opto and Odoo. We deliver the written inventory of Reorder Rules for manual Odoo procurement configuration, the list of configured Automations (if any exist in Opto) for the Odoo partner to rebuild in Odoo, and a custom field mapping summary. We do not rebuild Opto automations or reorder rules as Odoo workflows; that work is scoped for the customer's Odoo implementation partner.
Platform deep dives
Opto
Source
Strengths
Weaknesses
Odoo ERP
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. 2 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 Opto and Odoo ERP.
Object compatibility
2 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
Opto: Not publicly documented — typical SaaS limits assumed and confirmed during scoping.
Data volume sensitivity
Opto exposes a bulk API — large-volume migrations stream efficiently.
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 Opto to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Opto 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 Opto
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.