ERP migration
Field-level mapping, validation, and rollback between Triumph and Dolibarr ERP. We move data and schema; workflows are rebuilt natively in Dolibarr ERP.
Triumph
Source
Dolibarr ERP
Destination
Compatibility
14 of 17
objects map 1:1 between Triumph and Dolibarr ERP.
Complexity
BStandard
Timeline
5-8 weeks
Overview
Moving from Triumph ERP to Dolibarr is a structural shift from a proprietary, license-priced Australian accounting platform with a closed data model to an open-source PHP/MariaDB application where every table (llx_societe, llx_facture, llx_commande, llx_product) is directly inspectable and writable. Triumph does not publish an API, so the source side of the migration runs through Triumph's built-in report writer plus a coordinated database export with Triumph support; the destination side uses Dolibarr's CSV import tool, the REST API introduced in v9, and direct SQL inserts for high-volume tables. We resolve the chart of accounts mapping against Dolibarr's llx_accountingaccount structure before any transactional load, pre-create the Third Parties (customers and suppliers share one table) with the correct client and fournisseur flags, and validate that target Dolibarr is on a supported version with the right PHP extensions and the utf8mb4 character set so that the v13+ recruitment table key-length bug does not block schema upgrades mid-migration.
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 Triumph object lands in Dolibarr ERP, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Triumph
Customer (Debtors module)
Dolibarr ERP
Third Party (llx_societe with client=1)
1:1Triumph Debtors records map to Dolibarr llx_societe rows with the client field set to 1 (or 3 if also a supplier). The Triumph customer code becomes the Dolibarr code_client value, which must respect the active customer code module (Mod_PHPMyAdmin, Elephant, Monkey) chosen during Dolibarr setup. We pre-create payment terms (llx_c_payment_term) and payment modes before customer load so that fk_cond_reglement and fk_mode_reglement lookups resolve at insert time. Customer credit limits map to outstanding_limit on llx_societe.
Triumph
Supplier (Creditors module)
Dolibarr ERP
Third Party (llx_societe with fournisseur=1)
many:1Triumph Creditors records merge into Dolibarr llx_societe with fournisseur=1. Where a third party exists in both Triumph Debtors and Creditors (the same entity is both customer and supplier), we collapse to a single Dolibarr llx_societe row with client and fournisseur both set per the role mask (1 = customer, 2 = supplier, 3 = both). The Triumph supplier code becomes code_fournisseur. ABN/Tax IDs map to siret/tva_intra fields. We require explicit customer sign-off on every merged record before commit.
Triumph
General Ledger Account
Dolibarr ERP
Accounting Account (llx_accountingaccount)
1:1Triumph GL account codes map to Dolibarr llx_accountingaccount rows under the active accounting plan (fk_pcg_version). Account type (Asset, Liability, Equity, Income, Expense) maps to the pcg_type and pcg_subtype values from the localized chart of accounts. We require Dolibarr's Double-Entry Accounting module (modAccounting) enabled before load and the country-specific accounting plan imported so that account number ranges align with destination tax authority expectations rather than Triumph's Australian-defaulted structure.
Triumph
Open Customer Invoice
Dolibarr ERP
Customer Invoice (llx_facture)
1:1Triumph open AR invoices map to Dolibarr llx_facture rows with type=0 (standard invoice) and status fnstatut=1 (validated, unpaid). The Triumph invoice number becomes the Dolibarr ref field, with the customer-facing facnumber generated by the active llx_facture mask only for new documents. Line items load into llx_facturedet with fk_facture pointing at the parent. We preserve original Triumph invoice date in datef and original due date in date_lim_reglement so that aging reports in Dolibarr match the Triumph aging baseline at cutover.
Triumph
Open Supplier Invoice
Dolibarr ERP
Supplier Invoice (llx_facture_fourn)
1:1Triumph open AP invoices map to Dolibarr llx_facture_fourn (supplier invoices). The ref_supplier field carries the original supplier-issued invoice number, and ref carries the Dolibarr-assigned internal reference. Line items load into llx_facture_fourn_det. We require the Dolibarr Suppliers module (modFournisseur) and Supplier Invoices module (modSupplierInvoice) both enabled before load so that the menu entries and validation triggers exist.
Triumph
Customer Payment / Receipt
Dolibarr ERP
Payment (llx_paiement + llx_paiement_facture)
1:manyTriumph customer receipts split into two Dolibarr tables: llx_paiement carries the payment header (amount, date, payment mode), and llx_paiement_facture links the payment to one or more invoices with allocation amounts. Where a Triumph receipt was applied across multiple invoices, we preserve the original allocation in the link table rather than collapsing to one invoice. Bank deposit grouping maps to llx_bordereau_cheque if the customer is using cheque deposit slips.
Triumph
Supplier Payment
Dolibarr ERP
Supplier Payment (llx_paiementfourn + llx_paiementfourn_facturefourn)
1:manyTriumph supplier payments (including Electronic Funds Payment runs) split into llx_paiementfourn (payment header) and llx_paiementfourn_facturefourn (allocation to specific supplier invoices). EFT batch IDs from Triumph migrate as a custom ExtraField on llx_paiementfourn (efp_batch_id) because Dolibarr does not have a native EFT batch concept. Payment mode codes are pre-mapped against llx_c_paiement so that BPAY, EFT, and Cheque references resolve at insert time.
Triumph
Product / Inventory Item
Dolibarr ERP
Product (llx_product with fk_product_type=0)
1:1Triumph Inventory items map to Dolibarr llx_product with fk_product_type=0 (product). Product ref takes the Triumph item code; the customer code module (or sequential numbering) controls new product numbering only. Stock levels migrate into llx_product_stock keyed by warehouse (fk_entrepot), which must be pre-created since Triumph's single-location inventory becomes a single Dolibarr warehouse by default. We require modProduct and modStock both enabled before load and a default warehouse created in Setup > Inventory.
Triumph
Service Item
Dolibarr ERP
Product (llx_product with fk_product_type=1)
1:1Triumph service items (non-stock revenue items) map to Dolibarr llx_product rows with fk_product_type=1 (service). The tobatch and tosell/tobuy flags govern whether the service appears in customer quote lines, supplier order lines, or both. Service items do not require warehouse assignment or stock movement records, but they do still need accounting account links (accountancy_code_sell, accountancy_code_buy) when the accounting module is active.
Triumph
Quotation / Sales Quote
Dolibarr ERP
Customer Proposal (llx_propal)
1:1Triumph customer quotes migrate to Dolibarr llx_propal records with fk_statut representing the quote lifecycle (0=draft, 1=validated, 2=signed, 3=not signed, 4=billed). Line items load into llx_propaldet. We preserve the original Triumph quote number in the ref field and the original quote date in datep. The Proposals module (modPropale) must be enabled and a propal numbering mask configured before load.
Triumph
Sales Order
Dolibarr ERP
Customer Order (llx_commande)
1:1Triumph sales orders map to Dolibarr llx_commande. Order lines load into llx_commandedet, and the parent proposal link (fk_source_proposal) is set when the Triumph order originated from a quote and the quote also migrated. Order status maps from Triumph order state to Dolibarr fnstatut (0=draft, 1=validated, 2=shipped in process, 3=delivered, -1=cancelled). The Orders module (modCommande) is required.
Triumph
Purchase Order
Dolibarr ERP
Supplier Order (llx_commande_fournisseur)
1:1Triumph purchase orders map to Dolibarr llx_commande_fournisseur. Lines load into llx_commande_fournisseurdet. We preserve the Triumph PO number in ref_supplier where it represents the supplier-side reference and use ref for Dolibarr's internal numbering. PO approval workflow status maps to Dolibarr fk_statut values 0 through 7 covering draft, approved, ordered, received-partial, received-all, cancelled, and refused states.
Triumph
Stock Movement
Dolibarr ERP
Stock Movement (llx_stock_mouvement)
1:1Triumph inventory transactions (issues, receipts, adjustments) map to Dolibarr llx_stock_mouvement with type values 0 (input from order), 1 (output to order), 2 (manual correction), and 3 (manual transfer). The fk_origin and origintype fields link movements back to the originating document (commande_fournisseur, commande, facture). For historical movements where the originating Triumph document was not migrated, we leave origin null and tag the movement type as 2 (correction) with a label noting the source legacy reference.
Triumph
Bank Account
Dolibarr ERP
Bank Account (llx_bank_account)
1:1Triumph Bank Reconciliation accounts map to Dolibarr llx_bank_account rows. BSB and account number split into bank_code, code_guichet, number, and cle_rib fields per Dolibarr's banking schema. The accounting GL link (account_number) ties each bank account to its corresponding accounting account in llx_accountingaccount. Reconciliation status from Triumph migrates as a transaction-level flag on llx_bank (num_releve).
Triumph
Bank Transaction
Dolibarr ERP
Bank Entry (llx_bank)
1:1Triumph bank transactions map to Dolibarr llx_bank rows. Each bank entry carries amount, date (dateo for operation date, datev for value date), label, and reconciliation reference (num_releve). Where a Triumph bank transaction was reconciled to a customer receipt or supplier payment, the corresponding row in llx_bank_url links the bank entry to the related paiement or paiementfourn record.
Triumph
User / Operator
Dolibarr ERP
User (llx_user)
1:1Triumph operator records map to Dolibarr llx_user rows. We resolve the user by email match and require the customer's Dolibarr admin to confirm permission groups (modulepart, rights) before activation. Password values do not migrate; users receive a Dolibarr password reset link at cutover. Triumph operator codes preserve in an ExtraField (legacy_operator_code) for audit traceability against historical Triumph reports.
Triumph
Tax Code (GST)
Dolibarr ERP
VAT Rate (llx_c_tva)
1:1Triumph GST codes map to Dolibarr llx_c_tva rows scoped to the Australian country code. We pre-load the Australian VAT/GST rate set (10% GST, GST-free, Input-Taxed) before transactional migration so that invoice line tva_tx values resolve against valid llx_c_tva rows. For migrations where the destination Dolibarr is configured for a non-Australian country, we map Triumph GST codes to the destination country's equivalent VAT or sales tax codes per customer direction.
| Triumph | Dolibarr ERP | Compatibility | |
|---|---|---|---|
| Customer (Debtors module) | Third Party (llx_societe with client=1)1:1 | Fully supported | |
| Supplier (Creditors module) | Third Party (llx_societe with fournisseur=1)many:1 | Fully supported | |
| General Ledger Account | Accounting Account (llx_accountingaccount)1:1 | Fully supported | |
| Open Customer Invoice | Customer Invoice (llx_facture)1:1 | Fully supported | |
| Open Supplier Invoice | Supplier Invoice (llx_facture_fourn)1:1 | Fully supported | |
| Customer Payment / Receipt | Payment (llx_paiement + llx_paiement_facture)1:many | Fully supported | |
| Supplier Payment | Supplier Payment (llx_paiementfourn + llx_paiementfourn_facturefourn)1:many | Fully supported | |
| Product / Inventory Item | Product (llx_product with fk_product_type=0)1:1 | Fully supported | |
| Service Item | Product (llx_product with fk_product_type=1)1:1 | Fully supported | |
| Quotation / Sales Quote | Customer Proposal (llx_propal)1:1 | Fully supported | |
| Sales Order | Customer Order (llx_commande)1:1 | Fully supported | |
| Purchase Order | Supplier Order (llx_commande_fournisseur)1:1 | Fully supported | |
| Stock Movement | Stock Movement (llx_stock_mouvement)1:1 | Fully supported | |
| Bank Account | Bank Account (llx_bank_account)1:1 | Fully supported | |
| Bank Transaction | Bank Entry (llx_bank)1:1 | Fully supported | |
| User / Operator | User (llx_user)1:1 | Fully supported | |
| Tax Code (GST) | VAT Rate (llx_c_tva)1: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.
Triumph gotchas
Catalog website is wrong — triumphmotorcycles.com
Module-based architecture means data lives in module-specific tables
On-premise vs cloud deployment changes the extraction path
Australian supplier integrations are tenant-specific configuration
Dolibarr ERP gotchas
Foreign key constraint errors on cross-distribution database restore
SQL injection vulnerabilities in version 9.0.1
Custom fields stored as JSON in extraoptions require field-by-field deserialization
Decimal precision and rounding configuration affects price fields
No native iOS/Android app forces reliance on browser
Pair-specific challenges
Migration approach
Triumph extract scoping with module inventory
We catalogue every active Triumph module (Base Pack plus add-ons like Job Costing, Service Manager, Point of Sale, Asset Register) and build a per-module extract plan. Each module's data lives in its own set of Triumph tables, and the customer's report-writer license must cover the modules in scope. We confirm Triumph support engagement at the start because their turnaround on database-level extract requests directly drives the timeline. The deliverable from this step is a signed scoping document listing every Triumph module, every record type within each module, the extract method (report writer, DB export, or manual), and the volume estimate per object.
Dolibarr target provisioning and module activation
We confirm the Dolibarr target environment is provisioned correctly: PHP 8.1+ for current LTS, MariaDB 10.5+ or MySQL 8.0+ with utf8mb4 default character set and innodb_large_prefix enabled, document root and data root separated per Dolibarr install guide, and conf.php pointing at the right database. We then enable the required modules in dependency order: Companies/Contacts, Third Parties, Products & Services, Stock, Proposals, Customer Orders, Customer Invoices, Suppliers, Supplier Orders, Supplier Invoices, Bank, and the Double-Entry Accounting module. Each module activation creates the llx_ tables and ExtraField definitions we need for the inbound load.
Chart of accounts and reference data load
Reference data loads first: customer code masks, supplier code masks, payment terms (llx_c_payment_term), payment modes (llx_c_paiement), VAT/GST rates (llx_c_tva), countries (llx_c_country), currencies (llx_c_currencies), bank accounts (llx_bank_account), warehouses (llx_entrepot), and the chart of accounts (llx_accountingaccount under the active fk_pcg_version). We require this loaded and validated against the customer's accounting team before any transactional data load, because every transactional row carries lookup references to these tables and any unresolved foreign key fails the insert.
Third Party (customer + supplier) load with merge resolution
We load Third Parties next, applying the Debtors/Creditors merge worksheet that the customer signed off on. Each llx_societe row receives the correct client flag (0=no, 1=customer, 2=prospect, 3=customer+prospect) and fournisseur flag (0 or 1), plus payment terms, payment modes, and accounting account references. Custom Triumph fields land in llx_societe_extrafields with the ExtraField definitions pre-created in step 2. We validate row counts against the Triumph extract and run a sample of 50 random records through the Dolibarr UI to confirm rendering.
Product, service, and stock load
Products and services load next, with stock movements following once products are validated. We split product types (fk_product_type=0 for stocked products, fk_product_type=1 for services), set accounting links (accountancy_code_sell, accountancy_code_buy) per the chart-of-accounts mapping, and create the warehouse(s) before stock movement rows are inserted. Stock movements (llx_stock_mouvement) preserve original Triumph dates and quantities, and where the originating Triumph document was not in migration scope we mark the movement type=2 (correction) with a legacy reference label. Final llx_product_stock balances are recomputed from movements to confirm matching ending balances.
Open AR, open AP, and payment allocation load
Transactional data loads in dependency order: customer invoices (llx_facture + llx_facturedet) before customer payments (llx_paiement + llx_paiement_facture); supplier invoices (llx_facture_fourn + llx_facture_fourn_det) before supplier payments (llx_paiementfourn + llx_paiementfourn_facturefourn). Bank entries (llx_bank) load against pre-created bank accounts. We preserve original invoice numbers in ref, original invoice dates in datef, and original payment allocations as separate rows in the link tables rather than collapsing to one allocation per payment. Aging reports run in Dolibarr at end of this step must reconcile to the Triumph aging extract at cutover date.
Reconciliation, UAT, and cutover
Reconciliation compares record counts and key totals between source Triumph extracts and destination Dolibarr tables (Third Party count, open AR sum, open AP sum, bank balances, inventory value, GL trial balance). The customer runs UAT against a list of 25-40 standard workflows (raise invoice, record payment, run aging, post journal). Cutover schedules a final delta extract from Triumph for any records created since the initial extract, loads the delta into Dolibarr, and the customer issues a freeze notice on the Triumph instance. Post-cutover support covers two weeks of reconciliation questions; we do not provide ongoing admin or workflow rebuild.
Platform deep dives
Triumph
Source
Strengths
Weaknesses
Dolibarr 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 Triumph and Dolibarr 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
Triumph: Not publicly documented.
Data volume sensitivity
Triumph 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 Triumph to Dolibarr ERP migration scoping. Not seeing yours? Book a call.
Walk through your Triumph to Dolibarr 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 Triumph
Other ways to arrive at Dolibarr 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.