ERP migration

Migrate from Triumph to Dolibarr ERP

Field-level mapping, validation, and rollback between Triumph and Dolibarr ERP. We move data and schema; workflows are rebuilt natively in Dolibarr ERP.

Triumph logo

Triumph

Source

Dolibarr ERP

Destination

Dolibarr ERP logo

Compatibility

82%

14 of 17

objects map 1:1 between Triumph and Dolibarr ERP.

Complexity

BStandard

Timeline

5-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Triumph logo

Triumph

What's pushing teams away

  • Australian-focused vendor — international expansion (multi-currency intercompany, multi-jurisdiction tax, IFRS-heavy reporting) reaches its ceiling quickly compared with NetSuite, SAP Business One, or Microsoft Dynamics 365 Business Central.
  • Smaller installed base means fewer third-party consultants, fewer pre-built add-ons, and a thinner job market for in-house Triumph admins.
  • Pricing is sales-led and not openly published; comparison shopping against transparent SaaS ERPs is harder.
  • API/web-services connectivity is advertised but not documented through a public developer portal, limiting self-serve integration projects.
  • Catalog website mismatch — FlitStack records triumphmotorcycles.com (the British motorcycle brand). The real ERP product lives at triumph.com.au.

Choosing

Dolibarr ERP logo

Dolibarr ERP

What's pulling them in

  • Free open-source core with no per-user license fee makes it the lowest-cost entry point for small teams needing ERP and CRM in one package.
  • Self-hosted deployment gives full data ownership and eliminates vendor lock-in, especially attractive to businesses with compliance requirements.
  • Modular architecture means teams enable only the features they use, keeping the interface uncluttered and reducing learning curve.
  • Fast installation with no technical knowledge required — one reviewer set up multiple businesses in minutes using their own hosting.
  • Active community forum and marketplace of third-party add-ons provide support and extension options without mandatory subscription costs.

Object mapping

How Triumph objects map to Dolibarr ERP

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)

maps to

Dolibarr ERP

Third Party (llx_societe with client=1)

1:1
Fully supported

Triumph 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)

maps to

Dolibarr ERP

Third Party (llx_societe with fournisseur=1)

many:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Accounting Account (llx_accountingaccount)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Customer Invoice (llx_facture)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Supplier Invoice (llx_facture_fourn)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Payment (llx_paiement + llx_paiement_facture)

1:many
Fully supported

Triumph 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

maps to

Dolibarr ERP

Supplier Payment (llx_paiementfourn + llx_paiementfourn_facturefourn)

1:many
Fully supported

Triumph 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

maps to

Dolibarr ERP

Product (llx_product with fk_product_type=0)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Product (llx_product with fk_product_type=1)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Customer Proposal (llx_propal)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Customer Order (llx_commande)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Supplier Order (llx_commande_fournisseur)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Stock Movement (llx_stock_mouvement)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Bank Account (llx_bank_account)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

Bank Entry (llx_bank)

1:1
Fully supported

Triumph 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

maps to

Dolibarr ERP

User (llx_user)

1:1
Fully supported

Triumph 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)

maps to

Dolibarr ERP

VAT Rate (llx_c_tva)

1:1
Fully supported

Triumph 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.

Gotchas + challenges

What specifically takes care here

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 logo

Triumph gotchas

High

Catalog website is wrong — triumphmotorcycles.com

Medium

Module-based architecture means data lives in module-specific tables

Medium

On-premise vs cloud deployment changes the extraction path

Low

Australian supplier integrations are tenant-specific configuration

Dolibarr ERP logo

Dolibarr ERP gotchas

High

Foreign key constraint errors on cross-distribution database restore

High

SQL injection vulnerabilities in version 9.0.1

Medium

Custom fields stored as JSON in extraoptions require field-by-field deserialization

Medium

Decimal precision and rounding configuration affects price fields

Low

No native iOS/Android app forces reliance on browser

