ERP migration
Field-level mapping, validation, and rollback between Tryton and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Tryton
Source
Odoo ERP
Destination
Compatibility
11 of 12
objects map 1:1 between Tryton and Odoo ERP.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Tryton to Odoo ERP is a cross-platform schema migration that requires resolving five structural differences at the object level. Tryton stores monetary amounts in Python Decimal for precision; Odoo uses float fields, so we apply a rounding normalization pass on all amount fields during transform to prevent off-by-cent discrepancies on invoices and move lines. Tryton's Party model is the unified master record for customers, suppliers, and employees; Odoo separates res.partner into internal and commercial roles with explicit address delegation that must be configured at import. The Chart of Accounts maps directly but requires account type validation against Odoo's chart template to prevent posting errors. We route all imports through Odoo's ORM via XML-RPC or JSON-RPC, never through direct SQL, to ensure computed fields and onchange methods fire correctly. Custom modules built on Tryton's ir.model.field extension and Odoo's ir.model.data structure are fundamentally incompatible—we migrate the data, not the code, and deliver a written module inventory for the customer's Odoo partner to rebuild.
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 Tryton 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.
Tryton
Party (res.party)
Odoo ERP
Partner (res.partner)
1:1Tryton Party is the unified master record for customers, suppliers, and employees. Odoo res.partner separates commercial entities from contact persons: the commercial_partner_id on contacts must be set to the parent partner record during import. Party categories map to Odoo partner_category tags. Fiscal data (tax ID, VAT, CUIT) migrates to partner fields. We create a commercial_partner link for every contact record and set address delegation on the partner record so that child contact addresses resolve correctly in Odoo's ORM.
Tryton
Sale Order / Sale Quotation (sale.sale)
Odoo ERP
Sale Order (sale.order)
1:1Tryton splits Sale Quotations (draft) and Sale Orders (confirmed) into separate records; Odoo uses state on a single sale.order model. We map Tryton states (quotation, confirmed, done, cancelled) to Odoo's sale_order states (draft, sent, sale_order, done, cancel). Party link resolves via the res.partner import completed in phase one. Line-level taxes, discounts, and descriptions map field-for-field. Lines reference the resolved product.product records.
Tryton
Purchase Order (purchase.purchase)
Odoo ERP
Purchase Order (purchase.order)
1:1Same structure as sale orders. We map supplier party references to Odoo res.partner (commercial_partner_id set), expected dates to date_planned on purchase.order.line, and line-level quantities and prices directly. Purchase order states migrate including confirmed and cancelled. Odoo's in_transit and receipt picking workflow requires a related stock.picking sequence to be configured post-import.
Tryton
Product (product.product)
Odoo ERP
Product Template (product.template) + Variants (product.product)
1:1Tryton products map to Odoo product.template with type (service vs stockable vs consumable) preserved. Variant attributes in Tryton (if using product.configurator) create Odoo product.product variants linked to the template. We preserve the Tryton code as product.default_code, UPC/EAN as barcode, and cost price as standard_price. Category mapping goes to product.category hierarchy in Odoo.
Tryton
Invoice (account.invoice)
Odoo ERP
Account Move (account.move)
1:1Tryton invoices migrate to Odoo account.move records with move_type set to out_invoice, in_invoice, out_refund, or in_refund. Posted invoices in Tryton become Posted moves in Odoo (posted date preserved). Draft invoices migrate as draft moves requiring manual posting. Tryton's tax and total amount caches must be recomputed after import because Odoo recalculates amounts on write via the account.move compute method—we flag any invoice where migrated total deviates from computed total by more than 0.01 in the validation pass.
Tryton
Chart of Accounts (account.account)
Odoo ERP
Account (account.account)
1:1Tryton account_chart records map to Odoo account.account. Account type (expense, revenue, receivable, payable, liquidity) maps to user_type_id using Odoo's standard chart template classification. Code structure and name hierarchy migrate directly. OHADA-configured accounts are flagged during scoping and routed through a dedicated mapping pass that sets the correct user_type_id and tags; OHADA-specific module dependencies in Tryton do not exist in standard Odoo and must be verified by the customer's accountant before import.
Tryton
Analytic Account (account.analytic.account)
Odoo ERP
Analytic Account (account.analytic.account)
1:1Tryton analytic accounts map directly to Odoo account.analytic.account. Analytic lines in Tryton attach to moves and invoices as a separate axis; in Odoo they attach to account.move.line via analytic_distribution. We preserve the account hierarchy and root structure. Customers must verify that Odoo's analytic plan matches their reporting intent since Tryton's axis model differs from Odoo's distribution-key approach.
Tryton
Inventory Move (stock.move)
Odoo ERP
Stock Move (stock.move)
1:1Tryton stock moves track goods from receipt to delivery. We preserve shipment states (pending, waiting, assigned, done), warehouse assignments from stock.location hierarchy, and quantities. Lot and lot number data maps to stock.production.lot records. Odoo's delivery validation workflow (picking -> validate -> done) requires a related stock.picking record to be created before moves can be confirmed; we generate this during the import pass.
Tryton
Project / Work (project.work)
Odoo ERP
Project (project.project) + Tasks (project.task)
1:1Tryton project work entries and task hierarchy map to Odoo project.project with nested project.task records. We preserve active vs closed state, assigned party (project manager), and duration/time data. Timesheet data from Tryton project.work.time_lines migrates to account.analytic.line linked to the project if Odoo Timesheet app is active. Odoo project.task uses a stage kanban model; we map Tryton work state to Odoo stage records.
Tryton
Attachment (ir.attachment)
Odoo ERP
Attachment (ir.attachment)
1:1Tryton stores attachments as Binary fields with a file_id reference to external storage. We run a pre-export pass querying ir_attachment, extract content by file_id, and bundle attachments as a parallel export set. In Odoo, we re-attach by matching the original file_id stored as an external identifier field on the new record, preserving document linkage without re-uploading. Large attachments (>10MB) are chunked and validated post-import for integrity.
Tryton
User (res.user)
Odoo ERP
User (res.users)
1:1Tryton users map to Odoo res.users. Active/inactive status migrates. Group memberships do not map 1:1 because Tryton and Odoo use different permission models (Tryton permission groups vs Odoo's access rights and record rules). We preserve group assignments as notes in the migration handoff document and the customer's Odoo admin rebuilds access rights against the Odoo security model. Login credentials do not migrate; Odoo sends password reset emails to migrated user email addresses.
Tryton
Custom Fields (ir.model.field / ir.model.data)
Odoo ERP
Custom Fields (ir.model.fields)
lossyTryton supports dynamic field extension via ir.model.field. Custom fields added by modules or administrators are migrated as key-value pairs when the destination schema supports them via Odoo's custom field mechanism. Fields that reference Tryton-specific models without Odoo equivalents are documented in the handoff inventory with suggested Odoo field type mappings. Custom fields referencing Tryton module objects that have no Odoo equivalent are flagged for manual review.
| Tryton | Odoo ERP | Compatibility | |
|---|---|---|---|
| Party (res.party) | Partner (res.partner)1:1 | Fully supported | |
| Sale Order / Sale Quotation (sale.sale) | Sale Order (sale.order)1:1 | Fully supported | |
| Purchase Order (purchase.purchase) | Purchase Order (purchase.order)1:1 | Fully supported | |
| Product (product.product) | Product Template (product.template) + Variants (product.product)1:1 | Fully supported | |
| Invoice (account.invoice) | Account Move (account.move)1:1 | Fully supported | |
| Chart of Accounts (account.account) | Account (account.account)1:1 | Fully supported | |
| Analytic Account (account.analytic.account) | Analytic Account (account.analytic.account)1:1 | Fully supported | |
| Inventory Move (stock.move) | Stock Move (stock.move)1:1 | Fully supported | |
| Project / Work (project.work) | Project (project.project) + Tasks (project.task)1:1 | Fully supported | |
| Attachment (ir.attachment) | Attachment (ir.attachment)1:1 | Fully supported | |
| User (res.user) | User (res.users)1:1 | Fully supported | |
| Custom Fields (ir.model.field / ir.model.data) | Custom Fields (ir.model.fields)lossy | Mapping required |
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.
Tryton gotchas
PostgreSQL-only deployment with strict foreign-key constraints
Series-skip migration requires sequential manual steps
OHADA accounting context changes account schema
Invoice amount caches must be recomputed post-import
Binary attachment storage via file_id requires separate file export
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 source audit
We audit the source Tryton instance across series version (e.g., 6.0, 6.2), installed modules, custom module field count, and OHADA accounting flag. We extract record counts for Parties, Orders, Invoices, Stock Moves, Account entries, and Projects. We query ir_attachment to size the file export pass. We identify any Tryton-specific custom fields from ir.model.field and cross-reference them against the Odoo standard field registry to flag unmappable fields early. The discovery output is a written migration scope document with object-level record counts, a Decimal rounding risk assessment, and a list of OHADA-flagged accounts requiring manual review.
Odoo schema pre-creation
We create the destination Odoo schema before any data import. This includes provisioning custom fields (with matching API names and field types), setting up the account.chart template and configuring account.user_type_id for each migrated account, creating product.category hierarchy, configuring res.partner commercial_partner_id structure, and setting up project.project and project.task stage records. Schema is deployed into a staging Odoo database via XML-RPC for validation. Any custom Tryton fields without Odoo equivalents are documented with recommended field type mappings for the customer's Odoo partner to implement.
Decimal rounding normalization pipeline
We build the rounding normalization pipeline as part of the extract-transform step. Every monetary field (amount, price, tax, total) is read from Tryton as Decimal, cast to string, then written to Odoo as a float rounded to 2 decimal places. For invoice lines, we recompute the line subtotal in Python Decimal before writing to catch rounding at the line level. After invoice import, we trigger Odoo's amount recompute method and diff the result against the migrated total; invoices exceeding a 0.01 deviation threshold are flagged in the reconciliation report. This pass runs in the staging environment before production import begins.
Record import in dependency order
We import records in dependency order: account.chart (accounts, account types) first because moves reference them; then res.partner (commercial partners before contacts); then product.template; then sale.order and purchase.order; then account.move (invoices) referencing partners and accounts; then stock.move referencing products and locations; then project.project and project.task; then ir.attachment as a parallel pass. Each phase emits a row-count reconciliation report against the source record counts. Any phase that shows a discrepancy above the agreed threshold is investigated before the next phase begins.
Staging validation and reconciliation
We run the full migration in a staging Odoo database (a copy of the production instance). The customer's accountant reconciles the trial balance (debits equal credits across all move lines), spot-checks 30-50 randomly selected invoices against the Tryton source for amounts, tax, and partner assignment, and validates that the chart of accounts structure matches the original. Project and task hierarchies are reviewed for completeness. Any mapping corrections are applied to the transform pipeline before production migration is scheduled.
Production migration, cutover, and handoff
We schedule production migration during an off-peak window agreed with the customer. Write access to Tryton is suspended during the migration. We run the validated transform pipeline, execute the parallel attachment pass, and perform a final reconciliation against the staging results. We deliver the custom module field inventory document and the Odoo access rights rebuild guide to the customer's Odoo partner. We do not rebuild Tryton custom modules as Odoo modules; that work is outside migration scope and handled separately. We support a one-week hypercare window for data quality issues discovered in the first business days of production use.
Platform deep dives
Tryton
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 Tryton 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
Tryton: Not publicly documented by the Tryton Foundation.
Data volume sensitivity
Tryton 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 Tryton to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Tryton 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 Tryton
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.