Pair-specific challenges

  • Triumph has no public API for extraction

    Triumph publishes no developer documentation, no REST or SOAP endpoint, and no bulk export tool beyond the in-application report writer. Migration extraction relies on (a) report-writer queries authored against each Triumph module, (b) a coordinated database backup obtained through Triumph support, or (c) screen-scraping for objects the report writer cannot reach. We schedule the Triumph extract authoring as a two-to-three-week phase before any Dolibarr work begins, with Triumph support engagement booked in advance because turnaround on database access requests is not within our control.

  • Dolibarr MariaDB key-length errors on upgrade

    Dolibarr's recruitment table upgrade (introduced around v13) creates a unique index uk_recruitmentcandidature_email_msgid that exceeds MariaDB's default 767-byte key-length limit on utf8 character sets, producing DB_ERROR_1071 during schema upgrades. We verify the target Dolibarr instance is on utf8mb4 with innodb_large_prefix enabled and innodb_file_format=Barracuda before loading any data, otherwise the customer hits the same upgrade error documented in Dolibarr GitHub issue #16315 the first time they try to update Dolibarr post-migration.

  • Debtors and Creditors collapse into one Third Party

    Triumph keeps Debtors and Creditors as separate modules with independent record sets, so an entity that is both a customer and a supplier exists twice (once in each module). Dolibarr stores both roles in one llx_societe row with client and fournisseur flags. We run a fuzzy-match pass on ABN, email, and trading name to identify duplicates and produce a merge worksheet for the customer to sign off on before commit. Any merged record carries both customer-side and supplier-side history, which changes the reporting baseline.

  • Closed Triumph ledger periods require unlock coordination

    Triumph stores historical financial data in closed ledger periods that the user-level interface cannot re-open without finance-team coordination. Extracting full historical GL data requires either (a) the customer's finance team temporarily unlocking periods through Triumph admin, or (b) Triumph support running a database-level extract. We sequence this as a defined task with the customer's accountant so that period-unlock windows align with our extract schedule and do not impact month-end close in the live Triumph instance during the migration window.

  • Dolibarr custom fields require ExtraField pre-creation

    Any Triumph custom field introduced by an optional module (Job Costing job codes, Service Manager ticket numbers, custom Debtor categories) does not have a native Dolibarr equivalent. We map these to Dolibarr ExtraFields on the target object (llx_societe_extrafields, llx_facture_extrafields, llx_product_extrafields) and pre-create the ExtraField definitions in Setup > Modules > Customer/Third Party/Invoice ExtraFields before load. Without pre-creation, the data lands in columns Dolibarr will not display in the UI, even though the underlying SQL insert succeeds.

Migration approach

Six steps for a successful Triumph to Dolibarr ERP data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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

Context on both ends of the pair

Triumph logo

Triumph

Source

Strengths

  • 30+ year Australian-owned vendor with deep local SMB focus.
  • Modular pricing lets customers pay only for the modules they use.
  • Both cloud and on-premise deployment options.
  • Pre-built integrations with major Australian wholesale suppliers.
  • Strong vertical depth across retail, manufacturing, agriculture, and trades.

Weaknesses

  • Australian-only focus limits international expansion fit.
  • Smaller installed base means fewer consultants and add-ons.
  • Pricing is sales-led and not publicly disclosed.
  • API access exists but is not documented through a public portal.
  • Catalog entry website mismatched — risks confusion with the motorcycle brand.
Dolibarr ERP logo

Dolibarr ERP

Destination

Strengths

  • Free core software with AGPL license and no per-user mandatory fee for self-hosted deployments.
  • Modular architecture lets teams activate only needed features, keeping the interface focused and the database lean.
  • Self-hosted option provides full data sovereignty and avoids recurring SaaS subscription costs.
  • Built-in CSV/Excel import and export wizard with saved profiles simplifies recurring data operations.
  • Low-code Module Builder allows functional extensions without writing PHP code.

Weaknesses

  • No native documented REST API for programmatic bulk operations — all migrations depend on the import/export wizard or direct database access.
  • Reporting and analytics are weak without paid add-ons, and built-in charts are limited compared to modern SaaS platforms.
  • UI design is described as dated by multiple reviewers, with infrequent visual updates to the default theme.
  • Community-only support for self-hosted deployments means no SLA or guaranteed response time for issues.
  • Security vulnerabilities (CVE-2024-5314, CVE-2024-5315) in version 9.0.1 with no immediate patch reported.

Complexity grading

How hard is this migration?

Standard ERP migration. 2 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Triumph and Dolibarr ERP.

  • Object compatibility

    B

    2 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Triumph: Not publicly documented.

  • Data volume sensitivity

    B

    Triumph doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Triumph to Dolibarr ERP migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Triumph to Dolibarr ERP data migrations

Answers to the questions buyers ask most during Triumph to Dolibarr ERP migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Five to eight weeks for a single-entity migration with under 5,000 third parties, under 10,000 open AR and AP records, one warehouse, and only the Triumph Base Pack modules in scope. Ten to sixteen weeks for migrations covering multiple Triumph modules (Job Costing, Service Manager, Point of Sale, Asset Register), more than 200,000 ledger entries, or a self-hosted Dolibarr environment that the customer is provisioning in parallel. The Triumph extract phase tends to dominate the timeline because Triumph publishes no API and database-level extracts require Triumph support coordination, which is not within our scheduling control.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Triumph.
Land in Dolibarr ERP, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day